2016-09-03 63 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) –