mysqli预处理语句num_rows函数

3

这是我第一天在MYSQLi工作(从mysql转换过来),我在登录脚本中遇到了一些问题,需要检查重复的电子邮件:

以下是我的代码:

$email = mysqli_escape_string($_POST['email']);

$stmt=$mysqli->prepare("SELECT username from users WHERE email=?");
$stmt->bind_param('s',$email);
$stmt->execute(); 
$nrows1=$mysqli->num_rows;
echo $nrows1;
$stmt->close();

if ($nrows1>0) {
    $_SESSION['loggedin'] = false;
    $_SESSION['error'] = "Our records indicate that there is already an account registered with that email. Please use the 'forgot your password' link below if you cannot remember your password.";
    header('Location: registration.php');
    echo "running insisde duplicate email";
        exit();
}

当我输出 $nrows1 时,我得到了0行或空变量。但是当我直接在SQL中输入查询时,它可以正常工作。我似乎遵循了文档并对其进行了一些调整。

我还使用了受影响的行数函数,但我不认为这适用于SELECT语句,正确吗?

非常感谢任何帮助,非常感激。


如果你使用bind_param,我认为你不需要转义参数。 - tsnorri
谢谢。是的,那实际上也在限制它。 - ambe5960
1个回答

5
执行完毕后,你需要使用mysqli_stmt_store_result()来获取结果集,这样它就会知道有多少行数据。此外,你应该将$num_rows应用于语句,而不是连接。
$stmt->execute();
$stmt->store_result();
$nrows1 = $stmt->num_rows;

非常感谢。我也在想双重转义的问题,实际上这也是问题的一部分。存储的结果非常好。 - ambe5960
1
没错。如果您使用bind_param,则不需要转义数据。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接