【问题标题】:PHP 5.5, can't get call_user_func_array to work with bing_paramPHP 5.5,无法让 call_user_func_array 与 bing_param 一起使用
【发布时间】:2017-10-17 10:59:32
【问题描述】:

我的 PHP 版本为 5.5.9-1,并且在调用 stmt 的 call_user_func_array 和 bind_param 时遇到问题。我有以下代码

$query = "SELECT * FROM studentTable WHERE firstname = ?";
if(!($stmt = $conn->prepare($query))){
    echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    return;
}
$paramType= 's';
$paramValue= 'bob';
$a_params = array(&$paramType, &$paramValue);
call_user_func_array(array($stmt, 'bind_param'),$a_params)

我收到以下错误,我不知道为什么

Binding parameters failed: (0) 

我尝试包装字符串“'s'”,但报告没有足够的参数。我做错了什么?

谢谢

更新

我已经尝试了php5.3 - mysqli_stmt:bind_params with call_user_func_array warnings 的代码,但仍然无法正常工作

【问题讨论】:

  • 为什么在stmt上使用call_user_func_array而不是直接调用bind_param?
  • 我想动态添加绑定,只是想让示例工作
  • Your code basically works,您是否 100% 确定错误不是来自其他地方?有没有可能,你的错误甚至不是错误?我猜你检查错误的方式是错误的,因为你没有检查类型安全。
  • 此代码缺少可验证的示例和可靠的错误消息

标签: php mysql mysqli prepared-statement call-user-func-array


【解决方案1】:

我遇到了类似的问题(我只是不记得到底是什么问题),我已经使用 ReflectionMethod 解决了这种情况。

$type = 's';
$parameter = 'bob';

$values = [$type , &$parameter];

$reflectionMethod = new \ReflectionMethod($statement , 'bind_param');
$reflectionMethod->invokeArgs($statement , $values);

$statement->execute();

上面的代码来自我自己的simple study case。在 Debian Jessie 上使用 PHP 5.5 创建并使用 PHP 7(很久以前......)进行测试。

毕竟,您的代码也应该可以正常工作。通过反射,这段代码和你的代码做同样的事情。

Ps.:正如您在下面的 cmets 中看到的那样,它比 call_user_func_array 慢,应该在生产中避免。

【讨论】:

  • PHP 中的反射很慢,在生产中应该避免,Daniel 的方法应该可以工作
  • @DanFromGermany 我同意你的观点,作为一个研究案例,这只是另一种可能性。
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 2018-01-02
  • 2016-11-14
  • 2015-02-01
  • 2019-05-10
  • 2017-11-20
  • 2011-05-24
  • 2019-05-17
相关资源
最近更新 更多