检查mysql是否存在行

时间:2014-03-07 14:33:02

标签: php mysql

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

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

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

    $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";
    }   
}

4 个答案:

答案 0 :(得分:62)

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

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

编辑:我在语法中犯了一个错误,我曾两次使用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

}

,在你的情况下:

$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

}

您还可以使用mysqli_ with a prepared statement方法:

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

            }
        }
    }

Or a PDO method with a prepared statement

<?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.";
    }


    }
?>
  • 准备好的语句最好用于帮助防止SQL注入。

<强> N.B:

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

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

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

  • POST阵列区分大小写。

咨询:

检查引用时出错:

请注意,MySQL API不会混用,如果您可能正在访问此问答并且您正在使用mysql_进行连接(并查询)。

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

请参阅以下内容:

如果您使用的是mysql_ API并且无法使用它,请参阅以下有关堆栈的问答:

{@ 1}}函数已弃用,将从以后的PHP版本中删除。

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

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

参考文献:

答案 1 :(得分:8)

您必须执行查询并在查询中将单引号添加到$ email,因为它是一个字符串,并删除is_resource($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中的值

<强> 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';

答案 2 :(得分:4)

验证之后和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

答案 3 :(得分:2)

有多种方法可以检查数据库中是否存在值。让我演示一下如何使用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
}

有关更多示例,请参见:How to check if email exists in the database?

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]从第一行中读取第一项,而不是将结果行(可能甚至不存在)都强制转换为布尔值。

有关更多示例,请参见:How to check whether a value exists in a database using mysqli prepared statements

次要发言

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