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

Php 如何检查MySQL中是否存在行?(即检查MySQL中是否存在电子邮件),php,mysql,mysqli,pdo,Php,Mysql,Mysqli,Pdo,我需要帮助检查数据库中是否存在行。在我的例子中,该行包含一个电子邮件地址。我得到的结果是: 电子邮件不再存在publisher@example.com 这是我当前使用的代码: if (count($_POST)) { $email = $dbl->real_escape_string(trim(strip_tags($_POST['email']))); $query = "SELECT `email` FROM `tblUser` WHERE `email` = '$

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

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

您必须执行查询并在查询中向$email添加单引号,因为它是一个字符串,并删除
Is\u 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";

你会没事的

更新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';

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

(其中一些是我自己用的,或者过去用过的)

Edit:我之前在语法中犯了一个错误,我使用了两次
mysqli\u 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

}
您还可以使用以下方法:

:


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

N.B.:

 $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';
在处理上述使用/概述的表单和POST数组时,请确保POST数组包含值,表单使用POST方法,并匹配输入的命名属性

  • 仅供参考:如果没有明确指示,表单默认为GET方法
注意:
-
$\u POST['var']
匹配<代码>$\u POST['Var']不匹配

  • POST数组区分大小写
咨询:

检查引用时出错:

请注意,MySQL API不会混合使用,以防您访问此问答,并使用
MySQL\uuz
连接(和查询)

  • 从连接到查询必须使用相同的
有关此问题,请咨询以下人员:

如果您使用的是
mysql\uu
API,并且没有选择使用它,那么请参考以下关于堆栈的问答:

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

  • 是时候跨入21世纪了

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

参考资料:


在验证之后和插入之前,使用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

有多种方法可以检查数据库中是否存在值。让我来演示如何使用PDO和mysqli正确地完成这项工作

PDO PDO是更简单的选择。要确定数据库中是否存在值,可以使用prepared语句和。不需要获取任何数据,因此,如果值存在,我们将只获取
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
}

$query是一个字符串,因此is\u资源($query)将始终失败。。。您没有运行查询。请仔细阅读可能重复的“从不将数据直接连接到查询中…”。。。它会创建含糊不清的查询,从而导致错误和安全问题。使用准备好的/参数化的查询可以完全避免此问题。至少,必须使用适当的逃逸。我认为前两个例子不是注射安全的,后两个是注射安全的,对吗?感谢这里将数据连接到查询中的方法已损坏,不应使用。始终使用某种类型的参数化查询,或至少使用转义。@Brad“始终使用某种类型的参数化查询,或至少使用转义”-Err。。这不是我的答案吗?你到底在找什么?把旗挂起来。。。你的代码连接到上面是坏的,这就是现实。下面的代码显然很好。如果你编辑你的帖子并删除坏代码,我很乐意撤销否决票。谢谢你提醒大家注意其他的错误答案。。。今天晚些时候我会谈到这些。@Brad“你的代码连接到顶部坏了”-你必须在这里说得具体一点,因为我看不出哪里有“坏”的东西,如果有什么东西,你只是在跟踪我。我的回答或使用的任何语法都没有错,请不要侮辱我。编辑:如果你说的是
email='“$email.”
这是一个有效的语法,你可能认为它应该写为
email='$email'
,我不知道。我正在制作一个名为Pseudocodigo的标签。永远不要将数据直接连接到查询中。。。它会创建含糊不清的查询,从而导致错误和安全问题。使用准备好的/参数化的查询可以完全避免此问题。至少必须使用正确的转义。@Brad
更好的方法应该是使用一个存储过程来执行以下SQL,并将电子邮件作为参数传递给EmilioGort,这取决于您如何执行该存储过程@Brad只是一个问题:准备好处理@Email='1'这样的参数了吗email@email.com');删除表用户;'??永远不要将数据直接连接到查询中。。。它会创建含糊不清的查询,从而导致错误和安全问题。使用准备好的/参数化的查询可以完全避免此问题。至少,必须使用适当的逃逸。
//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
<?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
}
<?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
}