什么是PHP中动态mysqli bind_param参数的简单解决方案?

时间:2009-04-16 06:59:32

标签: mysqli

为了动态构建bind_param,我在其他SO帖子上找到了这个。

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

有人可以用简单的英语为我打破这个吗?我特别迷失了,第一个参数是一个数组。

3 个答案:

答案 0 :(得分:16)

array($stmt, 'bindparams') 

是PHP在对象$stmt上识别方法bind_params的方法,因为PHP 5你不需要再使用前面的&(而且mysqli是PHP 5所以这看起来像一个老帖子中的故障)。

您可以看到类似的示例here

所以

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

基本上意味着

$stmt->bind_params($array_of_params[0], $array_of_params[1] ... $array_of_params[N])

答案 1 :(得分:2)

据我所知,你不能传递例如 $userid == "ALL" 到mysqli-statement-Object的bind_param方法,因为这个方法希望通过引用传递参数。显然,对于“就地”评估的表达式的结果,这是不可能的。

作为一种解决方法,我将程序的第二部分更改为

$userIdEmpty = $userid == "ALL";
$locationEmpty = $location = "ALL";
$stmt->bind_param( "siiiii", 
  "active", $userid, $userIdEmpty,
  $location, $locationEmpty,
  $limit);

就像那样,布尔运算的结果可以通过引用传递。

答案 2 :(得分:1)

有一种更简单的方法可以做到这一点。

创建这个准备好的声明:

select * from mytable 
 where status = ? and (userid = ? or ?) 
 and (location = ? or ?)
 order by `date` desc, time desc
 limt ?

并传递args以这样绑定:

$stmt = $mysqli->prepare( [statement above] );
$stmt->bind_param( "siiiii", 
  "active", $userid, $userid == "ALL", 
  $location, $location == "ALL", 
  $limit); 

当user_id等于第一个被替换的参数时,或者当第二个被替换的参数为真时,谓词(user_id = ? or ?)将为真。

当转换为int时,

$user_id将是其值,当它是数字的字符串表示时,否则为零。表达式$userid == "ALL"将计算为布尔值,该布尔值将传递给bind_param。我们不能告诉bind_param参数是布尔值(格式字符串只能理解string,int,double和blob),所以bind_param会将布尔值转换为int,这对我们有效。

只要数据库中没有user_id或location_id为零,你就可以了。