我正在尝试创建一个登录页面,但是我在使用预准备语句来保护登录时遇到了一些问题。我有以下代码:
$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
变量仍然返回0.我猜它与准备好有关声明。
答案 0 :(得分:1)
在获取结果之前,客户端不知道结果中有多少行。
您可以使用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"。
但是如果你确实使用了商店结果,出于某种原因你也不能使用get-result。所以你不能使用像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();