2012-09-18 36 views
2

我試圖做這樣的一個表中進行搜索,一些參數的數目不詳:http://www.phpjabbers.com/free-scripts/mysql-search-table/search.php結合使用的mysqli

我想通了,我可以串連取決於搜索表單$ _GET一個字符串,所以所有獲得的參數後,我可以查詢:

$query = "SELECT * FROM table WHERE status = 1" 
if($_GET['param1']{ 
    $query = $query." AND param1 = ?"; 
} 
$stmt = $mysqli->prepare($query); 

這將是完美的,如果我不會有加:

$stmt->bind_param('i',$_GET['art']); 

我下面這個職位的請示離子:https://stackoverflow.com/a/11152781/679333,但通配符部分不起作用。取而代之的是for循環引用我的變量時,我將他們推入陣:

array_push($user_terms, &$_GET['var']); 

它的工作原理,但我現在得到一個「不推薦使用:在調用的時候傳遞通過引用已棄用」的警告。

我不想忽略這個警告,因爲我讀取的調用時間通過引用現在已經從PHP中被殺死。

+0

循環首席如何? – wesside

+0

我不知道如何將值轉換爲循環中的引用(如果我將變量推送到沒有引用的數組中,值將被推送,而不是引用)。 $ stmt-> bind_param()需要引用,而不是值。 – Kirby

+1

將參考值添加到數組中,如果不對其排序,它將保持順序。準備好語句後,遍歷該數組並綁定參數。 – wesside

回答

3

有點馬虎,但完成工作。

function refValues($arr){ 
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+ 
    { 
     $refs = array(); 
     foreach($arr as $key => $value) 
      $refs[$key] = &$arr[$key]; 
     return $refs; 
    } 
    return $arr; 
} 

$params = array(); 

$query = "SELECT * FROM table WHERE status = 1"; 

// Iterate over your paramters from $_GET 
foreach ($_GET as $k => $v) 
{ 
    if(!empty($v) 
    { 
    $query .= " AND $k = ?"; 
    $params[$k] = helper::sanitize($v); 
    } 
} 
// After you get through all your params... 

$stmt = $mysqli->prepare($query); 

// Bind em. 
call_user_func_array(array($stmt, 'bind_param'), refValues($params)); 

這應該這樣做,儘管我從來沒有用mysqli綁定過。讓我知道這是如何工作的。

+0

它的工作,非常感謝。如果你張貼refValues()(所以其他用戶可以看到)我會接受答案c: – Kirby

+0

你不需要它,但它是。乾杯。 – wesside

+0

'empty'在這種情況下是不夠的:例如,當一個'$ _GET'變量包含'「0」時,'empty'將表示它是空的,但它對於SQL語句來說是一個完美的合法值。 –