为什么这个 SQL 更新准备语句不起作用?

问题描述 投票:0回答:1

我正在学习 PHP,但遇到了困难。 我正在制作一个遵循以下步骤的注册/登录系统:

  1. 要注册,新用户需要输入显示名称、电子邮件和密码。
  2. 提交该表单后,PHP 脚本将运行准备好的语句过程(INSERT 语句),在用户表中创建一个新条目。
  3. 然后,脚本将 $email 的值作为 POST 数据传递到下一页,新用户在下一页中做出几个选择。 当新用户的帐户刚刚创建时,用户会将这两个选择视为注册过程的一部分。 这两个选择对应于作为POST 数据integer_1 和integer_2 传递到下一个文件的两个整数。 电子邮件地址也会作为 POST 数据传递到下一个文件。
  4. 下面的PHP文件应该将POST数据email、integer_1和integer_2分配给变量$email、$integer_1和$integer_2,然后运行一个准备好的语句过程来更新用户表,将列integer_1和integer_2设置为其变量值,其中email 列与 $email 匹配。 我无法获取下面的 PHP 文件来影响/更新数据库中的任何行。 我没有收到任何错误。
<?php

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

    require 'database_connection.inc.php';

    $email = $_POST['email'];
    $integer_1 = $_POST['integer_1'];
    $integer_2 = $_POST['integer_2'];

    $sql = "UPDATE users SET integer_1=? AND integer_2=? WHERE email=?";

    $stmt = mysqli_stmt_init($conn);

    if (!mysqli_stmt_prepare($stmt, $sql)) {
        header("Location: ../signup.php?error=sqlerror");
        exit();
    }

    else {
        mysqli_stmt_bind_param($stmt, "iis", $integer_1, $integer_2, $email);
        mysqli_stmt_execute($stmt);
        header("Location: ../login.php?initial_login");
        exit();
    }

    mysqli_stmt_close($stmt);
    mysqli_close($conn);

}

else {
    header("Location: ../signup.php");
    exit();
}

我已经尝试过:

  • 注释掉脚本并让文件仅回显 $email、$integer_1 和 $integer_2 的值。 这有效。 回显的值正是我所期望的。
  • 在 SQL 语句的最后一个问号后面加上分号
  • 将 SQL 语句的问号放在单引号中
  • 将 SQL 输入 MyAdmin。 如果我直接在 MyAdmin 中输入 SQL 语句,用实际数据替换问号,它仍然不会影响任何行。 有一次在尝试这个时,我确实得到了它来更新条目。 我不记得该声明是如何编写的详细信息,但我知道导致成功更新的区别是在电子邮件地址周围添加单引号。 然后,我尝试让我准备好的声明在电子邮件地址周围加上单引号,但没有任何效果。 现在,当直接在 MyAdmin 中输入 UPDATE 语句时,我无法获得相同的成功结果。

感谢您能给我的任何帮助。

php sql mysql sql-update
1个回答
0
投票

如果不存在具有指定电子邮件地址的记录,则此 UPDATE 查询将无效:

$sql = "UPDATE users SET integer_1=? AND integer_2=? WHERE email=?";

如果这是一个注册表单(从您的原始帖子中不清楚),那么您可能想尝试使用插入语句。考虑查看有关准备好的报表的文档

$sql = "INSERT INTO users (integer_1, integer_2, email) VALUES (?, ?, ?)";

使用准备好的语句确实有助于防止 SQL 注入,但在将 POST 输入直接塞入 SQL 语句之前,您没有费心去验证任何 POST 输入。这是让数据库表充满垃圾的必然方法。例如,您可以尝试确保提供的电子邮件地址实际上是一个电子邮件地址,而不仅仅是一些随机字符串:

$email = $_POST['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  throw new Exception("$email is not a valid email address");
}

您还应该检查

mysqli_stmt_bind_param
mysqli_stmt_execute
的返回值,而不是仅仅假设这些语句成功。

© www.soinside.com 2019 - 2024. All rights reserved.