2016-09-03 120 views
-1

我需要爲網頁創建動態查詢。用戶可以選擇他們想要搜索的類別(SQL數據庫中的列名)以及他們正在查找的值。我運行了一些類似的帖子在stackoverflow和其他網站,但我無法找到解決方案。我使用下面的代碼(它用於測試,所以我在類別名稱和值中寫入的類別)。如果我不嘗試動態綁定參數,查詢效果很好,我可以打印$ tester數組的值。這個問題可以解決什麼問題?我想問題是'call_user_func_array ...'部分。PHP,mysqli:動態預處理語句不起作用

$stmt = mysqli_stmt_init($conn); 
//The category names and variable names 
$cat1 = "LCVAR"; 
$cat2 = "APOLG"; 
$LCVAR = "KALOCSA"; 
$APOLG = "magyar"; 
//creating the statement 
$statement = "SELECT VNEV,KNEV FROM TORZS WHERE "; 
$statement = $statement . " " . $cat1 . " ". "=?". " ". "AND" . " "; 
$statement = $statement . " " . $cat2 . " ". "=?"; 
//SELECT VNEV,KNEV FROM TORZS WHERE LCVAR =? AND APOLG =? 
mysqli_stmt_prepare($stmt,$statement); 
$a_params = array(); 
$a_param_type = array("s","s"); 
$a_bind_params = array($cat1 => $LCVAR,$cat2 => $APOLG); 
$param_type = ''; 
// creating array for call_user_function_array 
$n = count($a_param_type); 
for($i = 0; $i < $n; $i++) { 
$param_type .= $a_param_type[$i]; 
} 
$a_params[] = &$param_type; 
for($i = 0; $i < $n; $i++) { 
$a_params[] = &$a_bind_params[$i]; 
} 
call_user_func_array(array($stmt,'mysqli_stmt_bind_param'),$a_bind_params); 
mysqli_stmt_execute($stmt); 
$result = array(); 
mysqli_stmt_bind_result($stmt, $result['VNEV'], $result['KNEV']); 
$tester = array(); 
while(mysqli_stmt_fetch($stmt)){ 
$tester[] = array($result['VNEV'],$result['KNEV']) ; 
} 

EDIT 1:

print_r($stmt)的結果:

結果的 print_r($a_bind_params)
mysqli_stmt Object 
    ([affected_rows] => 0 
     [insert_id] => 0 
     [num_rows] => 0 
     [param_count] => 2 
     [field_count] => 2 
     [errno] => 0 
     [error] => 
     [error_list] => Array () 
     [sqlstate] => 00000 
     [id] => 1) 

 Array ([LCVAR] => KALOCSA 
       [APOLG] => magyar) 
+0

什麼問題? 「不工作」非常模糊。你做了什麼來調試它?在將它們傳遞給'mysqli_stmt_prepare'以查看它們是否正確之前,您是否查看了生成的查詢? – Quentin

+0

是的,我查了查詢。如果我不動態地嘗試綁定參數,並且我在「靜態」語句中給出參數,則一切正常。我想這個問題可能是'call_user_func_array(array($ stmt,'mysqli_stmt_bind_param'),$ a_bind_params)'部分。 –

+0

我之前寫過,查詢本身在這種狀態下正常工作。當我想使用動態參數綁定並使用call_user_func_array時,問題就開始了。 –

回答

0

PHP Manual page for bind_param

注意:

將mysqli_stmt_bind_param()和call_user_func_array()一起使用時必須小心。請注意, mysqli_stmt_bind_param()需要通過 引用傳遞的參數,而call_user_func_array()可以接受作爲參數的 可以表示引用或值的變量列表。

除此之外,因爲你需要告訴我們到底是什麼問題沒有人可以給你一個清晰的解決方案,你的PHP error log告訴你和你的MySQLi stmt error說。

如果你可以輸出你的SQL查詢的實際內容(print_r($stmt))以及你綁定的參數實際上是什麼(print_r($a_bind_params)),那麼對你自己和我們也是有幫助的。

編輯你的問題,並添加這些細節,我相信一個解決方案將是顯而易見的。


Ps作爲由Fred-II引用您可以簡化$statement有:

$statement = $statement . " " . $cat1 . " ". "=?". " ". "AND" . " "; 

成爲:

$statement .= " " . $cat1 . " ". "=?". " ". "AND" . " "; 

和應用這個每次(兩次我可以看到),該您聲明的變量值包含變量前面的值,這就是語法爲您所做的。

+0

在這種情況下,我該怎麼辦才能解決這個問題?我對PHP很陌生。 –

+0

做我在我的回答中提出的建議,列出你的MySQLi錯誤和你的PHP錯誤是什麼,然後搜索堆棧溢出來解決'bind_param'問題,如果這是主要錯誤,你將不會第一個有這個問題的人。 @IstvánBarna – Martin

+0

謝謝! print_r($ stmt):mysqli_stmt Object([affected_rows] => 0 [insert_id] => 0 [num_rows] => 0 [param_count] => 2 [field_count] => 2 [errno] => 0 [error] => [error_list] => Array()[sqlstate] => 00000 [id] => 1)print_r($ a_bind_params):Array([LCVAR] => KALOCSA [APOLG] => magyar) –