2015-06-12 40 views
-1

我試圖遍歷一個PHP數組來構建我的查詢:通過數組循環創建mysqli的查詢

$args = array("this", "that", "other"); 

$arg_string = ''; 

foreach ($args as $key => $value) { 
    $arg_string .= "&& StockMastID LIKE '%{".$value."}%' "; 
} 

$arg_string = substr($arg_string, 3); // Remove && from first $args 

$query = $db->query("SELECT * FROM tblStockDet WHERE `$arg_string`"); 

所以,從理論上講,查詢現在應該是:

$query = $db->query("SELECT * FROM tblStockDet WHERE StockMastID LIKE '%{this}%' && StockMastID LIKE '%{that}%' && StockMastID LIKE '%{other}%'"); 

這是不起作用,因爲執行查詢時出現Fatal error: Call to a member function fetch_assoc() on a non-object錯誤。查詢執行得很好,如果我手動輸入它而不是使用循環,所以必須在foreach語法中出現錯誤,或者在查詢中有$arg_string左右的引號或打勾,但我無法弄清楚它是什麼是。

注意:或者,我是否應該放棄這一點而改用REGEXP?如果是這樣,那看起來如何?

回答

2

你真的應該用事先準備好的聲明,但你在這裏有一個問題:

$query = $db->query("SELECT * FROM tblStockDet WHERE `$arg_string`"); 
                ^  ^

這些字符將成爲你的查詢字符串的一部分。反引號會導致您的查詢完全失敗,這是您現在遇到的問題。反引號用於表名和列名等標識符。

我認爲{ ... }捲曲引號是故意的,因爲您似乎也將它們包含在您的工作查詢中。如果沒有,你應該刪除它們。

0

我發現了2個錯誤:

  1. 從您的查詢字符串中刪除{}

    所以更改此設置:

    $arg_string .= "&& StockMastID LIKE '%{".$value."}%' "; 
    

    這樣:

    $arg_string .= "&& StockMastID LIKE '%".$value."%' "; 
    
  2. 不必要'報價:

    改變這一點:

    "SELECT * FROM tblStockDet WHERE `$arg_string`" 
    

    到這樣的:

    "SELECT * FROM tblStockDet WHERE $arg_string"