我正在一个你可以注册的网站上工作.现在我知道在处理用户输入时你必须使用预准备语句.
现在我的问题.在我尝试注册查询时,在此注册表单上没有执行,但我也没有收到任何错误.我在查询中尝试了回滴答,没有后退滴答.但无济于事(否则我不会问这个问题:P).
有人可以说我是否使用正确的方法来检查查询是否成功?
这是HTML表单:
这是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 ''; } } ?>
注意:我将验证输入,但现在我只想插入.
提前谢谢你们.如果有需要添加的内容请发表评论.
编辑:我更改了错误报告.这就是我没有得到任何错误的原因.我得到的错误是:
致命错误:在第140行的/var/www/Register.php中调用未定义的函数password_hash()
编辑2:按照Fred -ii-在这里回答我将发布我的数据库结构
编辑3:现在我在准备查询时将后面的勾号添加到用户名的末尾,我添加了这个,if(!$stmt->execute()){trigger_error("There was an error....".$conn->error, E_USER_WARNING);}
我得到了一个不同的错误.
致命错误:在第146行的/var/www/Register.php中调用非对象的成员函数bind_param()
注4:我已更新代码以匹配@ Fred-ii-的答案以及现在正在进行的工作.我要感谢所有抽出时间帮助我的人.
根据编辑中的错误.
致命错误:在第140行的/var/www/Register.php中调用未定义的函数password_hash()
你去吧 您的PHP版本不支持该功能.您需要使用密码兼容包.
https://github.com/ircmaxell/password_compat
您还可以使用http://php.net/manual/en/function.crypt.php查看crypt()
确保密码列足够长以容纳哈希值.最安全的是VARCHAR(255)
.
你也有(有)一个拼写错误display_error
,需要display_errors
与"s".(您现在在问题中编辑过)/sf/ask/17360801/.
根据手册http://php.net/manual/en/function.error-reporting.php
编辑:
根据Chris G的评论,你的Username
列中缺少一个标记
(`Fname`, `Lname`, `Email`, `Username, `Password`) ^ right there.
荣誉给克里斯
(`Fname`, `Lname`, `Email`, `Username`, `Password`)
检查http://php.net/manual/en/mysqli.error.php时出错,一旦您的代码使用了您可以使用的密码散列函数,就会发出错误信号.
但是,我会替换
if(!$stmt->execute())
同
if(!$stmt->execute()){trigger_error("There was an error....".$conn->error, E_USER_WARNING);}
这对你来说可能更好.
编辑#2:
我刚才注意到的另一件事; 查询中的列名称和屏幕截图的列名称似乎与名称不匹配.
voornaam
以及achternaam
它们是否Fname
与Lname
我们的查询相对应.
错误检查会抛出有关列不匹配/不存在的错误,和/或绑定数不匹配.
编辑#3,取自聊天:
您的表名为User,但您的查询表是具有"s"的用户.
截图:http://i.stack.imgur.com/YfNJY.jpg
因此错误:
致命错误:在第146行的/var/www/Register.php中调用非对象的成员函数bind_param()
你选错了桌子.