生成的MySQL' AND#39;选择表现得像'或#39;选择

时间:2015-03-26 13:13:50

标签: php mysql select

我正在尝试构建一个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);
        }      

我很累 - 你能发现问题吗? 但是

1 个答案:

答案 0 :(得分:1)

可能存在问题:

for ($a=0; $a<$count_keywords; $a++) {
    $keyword = "%" . $keywords[$a] . "%";
    $stmt->bindParam(':keyword', $keyword);
}

每次出现的:关键字都会替换为$ keywords数组中的最后一项。