如何检查MySQL中是否存在某行? (即检查 MySQL 中是否存在用户名或电子邮件)

问题描述 投票:0回答:4

我需要帮助检查数据库中是否存在一行。就我而言,该行包含一个电子邮件地址。我得到结果:

email no longer exists [email protected]

这是我当前使用的代码:

if (count($_POST)) {
    $email = $dbl->real_escape_string(trim(strip_tags($_POST['email'])));

    $query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
    $result = mysqli_query($dbl, $query);
    if (is_resource($result) && mysqli_num_rows($result) == 1) {
        $row = mysqli_fetch_assoc($result);
        echo $email . " email exists " .  $row["email"] . "\n";
    } else {
        echo "email no longer exists" . $email . "\n";
    }
}

有没有更好的方法来检查 MySQL 数据库中是否存在一行(在我的例子中,检查 MySQL 中是否存在电子邮件)?

php mysql mysqli pdo
4个回答
81
投票

使用 mysqli 准备好的语句传统方法

$query = "SELECT 1 FROM `tblUser` WHERE email=?";
$stmt = $dbl->prepare($query);
$stmt->bind_param("s", $email);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$emailExists = (bool)$row;

使用 mysqli 现代方法盯着 PHP 8.2:

$query = "SELECT 1 FROM `tblUser` WHERE email=?";
$result = $dbl->execute_query($query, [$email]);
$row = $result->fetch_assoc();
$emailExists = (bool)$row;

使用 PDO 准备好的语句

$email = $_POST['email'];
$stmt = $conn->prepare('SELECT 1 FROM `tblUser` WHERE email = :email');
$stmt->execute(["email" => $_POST['email']]);
$row = $result->fetch();
$emailExists = (bool)$row;
  • 准备好的语句最好用于帮助防止 SQL 注入。

注意:

在处理上面使用/概述的表单和 POST 数组时,请确保 POST 数组包含值、表单使用 POST 方法并为输入匹配命名属性。

  • 仅供参考:如果没有明确指示,表单默认使用 GET 方法。

注意:

<input type = "text" name = "var">
-
$_POST['var']
匹配。
$_POST['Var']
没有匹配。

  • POST 数组区分大小写。

咨询:

检查参考文献时出错:

请注意,MySQL API 不会混合使用,以防您访问此问答并使用

mysql_
进行连接(并查询)。

  • 从连接到查询必须使用同一个

有关此问题请参阅以下内容:

如果您正在使用

mysql_
API 并且无法选择使用它,请参阅 Stack 上的以下问答:

mysql_*
函数已弃用,并将从未来的 PHP 版本中删除。

  • 是时候迈入21世纪了。

您还可以向(a)行添加UNIQUE约束。

参考资料:

如何向现有表添加唯一键(具有非唯一行)


8
投票

您必须执行查询并向查询中的 $email 添加单引号,因为它是一个字符串,并删除

is_resource($query)
$query 是一个字符串,$result 将是资源

$query = "SELECT `email` FROM `tblUser` WHERE `email` = '$email'";
$result = mysqli_query($link,$query); //$link is the connection

if(mysqli_num_rows($result) > 0 ){....}

更新

您编辑中的基础只需更改:

if(is_resource($query) && mysqli_num_rows($query) > 0 ){
        $query = mysqli_fetch_assoc($query);
        echo $email . " email exists " .  $query["email"] . "\n";

if(is_resource($result) && mysqli_num_rows($result) == 1 ){
        $row = mysqli_fetch_assoc($result);
         echo $email . " email exists " .  $row["email"] . "\n";

你会没事的

更新2

更好的方法应该是有一个存储过程来执行以下 SQL,并将电子邮件作为参数传递

SELECT IF( EXISTS (
                  SELECT *
                  FROM `Table`
                  WHERE `email` = @Email)
          , 1, 0) as `Exist`

并检索 php 中的值

伪科迪戈:

 $query = Call MYSQL_SP($EMAIL);
 $result = mysqli_query($conn,$query);
 $row = mysqli_fetch_array($result)
 $exist = ($row['Exist']==1)? 'the email exist' : 'the email doesnt exist';

6
投票

有多种方法可以检查数据库中是否存在某个值。让我演示如何使用 PDO 和 mysqli 正确完成此操作。

PDO

PDO 是更简单的选择。要查明数据库中是否存在某个值,您可以使用准备好的语句和

fetchColumn()
。不需要获取任何数据,因此我们只会在值存在时获取
1

<?php

// Connection code. 
$options = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new \PDO('mysql:host=localhost;port=3306;dbname=test;charset=utf8mb4', 'testuser', 'password', $options);

// Prepared statement
$stmt = $pdo->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->execute([$_POST['email']]);
$exists = $stmt->fetchColumn(); // either 1 or null

if ($exists) {
    echo 'Email exists in the database.';
} else {
    // email doesn't exist yet
}

更多示例请参阅:如何检查数据库中是否存在电子邮件?

MySQLi

与往常一样,mysqli 有点麻烦并且受到更多限制,但我们可以使用准备好的语句遵循类似的方法。

<?php

// Connection code
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'testuser', 'password', 'test');
$mysqli->set_charset('utf8mb4');

// Prepared statement
$stmt = $mysqli->prepare('SELECT 1 FROM tblUser WHERE email=?');
$stmt->bind_param('s', $_POST['email']);
$stmt->execute();
$exists = (bool) $stmt->get_result()->fetch_row(); // Get the first row from result and cast to boolean

if ($exists) {
    echo 'Email exists in the database.';
} else {
    // email doesn't exist yet
}

您还可以获取

COUNT(1)
并使用
fetch_row()[0]

读取第一行中的第一项,而不是将结果行(甚至可能不存在)转换为布尔值

更多示例请参阅:如何使用 mysqli 准备好的语句检查数据库中是否存在值

小备注

  • 如果有人建议您使用
    mysqli_num_rows()
    ,请不要听他们的。这是一种非常糟糕的方法,如果滥用可能会导致性能问题。
  • 不要使用
    real_escape_string()
    。这并不是为了防止 SQL 注入。如果您正确使用准备好的语句,则无需担心任何转义。
  • 如果您想在尝试插入新行之前检查数据库中是否存在一行,那么最好不要使用这种方法。最好在数据库中创建一个唯一键,并在存在重复值时让它抛出异常。

2
投票

验证之后和 INSERT 之前,使用 mysqli(过程)检查用户名是否已存在。这有效:

//check if username already exists
       include 'phpscript/connect.php'; //connect to your database

       $sql = "SELECT username FROM users WHERE username = '$username'";
       $result = $conn->query($sql);

       if($result->num_rows > 0) {
           $usernameErr =  "username already taken"; //takes'em back to form
       } else { // go on to INSERT new record
© www.soinside.com 2019 - 2024. All rights reserved.