我写了一个会计网站,里面有很多 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() 返回结果对象”......