簡體   English   中英

在PHP中使用PDO綁定參數

[英]Bind parameters with PDO in PHP

我在php中使用PDO。 但是,當我的查詢有任何關鍵字,如“'”表示連字符,它會中斷並通過錯誤。 我准備通過互聯網找到解決方案綁定參數與查詢,它工作正常。 但問題是我在循環中構建查詢,我無法在循環中綁定參數。 這是我用空格分割數組並在每個關鍵字上運行查詢的代碼。 前三個單詞只有查詢和超過3個單詞我使用循環來連接所有數組元素和相同的多於6個單詞我正在使用MATCH查詢。 有沒有辦法逃脫該連字符或我們如何在我的情況下使用循環綁定參數?

        $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運算符顯示記錄。 所以對於第一個條件使用了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來應用過濾器和未命名的參數?

盡可能使用“延遲”綁定 - 將數據傳遞給執行將大大縮短您的代碼。 請參閱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()){
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM