PHP MySQLi准备语句并获取列的子集

PHP MySQLi准备语句并获取列的子集,php,mysql,mysqli,Php,Mysql,Mysqli,我使用MySQLi和PHP调用一个存储的MySQL例程,其中包含准备好的语句。它返回一个包含数十列的结果集 $stmt = $dbconnection->prepare("CALL SomebodysDbProcedure(?);"); $stmt->bind_param("s", $idvalue); $stmt->execute(); $stmt->bind_result($col1, $col2, $col3, ...); 然而,我只对输出列的子集感兴趣 表示需要

我使用MySQLi和PHP调用一个存储的MySQL例程,其中包含准备好的语句。它返回一个包含数十列的结果集

$stmt = $dbconnection->prepare("CALL SomebodysDbProcedure(?);");
$stmt->bind_param("s", $idvalue);
$stmt->execute();
$stmt->bind_result($col1, $col2, $col3, ...);
然而,我只对输出列的子集感兴趣

表示需要使用
bind\u result()
来处理返回的完整列集:

请注意,所有列必须在
mysqli\u stmt\u execute()之后绑定
调用
mysqli\u stmt\u 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();
}

尝试使用fetch_字段php方法:

array mysqli_fetch_fields ( mysqli_result $result )

乔纳森·梅哈克的回答引导我朝着正确的方向前进。在PHP上,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文件中的连续调用似乎无法使用此方法。

此方法不是基于
$mysqli->query
?这似乎不涉及事先准备好的声明,似乎很有希望。正如您所说,该函数返回一个
stdClass
对象数组。但是如何访问
stdClass
对象中的字段(例如创建的
date\u
)呢?它不应该是数组($field->name,$valid\u fields)
$row=new stdClass()中的
?您在$field->name部分是正确的。我更新了。可以将字段作为对象的属性进行访问。因此,您将返回一个名为$row的对象数组。获取标题字段$row->title;我现在看到了字段,但它们都是空的。可能是我做错了什么。顺便说一句,我得到了一个类似的工作解决方案(见下文)。真棒。好吧,我想你该走了。给我一个“正确的分数”怎么样?:-)