0

我写了一个会计网站,里面有很多 MySQL 语句。为了防止 SQL 注入,我对用户输入的任何数据使用准备好的语句。

为了避免必须编写准备和绑定语句的步骤,我具有以下功能:

function executeSql($mysqli,$query_string,$params=null,$paramtypes=null){
    $nr_params=strlen($paramtypes);
    $query_type = substr($query_string,0,3);
    $stmt = $mysqli->prepare($query_string);
    $queryParams[] = $paramtypes;
    $counter=1;
    if($nr_params>1){
        while($counter<=$nr_params){
             $queryParams[$counter]=&$params[$counter-1];
             $counter++;
        }
    } else {
        $queryParams[1]=&$params;
    }
    // Actual binding of the statement. Taking into account a variable numbers of '?' in the query string.
    call_user_func_array(array($stmt,'bind_param'),$queryParams);
    // Execution of the statement
    $stmt->execute();
    // Part where i'd like to have a substitute for:
    $result = $stmt->get_result();
    return $result;
    }

在最后一部分中,我想返回结果,因为然后使用结果我可以处理每一行。问题是生产服务器上没有安装 mysqlnd 驱动,所以函数 $stmt->get_result() 不能使用。我试图将结果绑定到变量中,但又一次,每个查询都返回不同数量的列。

任何人都知道如何解决这个问题?

总而言之(回应评论):

如何在无法使用 $stmt->get_result(); 时检索已执行 MySQLi 语句的结果对象;

亲切的问候,

EJG

PS 我知道代码并非完美无缺,例如,如果字符串被用作变量来绑定到语句,但这很容易修复。

更新:我遇到了函数 $stmt->result_metadata(); 虽然据说函数名称仅暗示元数据,但 php 文档指出:“如果传递给 mysqli_prepare() 的语句是产生结果集的语句,则 mysqli_stmt_result_metadata() 返回结果对象”......

4

0 回答 0