我有一个典型的情况,我需要通过他们的ID从mysql中提取多行.我只知道两种方法如何做,但我想知道是否有更好的方法来做到这一点?如果没有,那么我自己的哪种方法最新/最快/更好?
我的第一种方法: (~0.0003030)
$ids = array(3, 4, 6, 11);
foreach ($ids as $id) {
$task = $DB->query_first("SELECT * FROM tasks WHERE `id` = '$id'");
DoSomethingWithTheTask($task);
}
Run Code Online (Sandbox Code Playgroud)
我的 第二种方法:(~0.0001040)
$ids = array(3, 4, 6, 11);
foreach ($ids as $id) {
$wheres[] = '`id` = \'' . $id . '\'';
}
$tasks = $DB->query("SELECT * FROM tasks WHERE " . implode(' OR ', $wheres));
while ($task = $DB->fetch_array($tasks)) {
DoSomethingWithTheTask($task);
}
Run Code Online (Sandbox Code Playgroud)
我甚至考虑第二种方法的原因是因为它只使用了1x查询.但是,我坚信这两种方法都不整齐,需要进行优化.据我所知,你不能这样做一个查询:WHERE id = '2, 3, 4'.
实际上,你可以.IN运营商做到了.
SELECT * FROM tasks WHERE `id` IN (2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
会做的伎俩.您可以使用IN运算符同时使用数值或字符串值
正如约翰以失败为榜样,这是一个正确的方法
$ids = array(3, 4, 6, 11);
$in = implode(",",$ids);
$sql = "SELECT * FROM tasks WHERE `id` IN ($in)");
Run Code Online (Sandbox Code Playgroud)
为了频繁使用我会做一个占位符,以这种方式调用整个表达式
$ids = array(3, 4, 6, 11);
$data = $db->getArr("SELECT * FROM tasks WHERE `id` IN (?a)",$ids);
Run Code Online (Sandbox Code Playgroud)
从评论中回答你的问题,这是我的db类的代码
function escapeString($value)
{
return "'".mysql_real_escape_string($value,$this->connect)."'";
}
function createIN($data)
{
if (!is_array($data))
{
throw new E_DB_MySQL_parser("Value for ?a type placeholder should be array.");
}
if (!$data)
{
throw new E_DB_MySQL_parser("Empty array for ?a type placeholder.");
}
$query = $comma = '';
foreach ($data as $key => $value)
{
$query .= $comma.$this->escapeString($value);
$comma = ",";
}
return $query;
}
Run Code Online (Sandbox Code Playgroud)
getArr()方法与此没有直接关系,因为它只负责结果类型.