【问题标题】:PDO associative arrays - return associativePDO 关联数组 - 返回关联
【发布时间】:2013-03-08 21:59:59
【问题描述】:

我有这个代码:

$dbInstance = DB_Instance::getDBO();
$statement = $dbInstance->prepare("SELECT id, name FROM language ORDER BY id");
$statement->execute();      
$rows = $statement->fetchAll(); 

//Create associative array wuth id set as an index in array
$languages = array();
foreach($rows as $r) {
    $languages[$r['id']] = $r['name'];
}
return $languages;

我不知道如何使用 PDO 语句来获得与数组 $languages 产生的相同结果。我尝试了一些不同的 fetch_styles。

我尝试了一些不同的风格,我可以得到这样的:

[0] svenska
[1] engelska

但我想要:

[1] svenska
[2] engelska

(其中 1 和 2 是数据库中 id 的值)

我想我可以创建一个函数并用FETCH_FUNC 调用它,但我也不确定这会不会很棒。

以上是最好/最干净的方法吗?

【问题讨论】:

  • 如果你想返回一个带有PDO的关联数组,做$rows = $statement->fetchAll(PDO::FETCH_ASSOC);然后你可以参考$rows[$row_num][$col_name]
  • 我明白你现在的要求。请查看我的更新答案以解决您的特定问题。

标签: php arrays pdo associative


【解决方案1】:
<?php
$dbhost = 'somehost';
$dbuser = 'someuser';
$dbpw = 'somepw';
$dbname = 'somename';
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,];
$dsn = "mysql:host=$dbhost;dbname=$dbname;";
$pdo = new PDO($dsn, $dbuser, $dbpw, $options);

$data = $pdo->query("SELECT * FROM language")->fetchAll(\PDO::FETCH_UNIQUE);
var_dump($data);

FETCH_UNIQUE 成功了...

【讨论】:

    【解决方案2】:

    不确定是否有更好的方法。你可以试试这个?

    $rows = $statement->fetchAll(PDO::FETCH_ASSOC);
    
    $languages = array();
    
    function getLangs($col, $row) {
         $languages[$col['id']] = $col['name'];
    }
    
    array_walk($rows, 'getLangs');
    

    foreach 循环没有任何问题。我实际上会使用你所拥有的。很难比这更干净......

    更新:

    在仔细阅读您的问题后,您真正应该问的是您是否可以格式化您的查询,以使结果以不同的格式返回。

    因此返回您的正常 SELECT 查询的方式是:

    +----+----------+
    | id |     name |
    +----+----------+
    |  1 |  svenska |
    |  2 | engelska |
    | .. |      ... |
    | .. |      ... |
    +----+----------+
    
    $row = array(
        row_1 => array(
            id   => "1",
            name => "svenska"
        ),
        row_2 => array(
            id   => "2",
            name => "engelska"
        ),
        row_3 => array(
            id   => "...",
            name => "..."
        ),
        row_4 => array(
            id   => "...",
            name => "..."
        )
    )
    
    $row[$row_number][$column_name] = $value
    

    您要求的是某种方式来返回您的查询结果,如下所示:

    // Query result is only one row, with each 'id' as column name
    // And the 'name' from the same row as it's value...
    
    +---------+----------+-----+-----+-----+
    |       1 |        2 | ... | ... | ... |
    +---------+----------+-----+-----+-----+
    | svenska | engelska | ... | ... | ... |
    +---------+----------+-----+-----+-----+
    
    $row = array(
        row_1 => array(
              1 => "svenska",
              2 => "engelska",
            ... => "...",
            ... => "...",
            ... => "..."
        )
    )
    
    $languages = $row[row_1];
    $languages[$id] = $name;
    

    老实说,我不完全确定你可以在 SQL 中使用do this。即使可以,我也建议不要这样做。对于缩放表来说,这将是可怕的。如果您的表格是静态的,那么为什么不按照我刚开始提到的方式对其进行格式化呢?为什么不把它放在包含文件的静态 PHP 数组中?

    【讨论】:

    • 非常感谢! :-) 你的意思是。为什么我应该将它包含在包含文件的静态 PHP 数组中?这有什么意义?
    • @bestprogrammerintheworld 我不知道它是否是静态表,因为语言将永远存在,它们在数据库中的唯一原因是通过查询来查找它们,为什么不在你的脚本中手动创建一个数组(即include "lang.php";?再说一次,我对有问题的表一无所知,所以我只是在这里推断。
    【解决方案3】:

    大家都忘记了

    $sth->fetchAll(PDO::FETCH_KEY_PAIR);
    

    【讨论】:

    • 如果您使用多个列,这可能是一个更好的解决方案:$STH-&gt;fetchAll(PDO::FETCH_ASSOC);
    • 这是最好的答案。 @dangre00,该评论虽然属实,但超出了 OP 问题的范围,只会使水变得混乱。
    • 这是正确答案。它恰好需要 2 列。第一列是关键。第二列是值。例如:"SELECT some_key, some_value FROM some_table GROUP BY some_key;"
    • Documentation php.net/manual/en/… "PDO::FETCH_KEY_PAIR 将一个双列结果提取到一个数组中,其中第一列是键,第二列是值。可用自PHP 5.2.3。”示例:php.net/manual/en/pdostatement.fetchall.php#120517
    【解决方案4】:

    我想你可能正在寻找$result = $sth-&gt;fetch(PDO::FETCH_ASSOC);

    参考:http://php.net/manual/en/pdostatement.fetch.php

    [编辑] 哎呀迟到了 :)

    【讨论】:

    • 是的,我就像“该死的让我”......但我不太确定时间......嗯,哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多