为什么数据没有插入数据库?

yfwxisqw  于 2021-06-25  发布在  Mysql
关注(0)|答案(4)|浏览(438)

我用下面的代码做了一张报名表。正如您在图片底部看到的,最后一行显示header(“location:../signup.php?signup=success”);退出();当我尝试注册时,顶部的url显示signup=success。但当我进入数据库时,数据没有被插入。
请帮助我:(我检查了名称/变量的拼写错误,但没有。我还检查了链接/连接,我相信它是正确的。表单正确链接到正确的php文件,该文件在下面。

  1. <?php
  2. if(isset($_POST['submit'])) {
  3. include_once 'dbh.inc.php';
  4. $first = $_POST['first'];
  5. $last = $_POST['last'];
  6. $email = $_POST['email'];
  7. $uid = $_POST['uid'];
  8. $pwd = $_POST['pwd'];
  9. if (empty($first) || empty($last) || empty($email) || empty($uid) || empty($pwd)) {
  10. header("Location: ../signup.php?signup=empty"); exit();
  11. }
  12. else {
  13. if (!preg_match("/^[a-zA-z]*$/", $first) || !preg_match("/^[a-zA-z]*$/", $last)) {
  14. header("Location: ../signup.php?signup=flnameinvalid"); exit();
  15. }
  16. else {
  17. if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  18. header("Location: ../signup.php?signup=emailinvalid"); exit();
  19. }
  20. else{
  21. $mysql = "SELECT * FROM users WHERE user_uid='uid'";
  22. $result = mysqli_query($conn, $mysql);
  23. $resultCheck = mysqli_num_rows($result);
  24. if ($resultCheck > 0) {
  25. header("Location: ../signup.php?signup=uidtaken"); exit();
  26. }
  27. else {
  28. $hashedPwd = password_hash($pwd, PASSWORD_DEFAULT);
  29. $sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') VALUES (?, ?, ?, ?, ?);";
  30. $stmt = mysqli_stmt_init($conn);
  31. if (!mysqli_stmt_prepare ($stmt, $sql)){
  32. echo "SQL error!";
  33. }
  34. else {
  35. mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
  36. mysqli_stmt_execute ($stmt);
  37. }
  38. header("Location: ../signup.php?signup=success"); exit();
hgc7kmma

hgc7kmma1#

代码看起来不错,发现了一个问题。更换此线路

  1. mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);

具有

  1. mysqli_stmt_bind_param ($stmt, "sssd", $first, $last, $email, $uid, $hashedPwd);

下面是php的官方文档表单。你可以用例句核对公文

krcsximq

krcsximq2#

乍一看,我注意到你说你已经改正的列名不对。所以错误可能在这一部分:

  1. if (!mysqli_stmt_prepare ($stmt, $sql)){
  2. echo "SQL error!";
  3. } else {
  4. mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
  5. mysqli_stmt_execute ($stmt);
  6. }

试试这个:

  1. if (mysqli_stmt_prepare ($stmt, $sql)){
  2. mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
  3. mysqli_stmt_execute ($stmt);
  4. header("Location: ../signup.php?signup=success");
  5. } else {
  6. echo "SQL error!";
  7. }
  8. exit();
展开查看全部
anauzrmj

anauzrmj3#

为什么在post请求中接受uid,通常会根据数据库自动确定(增量等)。
老实说,您需要重新编写大量代码,因为您的代码完全易受攻击,所以不会有一个解决方案。
记住只接受您需要的输入,顺便说一句,如果我要编辑我的uid,除了能够发送任何我喜欢的uid外,我还可以使其成为恶意负载,如:

  1. 10000; DROP TABLE users;

它应该给我10000的uid,并且删除整个用户表,所以我给自己一个很棒的uid并不重要,因为现在整个表都被删除了。也可以这样转储整个数据库 10000; SELECT * FROM users; 不确定这些查询是否特别有效,但它们是易受攻击的。
我知道这并不能完全回答您的问题,但我建议您重新编写大部分代码并使用良好的实践。
顺便说一句,您很可能得到了重定向,因为如果您启动初始的isset($\u post['submit']),然后点击每一条else语句,您就会收到成功消息。

z9smfwbn

z9smfwbn4#

  1. $sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd')
  2. VALUES (?, ?, ?, ?, ?);";

在sql语句中,密码的列名设置为哈希密码的值。这将导致sql查询失败。

  1. $sql = "INSERT INTO users (user_first, user_last, user_email,
  2. user_uid, whateverthiscolumnnameis)
  3. VALUES (?, ?, ?, ?, ?);";

您需要表中列的名称。只要替换一下 whateverthiscolumnnameis 表中密码列的名称。
编辑:
正如cillian collens所指出的,您确实应该清理您在其他查询中的输入和/或使用准备好的语句来抵御典型的sql注入攻击。

相关问题