一尘不染

如何检查MySQL中是否存在行?(即检查MySQL中是否存在电子邮件)

mysql

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

email no longer exists publisher@example.com

这是我当前正在使用的代码:

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中是否存在电子邮件)?


阅读 335

收藏
2020-05-17

共1个答案

一尘不染

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

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

编辑: 我在使用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_与准备好的语句方法一起使用:

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

            }
        }
    }

带有准备好的语句 的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.";
    }


    }
?>
  • 最好使用预处理语句来帮助防止SQL注入。

注意:

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

  • 仅供参考:如果未明确指示,则窗体默认为GET方法。

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

  • POST数组区分大小写。

请教:

错误检查参考:

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

  • 从连接到查询,您必须使用同一地址。

请咨询以下内容:

如果您使用的是mysql_API,但别无选择,请在堆栈上咨询以下问答:

mysql_*功能已弃用,并将从以后的PHP版本中删除。

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

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

参考文献:

2020-05-17