我正在使用 MySQLi 和 PHP 使用准备好的语句调用存储的 MySQL 例程。它返回一个包含数十列的结果集。
$stmt = $dbconnection->prepare("CALL SomebodysDbProcedure(?);");
$stmt->bind_param("s", $idvalue);
$stmt->execute();
$stmt->bind_result($col1, $col2, $col3, ...);
然而,我只对a subset输出列的数量。
文档 http://php.net/manual/en/mysqli-stmt.bind-result.php says bind_result()
需要处理全套返回的列数:
请注意,所有列必须在之后绑定mysqli_stmt_execute()
和
打电话之前mysqli_stmt_fetch()
.
我是否还需要为那些我不感兴趣的列添加代码?如果是这样,如果将来 MySQL 存储例程结果集扩展,甚至重新排列列,应用程序将崩溃。有解决方法吗?
我假设您只是不想为 bind_result() 函数写出所有这些变量。您可以使用如下所示的函数来代替 bind_result() 函数。将您的 $stmt 对象传递给它,您将得到一个包含您想要的字段的标准对象数组。
function getResult($stmt)
{
$valid_fields = array('title', 'date_created'); // enter field names you care about
if (is_a($stmt, 'MySQLi_STMT')) {
$result = array();
$metadata = $stmt->result_metadata();
$fields = $metadata->fetch_fields();
for (; ;)
{
$pointers = array();
$row = new \stdClass();
$pointers[] = $stmt;
foreach ($fields as $field)
{
if (in_array($field->name, $valid_fields)) {
$fieldname = $field->name;
$pointers[] = &$row->$fieldname;
}
}
call_user_func_array('mysqli_stmt_bind_result', $pointers);
if (!$stmt->fetch())
break;
$result[] = $row;
}
$metadata->free();
return $result;
}
return array();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)