【问题标题】:How to check EXISTS result - PDO如何检查 EXISTS 结果 - PDO
【发布时间】:2023-03-30 00:38:01
【问题描述】:

我使用http://php.net/ 页面代码来连接 PDO。我添加 EXIST 术语。如何检查 EXISTS 是否返回 false?如果不可行,如何检查select是否返回空结果?

try {
    $conn = new PDO("mysql:host=$servername;dbname=xxxx", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully";
            getUsers($conn,$po[0]);
            $conn = null;
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }

function getUsers($con,$po){

    $sql = "SELECT * FROM usuarios WHERE EXISTS (SELECT id FROM webs WHERE name='$po')";

     foreach ($con->query($sql) as $row) {

         print $row['nombre'] . "\n";
         print $row['id'] . "\n";
         print $row['email'] . "\n";
     }

}

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

WHERE EXISTS 基于键 EXISTS 之后的子查询返回标准的 SELECT 结果(行)

所以,要检查EXISTS 是否失败,您必须使用rowCount,它返回查询返回的行数:

$result = $con->query($sql);
if( $result->rowCount() > 0 ) echo "EXISTS";
else                          echo "NOT EXISTS";

(编辑:)

请注意:

如下面的 cmets 所述,rowCount() 在这种情况下可以正常工作,并且始终与 mySQL 数据库结构一起使用,但«此行为不能保证适用于所有数据库»结构:使用 sqLite,即它不起作用。

【讨论】:

  • "如果关联 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则某些数据库可能返回该语句返回的行数。但是,此行为不是保证适用于所有数据库,并且不应依赖于可移植应用程序。”,尽管 - 因为问题是关于 MySQL 的 - 它应该可以工作。
  • @JoachimIsaksson 我知道。在 sqlite 中,即它不起作用。但在这种情况下,它可以工作
  • @JoachimIsaksson 谢谢你的警告。我已经编辑了答案并添加了注释,因为问题标题是关于通用“PDO”的,所以我的答案对于未来的访问者可能会模棱两可
【解决方案2】:

如果你会这样使用,那么它会工作并且不需要检查条件

$rows = $con->query($sql);
if($rows){
   foreach ($rows as $row) {
         print $row['nombre'] . "\n";
         print $row['id'] . "\n";
         print $row['email'] . "\n";
   }
}

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2016-07-23
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多