由于某种原因,即使数据库中有相同的电子邮件,它也总是返回0。我的语法有问题吗?当我不使用prepare/execute语句时,代码可以正常工作。出于安全考虑,这里有必要吗?
$email= $conn->real_escape_string($_POST['email']);
function emailExists($conn, $email) {
$stmt = $conn->prepare("SELECT 1 FROM accountInfo WHERE email=(?)");
$stmt->bind_param($email);
$stmt->execute();
return $stmt->num_rows;
}
echo emailExists($conn, $email);
您只需要添加$stmt->store_result();
function emailExists($conn, $email) {
$stmt = $conn->prepare("SELECT 1 FROM accountInfo WHERE email=? LIMIT 1");
$stmt->bind_param('s', $email);
$stmt->execute();
$stmt->store_result();
return $stmt->num_rows;
}
查看这里的PHP代码
不要使用real_escape_string()
。当你使用参数绑定时,不需要转义任何东西。
参数绑定在mysqli是相当困难的,因为你必须记住bind_param()
的奇怪语法。至少需要两个参数,第一个是代表值类型的字符串。你没有。
SQL不需要用括号括住参数。你可以只做email=?
。
当你想用SQL检查某个东西是否存在时,你不需要使用$stmt->num_rows
。您可以在SQL中使用COUNT(1)
,这应该更简单。事实上,忘记这个函数/属性的存在吧,因为它会导致许多像你这样的错误,而且通常是没有用的。
当我们修复了所有的小问题后,代码应该看起来像这样:
$email = $_POST['email'];
function emailExists(mysqli $conn, string $email):bool {
$stmt = $conn->prepare("SELECT COUNT(1) FROM accountInfo WHERE email=? LIMIT 1");
$stmt->bind_param('s', $email);
$stmt->execute();
return (bool) $stmt->get_result()->fetch_row[0];
}
echo emailExists($conn, $email);