在PHP中用PDO绑定参数

在PHP中用PDO绑定参数,php,mysql,pdo,Php,Mysql,Pdo,我在php中使用PDO。但是,当我的查询有任何关键字“like”时,表示连字符,它会中断并通过一个错误。 我在互联网上准备好了,找到了用查询绑定参数的解决方案,效果很好。 但问题是我正在循环中构建查询,无法在循环中绑定参数。 下面是我用空格分割数组并对每个关键字运行查询的代码。 前3个单词将只有like查询和3个以上的单词,我使用循环连接所有数组元素,相同的单词和6个以上的单词,我使用匹配查询。 在我的例子中,有没有任何方法可以避免使用连字符,或者我们如何使用循环绑定参数 $ke

我在php中使用PDO。但是,当我的查询有任何关键字“like”时,表示连字符,它会中断并通过一个错误。 我在互联网上准备好了,找到了用查询绑定参数的解决方案,效果很好。 但问题是我正在循环中构建查询,无法在循环中绑定参数。 下面是我用空格分割数组并对每个关键字运行查询的代码。 前3个单词将只有like查询和3个以上的单词,我使用循环连接所有数组元素,相同的单词和6个以上的单词,我使用匹配查询。 在我的例子中,有没有任何方法可以避免使用连字符,或者我们如何使用循环绑定参数

        $keyword = ($_POST['keyword']);
        $keyword_array = split(' ',$keyword);

        /* Query For first Three Words */
        if(count($keyword_array)<=3){
                    $sql = "SELECT * FROM faq WHERE question  LIKE '%$keyword%' limit 14";
        }
        /* Query through all array when words are greater then 3 */
        if(count($keyword_array)< 6){
            $sql = "SELECT * FROM faq WHERE question ";
                for($i = 0 ; $i<count($keyword_array); $i++){

                if($i==0){
                                $sql.=" LIKE '%$keyword_array[$i]%'";
                }else{
                                $sql.=" or question LIKE '%$keyword_array[$i]%' ";
                }
            }
                        $sql .= " ORDER BY question ASC LIMIT 0, 8";
        }
        /* Appl FULL TEXT in natual language mode once we have enough phrase */
        else if(count($keyword_array)>=6){
                $sql = "SELECT * FROM faq WHERE ";
                    for($i = 0 ; $i<count($keyword_array); $i++){

                    if($i==0){
                                    $sql.=" MATCH (answer) AGAINST ('$keyword_array[$i]' in natural language mode) ";
                    }else{
                                    $sql.=" or MATCH(answer) AGAINST('$keyword_array[$i]' in natural language mode) ";
                    }
            }
                $sql .= "  limit 0,5";
        }


            $execute_faq_query = $conn->query($sql);
            $execute_faq_query->setFetchMode(PDO::FETCH_ASSOC);

            while ($list = $execute_faq_query->fetch()){
}

构建动态查询时,需要将查询中的静态部分与动态部分分开

您可以看到以下代码是静态的

"SELECT * FROM faq ";
代码的其余部分是动态的。筛选记录时,将使用WHERE子句和and&OR运算符根据多个条件筛选记录。如果第一个条件和第二个条件都为真,AND运算符将显示一条记录。如果第一个条件或第二个条件为真,OR运算符将显示一条记录。因此,对于第一个条件,其中使用了,但之后必须使用AND或or,在您的示例中使用AND或or

// Static code
sql = "SELECT * FROM `faq`"
// Set initial condition to WHERE       
clause = "WHERE";       
if( !empty( filter )){
    Add clause to sql 
    Add condition to sql
    change clause to OR or AND as required
}
对每个过滤器重复上述步骤 注意:在应用过滤器之前,过滤器不会更改,并且在更改后保持更改状态。 剩余的静态代码(如果有)将在处理完所有筛选器后添加

我已使用Switch Case应用过滤器和未命名参数


尽可能使用延迟绑定-将数据传递到execute将大大缩短代码。看


循环应该生成SQL语句,然后执行单个SQL查询。是的,我尝试过,但我遇到了问题,因为我是PDO新手。请您帮助我处理任何循环,然后我将在所有其他循环中使用。PDO支持命名占位符,如:关键字,您可以在执行过程中引用它:关键字“=>$关键字”。将内容添加到字符串很容易,如果同时将内容添加到数组中,它们将保持同步。@tadman感谢您的回复。是的,这就是我的工作,但我有问题,而使它在循环?你能用循环显示一些东西吗?如果可能的话使用惰性绑定是的!这正是我想要的。
//Test $POST[] remove after testing
$_POST['keyword'] ="one two three four five six";
$keyword = ($_POST['keyword']);
$keyword_array = split(' ',$keyword);
$words = count($keyword_array);
echo $words;
//You need an array to store parameters
 $paramArray =array();
//Initial clause
$clause = "WHERE";
//Start with a basic stub
$sql = "SELECT * FROM faq ";
switch (true) {
    case $words <= 3:
        $sql .= " $clause question LIKE ?";
        $keyword = "%$keyword%";
        array_push($paramArray,$keyword);
        $limit = " LIMIT 14";
        break;

    case $words < 6:
        for($i = 0 ; $i<count($keyword_array); $i++){
            $sql .= " $clause question LIKE ?";
            $keyword = "%$keyword_array[$i]%";
            array_push($paramArray,$keyword);
            $clause = "OR";
            $limit = " ORDER BY question ASC LIMIT 0, 8";
        }
        break;

    case $words >=6:
        $clause = "";
        for($i = 0 ; $i<count($keyword_array); $i++){
            $sql.=" $clause MATCH (answer) AGAINST (? in natural language mode) ";
            array_push($paramArray,$keyword_array[$i]);
            $clause = "OR";
            $limit = "  limit 0,5";
        }
        break;   
}
//echo query and parameter array remove after testing
echo $sql;
echo "<br>";  
print_r($paramArray);

//Prepare and execute query 
$execute_faq_query = $conn->prepare($sql);
$execute_faq_query->execute($paramArray);
$execute_faq_query->setFetchMode(PDO::FETCH_ASSOC);
 while ($list = $execute_faq_query->fetch()){
 }