在PHP中将参数与PDO绑定

比拉尔

我在php中使用PDO。但是,当我的查询中包含“”之类的任何关键字时,表示连字符会中断并出现错误。我准备在Internet上搜索并找到将参数与查询绑定的解决方案,并且效果很好。但是问题是我正在循环中建立查询,而我无法在循环中绑定参数。这是我用空间分割数组并在每个关键字上运行查询的代码。前3个单词仅具有查询条件,然后我使用循环连接所有数组元素则超过3个单词,而使用MATCH查询则与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()){
}
大卫·斯特拉坎(David Strachan)

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

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

"SELECT * FROM faq ";

其余代码是动态的。在过滤记录时,将使用WHERE子句,并使用AND&OR运算符基于多个条件来过滤记录。如果第一个条件和第二个条件都为真,则AND运算符将显示一条记录。如果第一个条件或第二个条件为true,则OR运算符将显示一条记录。因此对于第一个条件,使用WHERE,但此后必须使用AND或OR(在您的示例中使用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中将大大缩短您的代码。请参阅PDO信息

//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()){
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PHP中将参数与PDO绑定

来自分类Dev

PHP PDO dblib参数未绑定

来自分类Dev

PDO绑定参数

来自分类Dev

PHP:PDO使用绑定参数引发SQL语法错误

来自分类Dev

PHP MySQL PDO绑定输入/输出相同参数

来自分类Dev

PHP PDO和SQL搜索通配符绑定参数

来自分类Dev

如何在php中将数组绑定为参数?

来自分类Dev

pdo绑定参数在循环中

来自分类Dev

PDO和PHP帮助... SQLSTATE [HY093]:无效的参数编号:未绑定任何参数

来自分类Dev

参数绑定必须更安全(PDO)

来自分类Dev

PHP MySQL绑定参数

来自分类Dev

PHP PDO 无效的参数号

来自分类Dev

PHP PDO-动态绑定变量数

来自分类Dev

将 php 变量绑定到 pdo 查询

来自分类Dev

来自绑定参数的 PHP 错误

来自分类Dev

PDO:显示表键无法正确绑定参数

来自分类Dev

在为PDO绑定参数之后构建响应数组

来自分类Dev

尝试将pdo绑定参数插入mysql数据库

来自分类Dev

PDO动态参数绑定where子句AND日期之间

来自分类Dev

在为PDO绑定参数之后构建响应数组

来自分类Dev

PDO多参数绑定准备好的语句

来自分类Dev

PHP PDO(MSSQL)无法获取OUPUT参数

来自分类Dev

从抓取URL参数插入数据-PHP PDO

来自分类Dev

PHP PDO准备语句参数导致错误

来自分类Dev

带有参数的PHP PDO错误

来自分类Dev

从抓取URL参数插入数据-PHP PDO

来自分类Dev

PHP PDO错误-:无效的参数编号

来自分类Dev

在PLSQL中将输入参数绑定到游标中的like子句

来自分类Dev

如何在Vanilla JS中将URL参数与输入字段绑定?