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

2022-08-30 11:29:40

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

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


答案 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 API不会混合,以防您可能正在访问此问答,并且您正在使用连接(和查询)。mysql_

  • 从连接到查询时,必须使用相同的方法。

请咨询以下信息:

如果您使用的是 API,但无法选择使用它,请查阅以下 Stack 上的问答:mysql_

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

  • 是时候步入21世纪了。

还可以向 (a) 行添加唯一约束。

引用:


答案 2

您必须执行查询并将单引号添加到查询中的$email,因为它是一个字符串,并且删除$query是字符串,$result将是资源is_resource($query)

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

推荐