0

我需要使用这样的代码来操作 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);
}

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

  1. 为项目构建 $sql然后执行它不是更有效吗?
  2. 但是,如果 $items 中所有可能的 50 项都生成有意义的 SQL,那不意味着一批 SQL 语句执行速度非常慢吗?
  3. 最后,如果像我的代码的第二个版本那样执行 PHP 方面的测试,或者只是构建 SQL 并让 mySQL 处理 WHERE 测试返回空行的事实,是不是更好?

我非常感谢任何帮助。

4

2 回答 2

3

您可以改用一个in子句,例如

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

并将自己减少到一个单一的 SQL 查询。但是,如果您尝试使用 HUGE aray,这可能会失败 - 生成的查询可能会超过 max_allowed_pa​​cket 设置并被杀死。

至于你的 strlen ......将 strlen 结果与比较有什么意义'z'if (apple == orange)strlen 返回一个整数,您不妨改为这样做。

于 2013-04-08T04:17:48.523 回答
1

首先,我建议您使用 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);
}
于 2013-04-08T04:19:42.703 回答