毫无意义的SQL vs PHP


Pointless SQL vs PHP if

我需要使用下面的代码来操作mySQL表中的条目

foreach($items as $item)
{
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}

$items中可能有多达50个条目。这段代码的变体是

foreach($items as $item)
{
 if ('z' != $img->img)
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 if ('z' != $item->lili)
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}

在这两种情况下,我执行的SQL语句序列的每一个项目在$items。我的问题

  1. 构建$sql然后执行它不是更有效吗?
  2. 但是,如果$items中的所有50个条目都产生了有意义的SQL,这难道不意味着SQL语句的执行速度非常慢吗?
  3. 最后,是更好地执行PHP端如果测试在我的代码的第二个版本或只是构建SQL,让mySQL处理的事实,测试返回一个空行?

您可以使用in子句,例如

$sql = "UPDATE .... WHERE imid IN (" . implode($array_that_has_the_ids) . ")"

并将自己减少到只有一个SQL查询。然而,如果你试图使用一个巨大的数组,这可能会失败——生成的查询可能超过max_allowed_packet设置并被终止。

至于你的……比较strlen和'z'的结果有什么意义?strlen返回一个整数,你不妨做if (apple == orange)代替。

首先,我建议您使用IN子句和两个分开的查询…您可能需要转义这两个元素$item->img和$item->lili ..

$ids = array("siteims"=>array(), "lists"=>array());
foreach($items as $item)
{
    $ids['siteims'][] = "'" . $item->img . "'";
    $ids['lists'][] = "'" . $item->lili . "'" ;
}
if(!empty($ids['siteims'])){
    $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid IN (".implode(',', $ids["siteims"]).")";
    $dbh->exec($sql);
}
if(!empty($ids['lists'])){
    $sql = "UPDATE `lists` SET refs = refs + 1 WHERE lid IN (".implode(',', $ids["lists"]).")";
    $dbh->exec($sql);
}