如何使用PHP检查MySQL中是否存在一行数据

4
我正在尝试读取一个XML文件并将其与现有数据库中的字段进行比较。
如果数据库中的ID在XML文件中不存在,则对应该ID的整行数据将被删除。
为此,我使用while语句逐行读取XML文件。
作为第一步,我正在尝试进行简单比较,并在数据库中找到不存在于XML文件中的ID时输出。
我知道数据库中存在一些在XML文件中不存在的ID,但是以下代码未显示它们。
我的三个问题是:首先,如何显示从数据库中获取的ID?其次,为什么这段代码没有找到不在XML中的ID?最后,我是否完全错误地处理了这个问题,是否有更好的方法来解决它!
$sql_result = mysql_query("SELECT id FROM `list` WHERE id =  $id") or die(mysql_error());

if($sql_result)
{
// echo $id . " Id exists " .  $sql_result["id"] . "\n";
}
else
{
echo "Id no longer exists" . $id . "\n";
}
6个回答

5

你的代码没有找到预期的结果,因为尽管id可能没有被找到,但$sql_result仍然保持TRUE值,因为查询成功了。相反,检查myqsl_num_rows() > 0是否成立。

if($mysql_num_rows($sql_result) > 0)
{
  // echo $id . " Id exists "\n";

  //Now, to print the id, you need to fetch it from `$sql_result`, 
  //which is just a resource at this point:
  $row = mysql_fetch_assoc($sql_result);
  echo $row['id'];
}

1
必须是一个该死的巨魔 +1,那就是答案。 - afarazit
1
这是一个正确的答案,但也要注意 @Gerep 的答案,如果有很多条目,使用 IN(id,id,id)获取所有 id 并执行单个查询可能会更有益。 - Berry Langerak

4
这是正确的检查方式:
$sql_result = mysql_query("SELECT `id` FROM `list` WHERE `id` =  ".intval($id,10)." LIMIT 0,1");

if(is_resource($sql_result) && mysql_num_rows($sql_result) > 0 ){
    $sql_result = mysql_fetch_assoc($sql_result);
    echo $id . " Id exists " .  $sql_result["id"] . "\n";
}
else{
    echo "Id no longer exists" . $id . "\n";
}

在这种情况下,如果你正在测试一个资源是否被返回,那么你的 "or die([...])" 是毫无意义的,因为如果出现错误,它会触发 die(),否则会执行你的检查,而不是两者都会执行。 - John Cartwright
mysql_query现在已经被弃用。请使用mysqli_query代替。http://php.net/manual/en/function.mysql-query.php。 - Omar Tariq

3

您应该使用mysql_num_rows()来检查返回的行数。否则,您只是在检查查询是否执行而没有任何错误。

if($sql_result)

to

if(mysql_num_rows($sql_result))

3
您可以在选择器中使用 NOT IN() 并将 XML 中存在的 ID 作为参数,例如:
SELECT id FROM `list` WHERE id NOT IN($your_id_list)

通过这个操作,您将得到一个不在该列表中的ID列表。

您的ID必须用逗号分隔,例如:

SELECT id FROM `list` WHERE id NOT IN(123,654,987,45)

2
问题1:我该如何显示从数据库中获取的Id?
$sql_result = mysql_query("SELECT `id` FROM `list` WHERE `id` =  $id") or die(mysql_error());
$sql_row = mysql_fetch_assoc($sql_result);
if(!empty($sql_row['id'])) {
    echo "Id exists - " .  $sql_row['id'] . "\n";
} else {
    echo "Id no longer exists - " . $sql_row['id'] . "\n";
}

问题2:为什么这段代码找不到任何不在XML中的ID?

我认为,在您的代码中,无论ID是否存在于数据库中,if()条件始终会返回true。其次,正如您从上面的代码中猜测的那样,您忘记从SQL结果集中获取数据了。

问题3:我完全错了吗?有更好的方法吗?

您正在通过浏览XML并检查数据库中每个条目的存在性来正确地进行操作。更好的方法可能是首先从XML中检索所有ID,然后在单个SQL查询中使用它们:

SELECT `id` FROM `list` WHERE `id` NOT IN ($list);

请注意,如果XML文件中存在大量ID(例如几百个),此查询可能运行缓慢。

1
mysql_num_rows()

或者

SELECT COUNT(*) [...]


1
我正在苦恼于PHP,但感谢您建议更改mysql。 - kitenski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接