14

私はこのコードを持っています:

$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それがそれほど素晴らしいかどうかもわかりません。

上記はそれを行うための最良/最もクリーンな方法ですか?

4

4 に答える 4

25

誰もが忘れていた

$sth->fetchAll(PDO::FETCH_KEY_PAIR);
于 2014-02-13T19:50:58.527 に答える
13

もっと良い方法があるかどうかはよくわかりません。あなたはこれを試すことができますか?

$rows = $statement->fetchAll(PDO::FETCH_ASSOC);

$languages = array();

function getLangs($col, $row) {
     $languages[$col['id']] = $col['name'];
}

array_walk($rows, 'getLangs');

foreachループに問題はありません。私は実際にあなたが持っているものを使います。それよりきれいにするのは難しいです...

アップデート:

質問を注意深く読み直した後、本当に質問する必要があるのは、結果が別の形式で返されるようにQUERYをフォーマットできるかどうかです。

したがって、通常の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でこれを実行できるかどうかは完全にはわかりません。できたとしても、私はそれに対してもお勧めします。スケーリングテーブルにとっては恐ろしいことです。テーブルが静的な場合は、最初に述べた方法でフォーマットしてみませんか?インクルードファイルの静的PHP配列にそれを入れてみませんか?

于 2013-03-20T16:07:43.020 に答える
6

私はあなたが探しているかもしれないと思います$result = $sth->fetch(PDO::FETCH_ASSOC);

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

[編集]おっと遅くまで:)

于 2013-03-20T16:00:36.803 に答える
0
<?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トリックを行います...

于 2020-10-28T20:18:50.080 に答える