作者:西瓜玩偶(racnil070512 at hotmail dot com) 我们都知道,在mysqli库中,通过 mysqli_stmt::execute 调用之后,我们可以进而使用 mysqli_stmt::get_result 来获取更多的信息。例如: $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_array(MYSQLI_ASSOC)) { echo $row['name'] . ': ' . $row['email'] . PHP_EOL; } 然而,方法 mysqli_stmt::get_result 的调用是依赖于 mysqlnd (MySQL原生驱动)的。在某些服务器环境中,并没有安装 mysqlnd 驱动,所以自然也无法调用 mysqli_stmt::get_result 来获取查询的结果了。此时我们可以使用下面的替代方案: function getResult($stmt) { $result = array(); $stmt->store_result(); for ($i = 0; $i < $stmt->num_rows; $i++) { $metadata = $stmt->result_metadata(); $params = array(); while($field = $metadata->fetch_field()) { $params[] = &$result[$i][$field->name]; } call_user_func_array(array($stmt, 'bind_result'), $params); $stmt->fetch(); } $stmt->free_result();
return $result;
}
这个函数中,参数为我们调用过 mysqli_stmt::execute 方法的 mysqli_stmt 对象。函数的实现步骤如下: 首先我们创建一个新的数组变量 $result 用于存储结果。 接下来我们调用 $stmt->store_result(); 将查询的结果保存至内存中(注:若查询结果非常多,则不应当使用这条语句,因为这样会大幅度增加服务器的内存使用量)。 然后我们对查询结果的每一行进行如下的操作: 我们首先获取每一行查询结果的元信息,并且从中获得结果每一列的列名(利用 $metadata->fetch_field() 获取一列的列名),例如 name 和 email 。 然后我们在 $result 中创建相应的行与列,并且将引用放在 $params ,以供后面的函数调用使用。 利用 call_user_func_array 函数,我们调用了 $stmt->bind_result() ,参数就是刚刚我们生成的 $params 数组,目的是将结果与 $result 中的元素绑定。 最后执行 $stmt->fetch() ,这个方法会获取一行查询结果,并且给上一步绑定了的参数赋值。由于在上一步中,我们绑定的参数就是 $result 中相应的元素,故结果就存入了 $result 。 接下来,我们利用 $stmt->free_result(); 的调用,清空保存在本地的MySQL查询结果(这条语句是与前面的 $stmt->store_result(); 对应的)。 最后,将 $result 返回。 要使用上面的函数,可以参考下面的例子代码: $stmt->execute(); $queryResults = getResult($stmt); foreach ($queryResults as $row) { echo $row['name'] . ': ' . $row['email'] . PHP_EOL; } 参考资料: http://stackoverflow.com/questions/10752815/mysqli-get-result-alternative http://php.net/manual/en/mysqli-stmt.get-result.php http://php.net/manual/en/class.mysqli-stmt.php
这篇文章由热心用户 西瓜玩偶 投稿,小编代表广大读者感谢西瓜玩偶,同时希望更多的读者朋友积极参与投稿,分享自己的经验。