PHP注册表单不插入

标签 php mysql

我正在开发一个您可以注册的网站。现在我知道在处理用户输入时必须使用准备好的语句。

现在是我的问题。在此注册表单上,当我尝试注册时,查询未执行,但我也没有收到任何错误。我在查询中试过反勾,没有反勾。但是没有用(不然我也不会问这个问题了:P)。

有人可以说我是否使用了正确的方法来检查查询是否成功?

这是 HTML 表单:

<form id="register" action="Register.php" name="register" method="post">

     <table>
            <tr>
                <td>
                    <label id="lblUsername">Username</label>
                </td>
                <td>
                    <input type="text" id="txtUsername" name="username" required>
                </td>
            </tr>
            <tr>
                <td>
                    <label id="lblEmail">Email</label>
                </td>
                <td>
                    <input type="text" id="txtEmail" name="email" required>
                </td>
            </tr>
            <tr>
                <td>
                    <label ID="lblPass">Password</label>
                </td>
                <td>
                    <input type="password" name="password" ID="txtPassword" required>
                </td>
            </tr>
            <tr>
                <td>
                    <label ID="lblConfPass">Herhaal password</label>
                </td>
                <td>
                    <input type="password" name="confpass" ID="txtconfpass" required>
                </td>
            </tr>

            <tr>
                <td><label id="lblVnaam">Voornaam:</label></td>
                <td><input name="vnaam" type="text" required></td>
            </tr>
            <tr>
                <td><label id="lblAnaam">Achternaam:</label></td>
                <td><input name="anaam" type="text" required></td>
            </tr>    
        </table>
        <input type="submit" name="submit" value="Registreren" required>
        <br />
</form>

这是 PHP 部分:

error_reporting(E_ALL);
ini_set('display_errors', -1);

if(isset($_POST['submit']))
{

$host = "localhost";
$username = "root";
$password = "password";
$dbname = "mijnwebsite";

$conn = new mysqli($host,$username,$password,$dbname);


if($conn->connect_errno)
{
    die('Unable to connect to the database. [' . $conn->connect_error . ']');
}



$errors = array();
$data = array();
$fname = $_POST['vnaam'];
$lname = $_POST['anaam'];
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$confpass = $_POST['confpass'];
$password_hash = crypt($password);

$stmt = $conn->prepare("INSERT INTO `User`(`Fname`, `Lname`, `Email`, `Username`, `Password`) VALUES(?,?,?,?,?)");

$stmt->bind_param("sssss", $fname, $lname, $email, $username, $password_hash);

if(!$stmt->execute())
{
    die("Kon query niet uitvoeren. " . $stmt->error);
}
else
{
    echo '<script type="text/javascript">alert ("Registratie gelukt! klik op oke om door te gaan.");</script>'; 
}

}

?>

注意:我将验证输入,但现在我只想能够插入。

先谢谢大家了。另外如果有什么需要补充的请留言。

编辑:我已经更改了错误报告。这就是我没有收到任何错误的原因。我得到的错误是:

Fatal error: Call to undefined function password_hash() in /var/www/Register.php on line 140

编辑 2:根据 Fred -ii- 在这里回答我将发布我的数据库结构 dbstructure

编辑 3: 现在我在准备查询时将反勾添加到用户名的末尾,并且我添加了此 if(!$stmt->execute()){trigger_error( “出现错误...”。$conn->error, E_USER_WARNING);} 我得到一个不同的错误。

Fatal error: Call to a member function bind_param() on a non-object in /var/www/Register.php on line 146

注意 4: 我已经更新了代码以匹配 @Fred-ii- 的答案以及目前正在运行的代码。我要感谢所有抽出时间帮助我的人。

最佳答案

根据您在编辑中的错误。

Fatal error: Call to undefined function password_hash() in /var/www/Register.php on line 140

给你。您的 PHP 版本不支持该功能。您需要使用密码兼容包。

https://github.com/ircmaxell/password_compat

您还可以考虑使用 crypt() http://php.net/manual/en/function.crypt.php

  • 确保密码列的长度足以容纳哈希值。最安全的方法是 VARCHAR(255)

您在 display_error 中也有(曾经)错字,需要在 display_errors 中加上“s”。 (您现在在问题中对其进行了编辑)https://stackoverflow.com/posts/34567204/revisions

根据手册 http://php.net/manual/en/function.error-reporting.php

编辑:

根据 Chris G 的评论,您缺少 Username 列的勾号

(`Fname`, `Lname`, `Email`, `Username, `Password`)
                                     ^ right there.

感谢 Chris

(`Fname`, `Lname`, `Email`, `Username`, `Password`)

一旦您的代码与您能够使用的密码哈希函数一起工作,查询 http://php.net/manual/en/mysqli.error.php 的错误检查就会发出错误信号。

但是,我会替换

if(!$stmt->execute())

if(!$stmt->execute()){trigger_error("出现错误....".$conn->error, E_USER_WARNING);}

这可能更适合你。

编辑#2:

我现在才注意到的另一件事;您在查询中的列名和屏幕截图的列名似乎在名称上不匹配。

  • voornaamachternaam 以及它们是否对应于我们查询中的 FnameLname

错误检查会向您抛出有关列不匹配/不存在和/或绑定(bind)数量不匹配的错误。

编辑 #3,取自聊天:

您的表名为 User,但您查询的表是带“s”的 Users。

截图:http://i.stack.imgur.com/YfNJY.jpg

因此错误为:

Fatal error: Call to a member function bind_param() on a non-object in /var/www/Register.php on line 146

  • 你选错了 table 。

关于PHP注册表单不插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34567204/

相关文章:

php - 如何获取从 MySQL 查询检索到的文档/对象总数?

python - "pip freeze"给出了与 "help(' 模块不同的模块 ')"

php - Eloquent其中连接多个表

php - 在 Codeigniter 中显示嵌套列表

javascript - 如何将一部分图像转换为可点击按钮?

php - 在 PHP 中将工作日设置为德语

c# - Mysql 没有出现在 Visual Studio 2017 的 "Choose Data Source"中

mysql - sql 如果存在则更新否则插入不工作

php - 使用 DBAL 代替 $this->addSql 的 Doctrine2 迁移

php - 从 Guzzle 中捕获异常