php 检查电子邮件是否存在于 mysql 数据库中

php check if email exists in mysql database

出于某种原因,它总是 returns 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);

不要使用 real_escape_string()。当您使用参数绑定时,无需转义任何内容。

mysqli 中的参数绑定相当困难,因为您必须记住bind_param() 的奇怪语法。至少需要 2 个参数,第一个是表示值类型的字符串。你没有那个。

SQL 参数不需要括号。你可以做 email=?.

当您想使用 SQL 检查某物是否存在时,则不需要使用 $stmt->num_rows。可以在SQL中使用COUNT(1),这样应该更简单。事实上,忘记这个 function/property 的存在,因为它会导致许多像你这样的错误,而且通常没有用。

当我们解决所有小问题后,代码应该如下所示:

$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);

您只需添加$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;
}

Check this PHP code here