检查mysql是否存在行

use*_*684 34 php mysql mysqli pdo

我需要帮助检查是否存在行.我收到"电子邮件不再存在publisher@example.com".

有没有更好的方法来检查mysqli是否存在行?

email no longer exists publisher@example.com
Run Code Online (Sandbox Code Playgroud)

Fun*_*ner 65

以下是经过试验,测试和验证的方法,以检查是否存在行.

(其中一些我自己使用,或过去曾使用过).

编辑:我在我的语法中做了一个先前的错误,我使用了mysqli_query()两次.请参阅修订版.

即:

if (!mysqli_query($con,$query))应该简单地读作if (!$query).

  • 我为忽视那个错误而道歉.

附注:无论'".$var."''$var'做同样的事情.您可以使用其中任何一个,两者都是有效的语法.

以下是两个已编辑的查询:

$query = mysqli_query($con, "SELECT * FROM emails WHERE email='".$email."'");

    if (!$query)
    {
        die('Error: ' . mysqli_error($con));
    }

if(mysqli_num_rows($query) > 0){

    echo "email already exists";

}else{

    // do something

}
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

$query = mysqli_query($dbl, "SELECT * FROM `tblUser` WHERE email='".$email."'");

    if (!$query)
    {
        die('Error: ' . mysqli_error($dbl));
    }

if(mysqli_num_rows($query) > 0){

    echo "email already exists";

}else{

    // do something

}
Run Code Online (Sandbox Code Playgroud)

您还可以使用mysqli_预先准备好的语句方法:

$query = "SELECT `email` FROM `tblUser` WHERE email=?";

if ($stmt = $dbl->prepare($query)){

        $stmt->bind_param("s", $email);

        if($stmt->execute()){
            $stmt->store_result();

            $email_check= "";         
            $stmt->bind_result($email_check);
            $stmt->fetch();

            if ($stmt->num_rows == 1){

            echo "That Email already exists.";
            exit;

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者带有预处理语句的PDO方法:

<?php
$email = $_POST['email'];

$mysql_hostname = 'xxx';
$mysql_username = 'xxx';
$mysql_password = 'xxx';
$mysql_dbname = 'xxx';

try {
$conn= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
     exit( $e->getMessage() );
}

// assuming a named submit button
if(isset($_POST['submit']))
    {

        try {
            $stmt = $conn->prepare('SELECT `email` FROM `tblUser` WHERE email = ?');
            $stmt->bindParam(1, $_POST['email']); 
            $stmt->execute();
            while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

            }
        }
        catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }

    if($stmt->rowCount() > 0){
        echo "The record exists!";
    } else {
        echo "The record is non-existant.";
    }


    }
?>
Run Code Online (Sandbox Code Playgroud)
  • 准备好的语句最好用于帮助防止SQL注入.

注意:

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

  • 仅供参考:如果没有明确指示,表格默认为GET方法.

注意:<input type = "text" name = "var">- $_POST['var']匹配.$_POST['Var']不配.

  • POST数组区分大小写.

请教:

检查引用时出错:

请注意,MySQL API不会混用,以防您可能正在访问此问答并且您正在使用mysql_(并查询).

  • 您必须使用相同的连接到查询.

请参考以下内容:

如果您正在使用mysql_API并且无法使用它,请参阅以下堆栈上的问答:

这些mysql_*函数已弃用,将从未来的PHP版本中删除.

  • 现在是进入21世纪的时候了.

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

参考文献:

  • 我是否正确地认为前两个例子不是注射安全的,而后两个例子是?谢谢 (4认同)

Emi*_*ort 7

您必须执行查询并在查询中将单引号添加到$ 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 ){....}
Run Code Online (Sandbox Code Playgroud)

UPDATE

在你的编辑基础上改变:

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

通过

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

你会没事的

更新2

更好的方法应该是具有执行以下SQL的Store Procedure,将Email作为参数传递

SELECT IF( EXISTS (
                  SELECT *
                  FROM `Table`
                  WHERE `email` = @Email)
          , 1, 0) as `Exist`
Run Code Online (Sandbox Code Playgroud)

并在PHP中检索值

Pseudocodigo:

 $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';
Run Code Online (Sandbox Code Playgroud)

  • **永远不要**将数据直接连接到查询中...它会创建不明确的查询,从而可能导致错误和安全问题。使用准备好的/参数化的查询可以完全避免这个问题。至少,必须使用适当的转义。 (2认同)

Dha*_*man 6

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

磷酸二氢钾

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
}
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

COUNT(1)您还可以使用以下命令从第一行获取并读取第一项,而不是将结果行(甚至可能不存在)转换为布尔值fetch_row()[0]

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

次要评论

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