我正在使用这个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查询行数),但重复代码似乎不切实际再补充几点。有什么建议吗?
答案 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)