带有修改的可重用查询?

时间:2010-05-05 14:05:36

标签: php mysql code-reuse

我正在使用这个mysql查询和php一起搜索多个关键字:

$query = "SELECT cQuotes, vAuthor, cArabic, vReference FROM ".$table." WHERE (";
  $countFields = count($arrayFields);
  while ($a < $countFields)
  {
    while ($b < $countSearch)
    {
      $query = $query."$arrayFields[$a] LIKE '%$arraySearch[$b]%'";
      $b++;
      if ($b < $countSearch)
      {
        $query = $query." AND ";
      }
    }
    $b = 0;
    $a++;
    if ($a < $countFields)
    {
      $query = $query.") OR (";
    }
  }
  $query = $query.")";
  $result = mysql_query($query, $conn)

我想重复使用此查询并对其进行一些修改(例如,WHERE子句保持不变,而我使用COUNT查询行数),但重复代码似乎不切实际再补充几点。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

<?php

$table = "myTable";
$justCount = true;
$requiredFields = array('cQuotes', 'vAuthor', 'cArabic', 'vReference');
$arrayFields = array('cQuotes','vAuthor');
$arraySearch = array('blah','foo','bar');

///////////////
$selectWhat = $justCount ? "COUNT(*)" : implode(',', $requiredFields);

$wherePart = array();
foreach($arraySearch as $search)
{
    $subWherePart = array();
            foreach($arrayFields as $field)
    {
        $subWherePart[] = $field . " LIKE '%" . $search ."%'";
    }
    $wherePart[] = "(" . implode(" AND ", $subWherePart) . ")";
}

$query = "SELECT " . $selectWhat . " FROM " . $table
        . " WHERE " . implode(" OR ", $wherePart);

?>

不要忘记过滤输入搜索词以避免SQL注入。

答案 1 :(得分:1)

您可以将该代码拉出到一个单独的函数中,然后向它发送一个参数,告诉函数您想要的查询版本。然后,该函数将构造查询并返回该字符串。我也认为准备好的陈述可能对你有益。

答案 2 :(得分:1)

我不明白完全你正在做什么,因为缺少代码,但我建议如下:

不要与数组一起使用;使用foreach它更加紧凑,这就是它的用途。

不要手动连接字符串,请使用implode()

不要增加SQL的复杂性来计算结果;使用MYSQL的FOUND_ROWS()代替。

在一个稍微不相关的说明中,我建议从PHP的mysql库升级到mysqli。它允许多个查询,这将使您的生活更轻松。

答案 3 :(得分:1)

您可以尝试使用查询构建器库或ORM,尤其是在重复发生此问题的情况下。它们允许您在功能上创建SQL。我建议使用DoctrineSqloo(扰乱警报:我是Sqloo的创建者)。由于您可以使用它们在功能上创建SQL,因此您甚至可以在它们反对时传递部分查询,以允许非常高的代码重用。

DoctrineSqloo的一些示例。