1

我正在编写自己的用于查询数据库的库,并且我想封装mysqli_prepeare()mysqli_bind方法,但我想编写一个具有动态参数数量的通用方法。我的意思是你可以传递给它,例如:

array("is", $integerId, $stringName). 

我找到的唯一解决方案是:

function prepeare($notEscapedSql, $attrs)
{
    $query = mysqli_prepare($this->dbConn, $notEscapedSql);

    $ref = new ReflectionClass('mysqli_stmt'); 
    $method = $ref->getMethod("bind_param"); 
    $method->invokeArgs($query,$attrs); 

}

但这对我不起作用,并没有真正在调试上花费太多时间,因为它不是解决此问题的优雅方法,因为它使用了早期版本的 php 不支持的反射。有什么解决方案或建议吗?

4

2 回答 2

2

我不知道您为什么使用Reflection类来执行此操作以及为什么不使用$querywhich 返回mysqli_stmt对象。

此外,还将数组作为第二个参数invokeArgscall_user_func_array因此,最好array在函数的第二个参数上使用 typehint prepeare

您可以使用call_user_func_array

function prepeare($notEscapedSql, array $attrs)
{
    $mysqli_stmt = mysqli_prepare($this->dbConn, $notEscapedSql);
    call_user_func_array(array($mysqli_stmt, "bind_param"), $attrs);
    return $mysqli_stmt;
}
于 2013-05-18T20:13:47.513 回答
1

不使用 call_user_func_array 的原因是它很慢。反射较新,但速度更快。动态调用 bind_param 有点痛苦——但评论中有很多例子可以帮助你完成——

http://php.net/manual/en/mysqli-stmt.bind-param.php

基本上,你需要做这样的事情:

//arrays
$paramList = some array of parameters.
$binderList = array();
$tmpList = array();

//reflection
$ref = new ReflectionClass('mysqli_stmt'); 
$method = $ref->getMethod("bind_param");

    //loop through and perform pointer arithmetic. I know, this is horrible
    for($i=0; $i<$numParams; $i++) {
    $tmp = $paramList[$i];
    $tmpList[] = $tmp;
    $binderList[] = &$tmpList[$i]
    }

//invoke the bind_param dynamically and execute.
$method->invokeArgs($res,$binderList);   
$res->execute();  
于 2013-07-25T20:54:57.293 回答