PHP PDOStatement:获取一行,作为第一列作为数组的键

Gra*_*ton 22 php pdostatement

PDOStatement用来查询数据库.每当我得到一个返回的行时,我希望将它$row[0]作为键提取到数组中,并将行中的后续元素作为值.

当然,我可以编写一个foreach循环和if条件组合来完成这项工作,如下所示:

private static function GetMySQLResult($dbname, $sqlString) {


        $dbh =  self::ConstructPDOObject($dbname);
         $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $result=array();
         foreach ($dbh->query($sqlString) as $row)
         {
            $result[$row[0]][]=$row[1];  // the simplest case for 2 columns, should add more to handle more columns

         }

         return $result;

}
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种现有的方法; 有没有这样的方法已经存在?

Sav*_*ova 29

积分转到devdRew.在这里查看另一个问题.

显然,你可以在答案中说明.我检查过,效果很好.

$q = $db->query("SELECT `name` AS name, `value` AS value FROM `settings`;");
$r  = $q->fetchAll(PDO::FETCH_KEY_PAIR);
Run Code Online (Sandbox Code Playgroud)

编辑

此答案要求您指定最多2列:1个键和1个值.如果您需要从数据库中检索更多密钥,请查看下面的答案并阅读@nullabilty评论.对于那些懒惰的人来说,这是他的方法:

$q->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)


Lou*_*uis 16

$stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_UNIQUE); 
Run Code Online (Sandbox Code Playgroud)

虽然有点黑客但实际上是唯一的方法,因为有人决定 FETCH_KEY_PAIR应该只需要2列结果集.

注意:第一列用于键,不以任何其他形式返回到结果集中.

  • 谢谢,我将我扩展到`PDO :: FETCH_GROUP | PDO :: FETCH_UNIQUE | PDO :: FETCH_ASSOC`以获得我所需要的. (14认同)

Xeo*_*oss 2

一些提示,您需要将正确的获取样式传递给PDOStatement->fetch()方法,这样您就不会得到双数据(数字和文本列名称)。就像 $row[0] 和 $row['id'] 一样,当您使用 PDO::FETCH_BOTH 时,它们都包含相同的值。

$result = $dbh->query($sqlString);
while ($row = $result->fetch(PDO::FETCH_NUM)) {
...
Run Code Online (Sandbox Code Playgroud)

至于你的问题,你必须获取所有结果,然后创建一个以 $row['id'] 作为键、结果行作为值的数组 - 就像你正在做的那样。我围绕 PDO 构建了整个 ORM 库,但我永远找不到任何东西可以自动执行此操作。

$result = $dbh->query($sqlString);

$results = array();
while ($row = $result->fetch(PDO::FETCH_NUM)) {
    $results[$row[0]] = $row;
}

return $results;
Run Code Online (Sandbox Code Playgroud)