我需要使用下面的代码来操作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。我的问题
- 为项构建$sql然后执行它不是更有效吗? 但是,如果$items中的所有50个条目都产生了有意义的SQL,这难道不意味着SQL语句的执行速度非常慢吗?
- 最后,是更好地执行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);
}