我正在尝试构建一个MySQL搜索,以匹配搜索列中任何顺序发生的关键字(而不仅仅是通常情况下的整个短语)。我的班级功能是:
public function keywords_author($keywords, $author) {
$keywords = explode(" ", trim($keywords));
$keywords = array_filter($keywords);
$count_keywords = count($keywords);
if ($count_keywords != 0) {
$query = "SELECT * FROM `table` WHERE ";
$query_echo = $query;
$a = 0;
while ($a < $count_keywords) {
$query .= "`column` LIKE :keyword ";
$query_echo .= "`column` LIKE '%" . $keywords[$a] . "%' ";
$a++;
if ($a < $count_keywords) {
$query .= " && ";
$query_echo .= " && ";
}
}
$stmt = $this->db->prepare($query);
for ($a=0; $a<$count_keywords; $a++) {
$keyword = "%" . $keywords[$a] . "%";
$stmt->bindParam(':keyword', $keyword);
}
$stmt->execute();
$output = '';
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// build $output
}
echo $output;
echo $query_echo;
}
}
我刚刚添加了$ query_echo来检查正在构建的查询,即:
SELECT * FROM `table`
WHERE `column` LIKE '%php%'
&& title LIKE '%mysql%'
&& title LIKE '%jquery%'
&& title LIKE '%ajax%'
当我将其复制到phpMyAdmin中的SQL命令行时,这样可以正常工作,仅返回匹配所有关键字的记录,但是当我在我的站点中运行类文件时,它的行为类似于OR选择并返回结果,其中任何一个关键字出现在列中。
我很困惑!任何想法都会有很大的帮助!
大卫 -
谢谢,David Kmenta - 这肯定是朝着正确方向迈出的一步,现在我得到了正确的查询:
SELECT * FROM表WHERE列LIKE:keyword0 AND列LIKE:keyword1 AND列LIKE:keyword2 AND列LIKE:keyword3 AND列LIKE:keyword4
但它仍然只返回最后一个值的结果。我确信它是包含新bindParam语句的循环中的一个基本的,可能是明显的错误:
for ($a=0; $a<$count_keywords; $a++) {
$keyword = "%" . $keywords[$a] . "%";
$stmt->bindParam(':keyword'.$a, $keyword);
}
我很累 - 你能发现问题吗? 但是
答案 0 :(得分:1)
可能存在问题:
for ($a=0; $a<$count_keywords; $a++) {
$keyword = "%" . $keywords[$a] . "%";
$stmt->bindParam(':keyword', $keyword);
}
每次出现的:关键字都会替换为$ keywords数组中的最后一项。