PHP检查mysql数据库中是否存在邮件



由于某种原因,即使数据库中有相同的电子邮件,它也总是返回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);

相关内容

最新更新