为什么这个 mysqli_stmt_num_rows 函数返回 0?

Why is this mysqli_stmt_num_rows function returning 0?

我正在尝试创建登录页面,但在使用准备好的语句来保护登录时遇到了一些问题。我有以下代码:

$sql = "SELECT * FROM users WHERE user_email=?";
$stmt = mysqli_stmt_prepare($db, $sql);
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$resultCheck = mysqli_stmt_num_rows($stmt);

检查结果检查变量是否小于1时出现问题。它不应该是0,但它是。我不明白为什么,因为数据库有一封电子邮件,其值为 test@test.com,但是当尝试输入该值时,$resultCheck 变量仍然是 returns 0。我猜它必须处理准备好的陈述。

在获取结果之前,客户端不知道结果中有多少行。

您可以使用 mysqli_stmt_store_result() 让客户端预取结果的所有行。然后你可以使用num-rows。

$sql = "SELECT * FROM users WHERE user_email=?";
$stmt = mysqli_prepare($db, $sql);
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$resultCheck = mysqli_stmt_num_rows($stmt);

echo "result num_rows = $resultCheck\n";

这个回显正确地产生了答案“1”。

但是如果您使用存储结果,出于某种原因您不能同时使用获取结果。所以你不能使用像 fetch_assoc 这样的结果方法——你必须通过引用 bind_result 到变量中并使用 fetch().

顺便说一句,mysqli_stmt_prepare() 将语句对象作为其第一个参数,而不是 $db 连接。而 mysqli_prepare() 需要一个连接对象。同样,mysqli 函数的用法令人困惑。


我不喜欢 mysqli。它很难使用,并且有令人困惑的无法解释的行为陷阱。我不喜欢 bind_param 和 bind_result 让我的代码看起来很混乱。

我更喜欢使用 PDO。简单多了。

$sql = "SELECT * FROM users WHERE user_email=?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$email]);
$result = $stmt->fetchAll();
$rowCount = $stmt->rowCount();