如何检查 table 是否为空或我的查询是否已不匹配任何结果

How do I check if a table is empty or already my query didn't match any results

我想要一个仅在 table 中没有行或现有行与我的输入中的特定参数不匹配时才运行的 if 语句。我这样试过:

$currentURL = $post["media_url"];
$sql = "SELECT * FROM images WHERE imageURL = '$currentURL'";
$result = $conn->query($sql);

if(!$result)
{ ... }

根据我的想法,如果 $currentURL 在现有数据中不存在,这应该在我第一次想向数据库添加内容时执行 if 语句。但这似乎并不像我认为的那样起作用。你会怎么做?也许我处理 $result 错误,因为如果我在 phpmyadmin 中测试 sql-query,这会显示正确的结果(无行)。

  1. 针对 sql 注入清理输入(或更好 - 使用准备好的语句和参数绑定)

$sql = "SELECT * FROM images WHERE imageURL = '".$conn->real_escape_string($currentURL)."'";

  1. mysqli 查询 returns true 成功(即使是空数据集也成功),改用 num_rows:

if ( $result->num_rows === 0 ) { ... }

我猜,$conn 是 PDO 连接?在这种情况下,方法 $conn->query() return 是一个 PDOStatement 类型的对象。参见 https://www.php.net/manual/de/class.pdostatement.php

该方法不 return 结果集。

相反,您可以使用 PDOStatement 对象来获取结果:

$currentURL = $post["media_url"];
$sql = "SELECT * FROM images WHERE imageURL = '$currentURL'";
$result = $conn->query($sql)->fetchAll();

if(empty($result))
{ ... }

如果您使用的是 mysqli,则由 query() 编辑的对象 return 是这样的:https://www.php.net/manual/en/class.mysqli-result.php

所以代码是:

$currentURL = $post["media_url"];
$sql = "SELECT * FROM images WHERE imageURL = '$currentURL'";
$result = $conn->query($sql)->fetch_all(MYSQLI_ASSOC);

if(empty($result))
{ ... }

另请注意:您的代码非常不安全!您应该使用准备好的语句来防止 sql-injection:

$currentURL = $post["media_url"];
$sql = "SELECT * FROM images WHERE imageURL = :currentUrl";
$stmt = $conn->prepare($sql);
$stmt->execute(['currentUrl' => $currentURL]);
$result = $stmt->fetchAll();

if(empty($result))
{ ... }

执行此操作的正确方法是使用准备好的语句并将结果提取到数组中。您可以使用 fetch_all()

将所有行提取到数组中
$stmt = $conn->prepare("SELECT * FROM images WHERE imageURL = ?");
$stmt->bind_param('s', $post["media_url"]);
$stmt->execute();
// Get result and then fetch all rows from the result object
$result = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);

// Then check if you have any rows at all using a simple if statement
// Negate it using ! to check if the array is empty
if (!$result) {
    // no results found
}