PHP,mysqli:动态准备语句不起作用

PHP,mysqli:动态准备语句不起作用,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,我需要为网页创建动态查询。用户可以选择要搜索的类别(SQL数据库中的列名)以及要搜索的值。我在stackoverflow和其他网站上浏览了一些类似的帖子,但没有找到解决方案。我使用下面的代码(它是为了测试,所以我在类别名称和值中写的类别)。如果我不尝试动态绑定参数,那么查询工作正常,我可以打印$tester数组的值。这个问题的解决方案是什么?我想问题出在“调用用户函数数组…”部分 $stmt = mysqli_stmt_init($conn); //The category names and

我需要为网页创建动态查询。用户可以选择要搜索的类别(SQL数据库中的列名)以及要搜索的值。我在stackoverflow和其他网站上浏览了一些类似的帖子,但没有找到解决方案。我使用下面的代码(它是为了测试,所以我在类别名称和值中写的类别)。如果我不尝试动态绑定参数,那么查询工作正常,我可以打印$tester数组的值。这个问题的解决方案是什么?我想问题出在“调用用户函数数组…”部分

$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']) ;
}
打印的结果($a\u bind\u params)

      Array ( [LCVAR] => KALOCSA
              [APOLG] => magyar ) 
从:

注:

在将mysqli_stmt_bind_param()与call_user_func_array()结合使用时,必须小心。注意 mysqli_stmt_bind_param()需要传递参数 引用,而call_user_func_array()可以接受作为参数a 可以表示引用或值的变量列表

除此之外,没有人能给你一个更清晰的解决方案,因为你需要准确地告诉我们问题是什么,你在告诉你什么,你在说什么

如果您可以输出SQL查询的实际内容(
print\r($stmt)
)以及绑定参数的实际内容(
print\r($a\u bind\u params)
),这可能对您自己和我们都有帮助

编辑您的问题并添加这些详细信息,我相信解决方案将显而易见


p.s.如Fred ii所述,您可以通过以下方式简化您的
$statement

 $statement = $statement . " " . $cat1 . " ". "=?". " ". "AND" . " ";
成为:

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

每次(我可以看到两次)声明一个变量值时,都会应用这个函数,其中包含值前面的变量,这就是
=
语法为您所做的

有什么问题吗?“不起作用”是非常模糊的。你做了什么来调试它?在将生成的查询传递给
mysqli\u stmt\u prepare
之前,您是否查看了它们是否正确?是的,我检查了查询。如果我不尝试动态绑定参数,并且在“static”语句中给出参数,那么一切都可以正常工作。我想问题可能出在“call_user_func_array(array($stmt,'mysqli_stmt_bind_param'),$a_bind_params)”部分。我之前写过,查询本身在这种状态下运行良好。当我想使用动态参数绑定并使用call\u user\u func\u数组时,问题就开始了。在这种情况下,我应该如何解决这个问题?我对PHP很陌生。按照我在回答中的建议去做,列出你的MySQLi错误和你的PHP错误是什么,然后搜索堆栈溢出来解决
bind_param
问题,如果这是主要错误,你不会是第一个出现此问题的人@伊斯特瓦恩巴纳坦克斯!打印结果($stmt):mysqli\u stmt对象([受影响的行]=>0[插入id]=>0[行数]=>0[参数计数]=>2[字段计数]=>2[错误号]=>0[错误]=>0[错误列表]=>Array()[sqlstate]=>00000[id]=>1)打印结果($a\u绑定参数):Array([LCVAR]=>KALOCSA[APOLG]=>magyar)@IstvánBarna编辑您的问题,并将这些详细信息更新到您的问题中。注释中的代码很难阅读。@IstvánBarna我看到了,这很好。您的更新显示SQL中没有错误,请阅读
[errno]=>0
,因此您需要查找错误是否在PHP代码中
 $statement .= " " . $cat1 . " ". "=?". " ". "AND" . " ";