4

我正在使用 MySQLi 和 PHP 来调用带有准备好的语句的存储 MySQL 例程。它返回一个包含几十列的结果集。

$stmt = $dbconnection->prepare("CALL SomebodysDbProcedure(?);");
$stmt->bind_param("s", $idvalue);
$stmt->execute();
$stmt->bind_result($col1, $col2, $col3, ...);

但是,我只对输出列的一个子集感兴趣。

文档bind_result()需要处理完整的返回列集:

请注意,所有列都必须在mysqli_stmt_execute()调用之后和之前绑定mysqli_stmt_fetch()

我是否还需要为那些我不感兴趣的列添加代码?如果是这样,如果将来扩展 MySQL 存储的例程结果集,甚至重新排列列,应用程序将中断。有解决方法吗?

4

3 回答 3

1

我假设您只是不想为 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();
}
于 2013-04-15T17:13:39.557 回答
1

Jonathan Mayhak 的回答指引我朝着正确的方向前进。在 PHP bind_result 页面上,nieprzeklinaj 提供了一个名为fetch(). 有用; 像这样使用它:

$stmt = $conn->prepare("CALL SomebodysDbProcedure(?);");
$stmt->bind_param("s", $idvalue);
$stmt->execute();
$sw = (array)(fetch($stmt));
$s = $sw[0]; // Get first row
$dateCreated = $s['date_created']; // Get field date_created

编辑:不幸的是,同一 PHP 文件中的连续调用似乎不适用于此方法。

于 2013-04-16T09:33:05.847 回答
0

尝试使用 fetch_fields php 方法:

array mysqli_fetch_fields ( mysqli_result $result )

http://php.net/manual/en/mysqli-result.fetch-fields.php

于 2013-04-15T17:15:38.910 回答