php - 无法使用我的 HTML 注册表单 : UPDATED CODE 发布到我的 Mysql 数据库

标签 php html mysql

所以我正在尝试为我的网站创建注册表单,并使用 phpmyadmin 使用 SQL 数据库。我对如何创建 PHP 文件进行了大量研究,该文件将在创建用户帐户后将用户添加到我的数据库中。据我所知,我有正确的执行和代码,但是当我访问我的网站时,创建一个用户并转到我的 phpmyadmin 检查我的数据库表以查看是否创建了用户..它不是。下面我将包括我的连接 php 文件代码以及我的 register.php 文件。在这一点上,我不知道我的代码有什么问题,在我的网站上创建一个帐户后,我的代码实际上没有发布和数据到数据库。

下面是我更新的 dbconnect.php 文件,它包含在我的 register.php 中

    <?php 

/*** mysql hostname ***/
$hostname = 'localhost';
/*** mysql username ***/
$username = '******';
/*** mysql password ***/
$password = '******';



try {
function testdb_connect (){
    $dbh = new PDO("mysql:host=$hostname;dbname=*******", $username, $password);
return ($dbh);
}
$dbh = testdb_connect();
}
catch(PDOException $e) {
    echo $e->getMessage();
}

?>

这是 register.php 的更新 PHP 部分:

      <?php
session_start();
if(isset($_SESSION['User']))
{
 header("Location: home.php");
}
include_once 'dbconnect.php';

if(isset($_POST['submit']))
{
$uname = $_POST['uname'];
$email = $_POST['email'];
$upass = $_POST['upass'];

}
 $stmt = $dbh->prepare("SELECT COUNT(*) as `emailcount` FROM `User` WHERE email=:email");
 $stmt->execute(array("email" => $_POST['email']));
 $row = $stmt->fetch(PDO::FETCH_ASSOC);

if ($row['emailcount'] > 0) {
    echo "<script>alert('Email $email already exists in our system. Please try another email')</script>";
}


    $stmt = $dbh->prepare("INSERT INTO User(`uname`, `email`, `upass`) VALUES (:uname, :email, :upass)");

    $stmt->execute(array("uname" => $_POST['uname'], "email" => $_POST['email'], "upass" => md5($_POST['upass'])));






?>

这里是更新的 HTML 表单,它创建了用户帐户并且应该 POST 到我的数据库表:

    <form method='post' action='register.php'>
                <pre>
                <div>
            <label>Name : (letters only)*</label>
<input type="text" name="uname" pattern="[A-Za-z]+" title="only letters" required />
</div>

<div>
<label>E-mail : (xyz@zyx.com)*</label>
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" title="xyz@something.com" required />
</div>


<div>
<label>password : (at least 6 chars)</label>
<input type="password" name="upass" pattern=".{6,}" title="Six or more characters" required />
</div>



<input type='submit' name='submit' value='Sign Up'>
</pre>
</form>

最佳答案

这里有几处需要更改,让我们从您选择的 API 开始吧。

混合 API 和处理准备好的语句

这不是您可以在 PHP 中完成的事情。您的连接使用 PDO,而您的查询使用旧的和过时的 mysql_* 函数。我建议您编辑代码以反射(reflect)连接,而不是将连接更改为已弃用的 mysqli_*。您还应该使用准备好的语句。

因此,代替 $run = mysql_query($check_email); 行,您将执行类似这样的操作,它将使用您在连接代码中选择的 API,并利用准备好的陈述。

$stmt = $dbh->prepare("SELECT COUNT(*) as `emailcount` FROM `User` WHERE email=:email");
$stmt->execute(array("email" => $_POST['email']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if ($row['emailcount'] > 0) {
    echo "<script>alert('Email $email already exists in our system. Please try another email')</script>";
}

你的插入查询看起来像这样:

$stmt = $dbh->prepare("INSERT INTO User(`uname`, `email`, `upass`) VALUES (:uname, :email, :pass)");
$stmt->execute(array("uname" => $_POST['uname'], "email" => $_POST['email'], "pass" => md5($_POST['upass'])));

另请注意,您在表单中使用了 name="upass",但您的 PHP 使用了 $_POST['pass'],这是不同的,它们需要一样。

为您的连接调用函数

在您的连接文件中,您将 PDO 对象放在一个函数中,这很好,但是您需要调用它,或者在您需要文件之后,或者在连接文件本身中。

$dbh = testdb_connect();

编辑:根据评论,还发现了变量范围的另一个问题:

当您在函数外部为连接定义变量时,您还面临着一些变量范围 的问题。函数看不到这些变量,因为它们没有在函数内部定义、作为参数传递或成为全局变量。

我强烈建议您不要使用 global 变量,而是将它们作为参数传递或在函数内部定义它们。下面的这个例子已经被修改为在函数内部定义它们。

<?php 
// Define a function for the PDO object
function testdb_connect() {
    try {
        /*** mysql hostname ***/
        $hostname = 'localhost';
        /*** mysql username ***/
        $username = '--------';
        /*** mysql password ***/
        $password = '------';

        $dbh = new PDO("mysql:host=$hostname;dbname=databasename", $username, $password);
        return $dbh;
    } catch(PDOException $e) {
        echo $e->getMessage();
    }
}

$dbh = testdb_connect(); // call the function, create the connection
?>

您在评论中提供的错误表明该对象未创建,现在应该使用上述代码修复。我还对其进行了一些重组,将 try/catch block 放在更合适的位置。

您的提交按钮

这主要是什么都没发生的原因。您的提交按钮没有名称、属性,而是两个值。这意味着行 if(isset($_POST['submit'])) 永远不会为真,因为没有具有该名称的输入元素。

代替

<input type='submit' value='submit' value='Sign Up'>

应该是这样的

<input type='submit' name='submit' value='Sign Up'>

isset 的误报

if(isset($_SESSION['User'])!="") 会给你一个误报,因为 isset() 返回一个 bool 值 (true/false),永远不会等于空字符串。

它应该是 if (isset($_SESSION['User'])) {,只有当他登录时才会重定向用户。

附加说明

通过上述更改,您对空电子邮件/密码的检查应该略有更改,因为我们将不再需要您注释掉的行(因为那些使用旧的 mysql_real_escape_string() 并且我们'将改用 PDO,因此它们未定义):

if (empty($_POST['uname'])) {
    echo "<script>alert('Please Enter Your name')</script>";
    exit();
}
if (empty($_POST['email '])) {
    echo "<script>alert('Please Enter Your Email')</script>";
    exit();
}

额外的阅读 Material

关于php - 无法使用我的 HTML 注册表单 : UPDATED CODE 发布到我的 Mysql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37018224/

相关文章:

html - 响应式设计布局

javascript - 更新数据表中的特定按钮 HTML

html - div居中组

mysql - 我无法让 mysql 和 phpmyadmin 与 Laradock 一起使用,我在这里推荐了所有选项

php - 如何使用嵌套列的 with() 方法和 where() 方法?

php - mySQL 多个 WHEN 列时的情况

javascript - 如何根据访客推荐使用 Javascript(或 PHP)将值插入到表单中

php - Laravel 5 更新所有 Pivot 条目

mysql - 如何在mysql中获取语法错误的具体描述

mysql - 查找 SQL 查询中的单词是否在子查询中