フェッチモード

PDO::FETCH_ORI_* カーソル定数については、 カーソル定数 を参照ください。

基本的なフェッチモード

フェッチモード 概要
PDO::FETCH_DEFAULT 現在のデフォルトフェッチモードを使用するための特別な値。
PDO::FETCH_ASSOC カラム名のみでインデックス付けされた配列。
PDO::FETCH_BOTH (デフォルト) カラム番号とカラム名の両方でインデックス付けされた配列。
PDO::FETCH_NAMED 重複するカラムを保持する PDO::FETCH_ASSOC の変形。
PDO::FETCH_NUM カラム番号のみでインデックス付けされた配列。
PDO::FETCH_COLUMN 単一のカラム。
PDO::FETCH_KEY_PAIR 最初のカラムでインデックス付けされたキーと値のペア。
PDO::FETCH_FUNC 戻り値を生成するために関数を使用します。 (PDOStatement::fetchAll() のみ)
PDO::FETCH_OBJ 無名の (stdClass) オブジェクト。
PDO::FETCH_CLASS 指定されたクラスのオブジェクト。

PDO::FETCH_CLASS のオプション

これらのモードは PDO::FETCH_CLASS 使用時のオプションを実装するために使用されます。

フェッチモード 概要
PDO::FETCH_CLASSTYPE 最初のカラムをクラス名として使用します。
PDO::FETCH_PROPS_LATE プロパティを設定する前にコンストラクタを呼び出します。
PDO::FETCH_SERIALIZE PHP のシリアライズされたデータを使用します。PHP 8.1.0 以降は推奨されません。

単一結果モード

以下のモードは PDOStatement::fetchAll() では使用できません。

フェッチモード 概要
PDO::FETCH_BOUND 指定した変数に値をバインドします。
PDO::FETCH_INTO 既存のオブジェクトを更新します。
PDO::FETCH_LAZY 配列風およびオブジェクト風のアクセスのための PDORow による遅延フェッチ。

PDOStatement::fetchAll() 用の特殊な動作フラグ

以下の複数結果用の特殊モードは PDOStatement::fetchAll() でのみ動作し、 一部の他のフェッチモードとは組み合わせて使用できません。 詳細については完全なドキュメントを確認してください。

フェッチモード 概要
PDO::FETCH_GROUP 結果は最初のカラムでグループ化されます。
PDO::FETCH_UNIQUE 結果は最初のカラムで (一意に) インデックス付けされます。

重複するカラム名の処理

結果に同じ名前のカラムが複数含まれる場合があります。 たとえば、同じカラム名を持つ 2 つのテーブルを結合する場合などです。

PHP の配列やオブジェクトなどの構造は、同じ名前の複数のキーや プロパティをサポートしていないため、返される配列やオブジェクトには 同じ名前を使用する値のうち 1 つだけが含まれます。

重複する名前に対してどの値が返されるかは未定義と考えるべきです。

この問題を回避するには、エイリアスを使用してカラムに明示的に名前を付けてください。 例:

SELECT table1.created_at AS t1_created_at,
       table2.created_at AS t2_created_at
FROM table1
JOIN table2 ON table1.table2id = table2.id

PDO::FETCH_NAMEDPDO::ATTR_FETCH_TABLE_NAMES および PDO::ATTR_FETCH_CATALOG_NAMES も参照ください。

デフォルトのフェッチモードの設定

PDO::__construct() または PDO::setAttribute()PDO::ATTR_DEFAULT_FETCH_MODE を使用して、すべてのクエリに対するデフォルトのフェッチモードを設定できます。

特定のステートメントに対するデフォルトのフェッチモードは、 PDOStatement::setFetchMode() を使用して設定できます。 これはプリペアドステートメントの再利用や (foreach を使用した) イテレーションに影響します。

警告

PDOStatement::setAttribute() はデフォルトのフェッチモードの 設定には使用できません。ドライバ固有の属性のみを受け入れ、 認識されない属性は警告なく無視されます。

PDO::FETCH_DEFAULT (int)

PHP 8.0.7 以降で利用可能です。

これは PDOStatement に対する現在のデフォルトのフェッチモードを使用する特別な値です。 PDO::ATTR_STATEMENT_CLASS と共に使用するために PDOStatement を拡張する際のメソッドパラメータのデフォルト値として特に有用です。

この値は PDO::ATTR_DEFAULT_FETCH_MODE と共には使用できません。

PDO::FETCH_ASSOC (int)

PDO::FETCH_ASSOC はカラム名のみでインデックス付けされた 配列を返します。

<?php
$stmt
= $pdo->query("SELECT userid, name, country FROM users");
$row = $stmt->fetch(\PDO::FETCH_ASSOC);
print_r($row);

上の例の出力は以下となります。

Array
(
    [userid] => 104
    [name] => Chris
    [country] => Ukraine
)

PDO::FETCH_BOTH (int)

これはデフォルトのフェッチモードです。

PDO::FETCH_BOTH はカラム番号とカラム名の両方で インデックス付けされた配列を返します。これは、結果行ごとに すべての返される値が重複することを意味します。

カラム番号は 0 から始まり、クエリ内の結果カラムの順序によって決まります。 テーブルでカラムが定義されている順序などではありません。

注意: 数値カラムインデックスの使用は推奨されません。 クエリが変更された場合や、SELECT * を使用している場合にテーブルスキーマが変更されると、 インデックスが変わる可能性があるためです。

注意: 複数の返されるカラムが同じ名前を使用する場合、 名前でインデックス付けされたエントリの数は 番号でインデックス付けされたエントリの数と一致しないことがあります。

<?php
$stmt
= $pdo->query("SELECT userid, name, country FROM users");
$row = $stmt->fetch(\PDO::FETCH_BOTH);
print_r($row);

上の例の出力は以下となります。

Array
(
    [id] => 104,
    [0] => 104,
    [name] => Chris,
    [1] => Chris,
    [country] => Ukraine,
    [2] => Ukraine
)

PDO::FETCH_NAMED (int)

PDO::FETCH_NAMEDPDO::FETCH_ASSOC と同じ形式で結果を返しますが、 複数のカラムが同じ名前を使用する場合、すべての値がリストとして返されます。

重複するカラム名の処理と代替方法についての詳細は、上記の 重複する名前の処理に関する セクション を参照ください。

重複した値が返される順序は未定義と考えるべきです。 各値がどこから来たのかを知る方法はありません。

<?php
$stmt
= $pdo->query(
"SELECT users.*, referrer.name
FROM users
LEFT JOIN users AS referrer ON users.referred_by = referrer.userid
WHERE userid = 109"
);
$row = $stmt->fetch(\PDO::FETCH_NUM);
print_r($row);

上の例の出力は以下となります。

Array
(
    [userid] => 109
    [name] => Array
        (
            [0] => Toni
            [1] => Chris
        )
    [country] => Germany
    [referred_by] = 104
)

PDO::FETCH_NUM (int)

PDO::FETCH_NUM はカラム番号のみでインデックス付けされた 配列を返します。カラム番号は 0 から始まり、 クエリ内の結果カラムの順序によって決まります。 テーブルでカラムが定義されている順序などではありません。

注意: 数値カラムインデックスの使用は推奨されません。 クエリが変更された場合や、SELECT * を使用している場合にテーブルスキーマが変更されると、 インデックスが変わる可能性があるためです。

<?php
$stmt
= $pdo->query("SELECT userid, name, country FROM users");
$row = $stmt->fetch(\PDO::FETCH_NUM);
print_r($row);

上の例の出力は以下となります。

Array
(
    [0] => 104
    [1] => Chris
    [2] => Ukraine
)

PDO::FETCH_COLUMN (int)

PDO::FETCH_COLUMN は単一のカラムの値を返します。 PDOStatement::setFetchMode() または PDOStatement::fetchAll() の第二引数を使用して、どのカラムを返すかを指定します。

指定されたカラムが存在しない場合、 ValueError がスローされます。

<?php
$stmt
= $pdo->query("SELECT name, country FROM users LIMIT 3");
$row = $stmt->fetchAll(\PDO::FETCH_COLUMN);
print_r($row);

$stmt = $pdo->query("SELECT name, country FROM users LIMIT 3");
$row = $stmt->fetchAll(\PDO::FETCH_COLUMN, 1);
print_r($row);

上の例の出力は以下となります。

Array
(
    [0] => Chris
    [1] => Jamie
    [2] => Robin
)

Array
(
    [0] => Ukraine
    [1] => England
    [2] => Germany
)

PDO::FETCH_KEY_PAIR (int)

PDO::FETCH_KEY_PAIR は最初のカラムでインデックス付けされた 値のペアを返します。結果には 2 つのカラムのみが含まれている必要があります。 このフェッチモードは PDOStatement::fetchAll() でのみ意味があります。

注意: 最初のカラムが一意でない場合、値が失われます。 どの値が失われるかは未定義と考えるべきです。

<?php
$stmt
= $pdo->query("SELECT name, country FROM users LIMIT 3");
$row = $stmt->fetchAll(\PDO::FETCH_KEY_PAIR);
print_r($row);

上の例の出力は以下となります。

Array
(
    [Chris] => Ukraine
    [Jamie] => England
    [Robin] => Germany
)

PDO::FETCH_FUNC (int)

返される値を生成するための関数を指定します。このモードは PDOStatement::fetchAll() でのみ使用できます。

関数は値をパラメータとして受け取ります。 指定された値がどのカラム名に関連付けられているかを取得する方法はありません。 クエリ内のカラムの順序が関数のパラメータの順序と一致していることを 確認することが重要です。

注意: PDO::FETCH_GROUP および PDO::FETCH_UNIQUE の効果は、関数が呼び出される前に結果に適用されます。

<?php
function valueCreator($col1, $col2, $col3)
{
return [
'col1' => $col1,
'col2' => strtoupper($col2),
'col3' => $col3,
'customKey' => 'customValue',
];
}

$stmt = $pdo->query("SELECT userid, name, country FROM users LIMIT 3");
$row = $stmt->fetchAll(\PDO::FETCH_FUNC, valueCreator(...));
print_r($row);

上の例の出力は以下となります。

Array
(
    [0] => Array
        (
            [col1] => 104
            [col2] => SAM
            [col3] => Ukraine
            [customKey] => customValue
        )

    [1] => Array
        (
            [col1] => 105
            [col2] => JAMIE
            [col3] => England
            [customKey] => customValue
        )

    [2] => Array
        (
            [col1] => 107
            [col2] => ROBIN
            [col3] => Germany
            [customKey] => customValue
        )

)

PDO::FETCH_OBJ (int)

PDO::FETCH_OBJstdClass オブジェクトを返します。

PDOStatement::fetchObject() および PDO::FETCH_CLASS も参照ください。

<?php
$stmt
= $pdo->query("SELECT userid, name, country FROM users");
$row = $stmt->fetch(\PDO::FETCH_OBJ);
print_r($row);

上の例の出力は以下となります。

stdClass Object
(
    [userid] => 104
    [name] => Chris
    [country] => Ukraine
)

PDO::FETCH_CLASS (int)

指定されたクラスのオブジェクトを返します。追加の動作については オプションフラグ を参照ください。

返されるカラム名と一致するプロパティが存在しない場合、 そのプロパティは動的に宣言されます。この動作は推奨されず、 PHP 9.0 からはエラーが発生します。

PDOStatement::fetchObject() も参照ください。

<?php
class TestEntity
{
public
$userid;

public
$name;

public
$country;

public
$referred_by_userid;

public function
__construct()
{
print
"Constructor called with ". count(func_get_args()) ." args\n";
print
"Properties set when constructor called? "
. (isset($this->name) ? 'Yes' : 'No') . "\n";
}
}

$stmt = $db->query(
"SELECT userid, name, country, referred_by_userid FROM users"
);
$stmt->setFetchMode(PDO::FETCH_CLASS, TestEntity::class);
$result = $stmt->fetch();
var_dump($result);

上の例の出力は、 たとえば以下のようになります。

Constructor called with 0 args
Properties set when constructor called? Yes
object(TestEntity)#3 (4) {
  ["userid"]=>
  int(104)
  ["name"]=>
  string(5) "Chris"
  ["country"]=>
  string(7) "Ukraine"
  ["referred_by_userid"]=>
  NULL
}

PDO::FETCH_CLASSTYPE (int)

このフェッチモードは PDO::FETCH_CLASS (および その他のオプション) と組み合わせてのみ使用できます。

このフェッチモードが使用されると、PDO は返される最初のカラムを 返すクラスの名前として使用します。

指定されたクラスが見つからない場合、警告やエラーなしに stdClass オブジェクトが返されます。

<?php
class TestEntity
{
public
$userid;

public
$name;

public
$country;

public
$referred_by_userid;

public function
__construct()
{
print
"Constructor called with ". count(func_get_args()) ." args\n";
print
"Properties set when constructor called? "
. (isset($this->name) ? 'Yes' : 'No') . "\n";
}
}

$stmt = $db->query(
"SELECT 'TestEntity', userid, name, country, referred_by_userid FROM users"
);
$stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);
$result = $stmt->fetch();
var_dump($result);

上の例の出力は、 たとえば以下のようになります。

Constructor called with 0 args
Properties set when constructor called? Yes
object(TestEntity)#3 (4) {
  ["userid"]=>
  int(104)
  ["name"]=>
  string(5) "Chris"
  ["country"]=>
  string(7) "Ukraine"
  ["referred_by_userid"]=>
  NULL
}

PDO::FETCH_PROPS_LATE (int)

このフェッチモードは PDO::FETCH_CLASS (および その他のオプション) と組み合わせてのみ使用できます。

このフェッチモードが使用されると、プロパティが設定される前に コンストラクタが呼び出されます。

<?php
class TestEntity
{
public
$userid;

public
$name;

public
$country;

public
$referred_by_userid;

public function
__construct()
{
print
"Constructor called with ". count(func_get_args()) ." args\n";
print
"Properties set when constructor called? "
. (isset($this->name) ? 'Yes' : 'No') . "\n";
}
}

$stmt = $db->query(
"SELECT userid, name, country, referred_by_userid FROM users"
);
$stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, TestEntity::class);
$result = $stmt->fetch();
var_dump($result);

上の例の出力は、 たとえば以下のようになります。

Constructor called with 0 args
Properties set when constructor called? No
object(TestEntity)#3 (4) {
  ["userid"]=>
  int(104)
  ["name"]=>
  string(5) "Chris"
  ["country"]=>
  string(7) "Ukraine"
  ["referred_by_userid"]=>
  NULL
}

PDO::FETCH_SERIALIZE (int)

警告

この機能は PHP 8.1.0 で 非推奨になります。この機能に頼らないことを強く推奨します。

このフェッチモードは PDO::FETCH_CLASS (および その他のオプション) と組み合わせてのみ使用できます。

このフェッチモードが使用される場合、指定されたクラスは Serializable でなければなりません。

警告

この機能は (serialize() による) 完全なシリアライズされたオブジェクトを含む文字列をサポートしていません。

警告

このフェッチモードはコンストラクタを呼び出しません。

<?php
class TestEntity implements Serializable
{
public
$userid;

public
$name;

public
$country;

public
$referred_by_userid;

public function
__construct()
{
print
"Constructor called with " . count(func_get_args()) . " args\n";
print
"Properties set when constructor called? "
. (isset($this->name) ? 'Yes' : 'No') . "\n";
}

public function
serialize()
{
return
join(
"|",
[
$this->userid, $this->name, $this->country, $this->referred_by_userid]
);
}

public function
unserialize(string $data)
{
$parts = explode("|", $data);
$this->userid = (int) $parts[0];
$this->name = $parts[1];
$this->country = $parts[2];

$refId = $parts[3];
$this->referred_by_userid = ($refId === "" ? null : (int) $refId);
}
}

print
"Set up record (constructor called manually):\n";
$db->exec(
"CREATE TABLE serialize (
sdata TEXT
)"
);

$origObj = new TestEntity();
$origObj->userid = 200;
$origObj->name = 'Seri';
$origObj->country = 'Syria';
$origObj->referred_by_userid = null;

$insert = $db->prepare("INSERT INTO serialize (sdata) VALUES (:sdata)");
$insert->execute(['sdata' => $origObj->serialize()]);

print
"\nRetrieve result:\n";
$query = "SELECT sdata FROM serialize";
$stmt = $db->query($query);
// 注意: コンストラクタは呼び出されません!
$stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_SERIALIZE, TestEntity::class);
$result = $stmt->fetch();
var_dump($result);

上の例の出力は、 たとえば以下のようになります。

Deprecated: TestEntity implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in Standard input code on line 2
Set up record (constructor called manually):
Constructor called with 0 args
Properties set when constructor called? No

Retrieve result:
Deprecated: PDOStatement::setFetchMode(): The PDO::FETCH_SERIALIZE mode is deprecated in Standard input code on line 58

Deprecated: PDOStatement::fetch(): The PDO::FETCH_SERIALIZE mode is deprecated in Standard input code on line 59
object(TestEntity)#5 (4) {
  ["userid"]=>
  int(200)
  ["name"]=>
  string(4) "Seri"
  ["country"]=>
  string(5) "Syria"
  ["referred_by_userid"]=>
  NULL
}

PDO::FETCH_BOUND (int)

このフェッチモードは PDOStatement::fetchAll() では使用できません。

このフェッチモードは結果を直接返すのではなく、 PDOStatement::bindColumn() で指定された変数に値をバインドします。 呼び出されたフェッチメソッドは true を返します。

注意: プリペアドステートメントを使用する場合、正しく動作させるには クエリが実行された後に変数をバインドする必要があります。

<?php
$query
= "SELECT users.userid, users.name, users.country, referrer.name
FROM users
LEFT JOIN users AS referrer ON users.referred_by_userid = referrer.userid"
;
$stmt = $db->prepare($query);
$stmt->execute();

$stmt->bindColumn('userid', $userId);
$stmt->bindColumn('name', $name);
$stmt->bindColumn('country', $country);
// 重複するカラム名を解決するためにカラム位置でバインドする
// クエリが変更された場合に壊れないようにするには、SQL エイリアスを使用してください
// 例: referrer.name AS referrer_name
$stmt->bindColumn(4, $referrerName);

while (
$stmt->fetch(\PDO::FETCH_BOUND)) {
print
join("\t", [$userId, $name, $country, ($referrerName ?? 'NULL')]) . "\n";
}

上の例の出力は以下となります。

104	Chris	Ukraine	NULL
105	Jamie	England	NULL
107	Robin	Germany	Chris
108	Sean	Ukraine	NULL
109	Toni	Germany	NULL
110	Toni	Germany	NULL

PDO::FETCH_INTO (int)

このフェッチモードは PDOStatement::fetchAll() では使用できません。

このフェッチモードは指定されたオブジェクトのプロパティを更新します。 成功した場合、オブジェクトが返されます。

返されるカラム名と一致するプロパティが存在しない場合、 そのプロパティは動的に宣言されます。この動作は推奨されず、 PHP 9.0 からはエラーが発生します。

プロパティは public でなければならず、 readonly にはできません。

警告

各レコードの取得間で PDOStatement::setFetchMode() を使用せずに、更新対象のオブジェクトを変更する方法はありません。

<?php
class TestEntity
{
public
$userid;

public
$name;

public
$country;

public
$referred_by_userid;
}

$obj = new TestEntity();
$stmt->setFetchMode(\PDO::FETCH_INTO, $obj);

$stmt = $db->query("SELECT userid, name, country, referred_by_userid FROM users");
$result = $stmt->fetch();
var_dump($result);

上の例の出力は、 たとえば以下のようになります。

object(TestEntity)#3 (4) {
  ["userid"]=>
  int(104)
  ["name"]=>
  string(5) "Chris"
  ["country"]=>
  string(7) "Ukraine"
  ["referred_by_userid"]=>
  NULL
}

PDO::FETCH_LAZY (int)

このフェッチモードは PDOStatement::fetchAll() では使用できません。

このフェッチモードは PDORow オブジェクトを返し、 値への配列風およびオブジェクト風のアクセスを提供します (つまり、PDO::FETCH_BOTHPDO::FETCH_OBJ の動作を組み合わせたもの)。 値は遅延的に取得されます。

これは、データベースサーバー上のバッファリングされていない結果への (PHP 側で) メモリ効率の良いアクセスを提供できます。 PDO が結果にクライアント側のバッファリングを使用するかどうかは、 使用されるデータベース固有のドライバ (およびその設定) に依存します。

警告

PDORow は、定義されていないプロパティやキーに アクセスした場合、エラーや警告なしに NULL を返します。 これにより、タイプミスや期待されるデータを返さないクエリなどのエラーを 発見してデバッグすることが難しくなる可能性があります。

警告

返される PDORow オブジェクトは、 結果が取得されるたびに更新されます。

<?php
$stmt
= $db->query("SELECT userid, name, country, referred_by_userid FROM users");
$result = $stmt->fetch(\PDO::FETCH_LAZY);

print
"ID: ". $result[0] ."\n";
print
"Name: {$result->name}\n";
print
"Country: " . $result['country'] ."\n";
// NULL を返します。警告やエラーは発生しません。
print "Does not exist: " . var_export($result->does_not_exist, true) . "\n";

$differentResult = $stmt->fetch(\PDO::FETCH_LAZY);
// 以前取得した PDORow は、新しく取得された結果を指すようになります
print "ID: ". $result[0] ."\n";

上の例の出力は以下となります。

ID: 104
Name: Chris
Country: Ukraine
Does not exist: NULL
ID: 105

PDO::FETCH_GROUP (int)

PDO::FETCH_GROUP は、(一意でない) カラムで インデックス付けされた連想配列のリストを返します。 このフェッチモードは PDOStatement::fetchAll() でのみ動作します。

PDO::FETCH_UNIQUE と組み合わせた場合、 両方のモードが同じカラムを使用するため、 これらのモードの組み合わせは無意味になります。

このフェッチは PDO::FETCH_ASSOCPDO::FETCH_BOTHPDO::FETCH_NAMEDPDO::FETCH_NUMPDO::FETCH_COLUMN または PDO::FETCH_FUNC のいずれかと組み合わせる必要があります。

上記のリストのフェッチモードが指定されない場合、 PDOStatement の現在のデフォルトのフェッチモードが使用されます。

<?php
$stmt
= $pdo->query("SELECT country, userid, name FROM users");
$row = $stmt->fetchAll(\PDO::FETCH_GROUP | \PDO::FETCH_ASSOC);
print_r($row);

上の例の出力は以下となります。

Array
(
    [Ukraine] => Array
        (
            [0] => Array
                (
                    [userid] => 104
                    [name] => Chris
                )

            [1] => Array
                (
                    [userid] => 108
                    [name] => Sean
                )

        )
    [England] => Array
        (
            [0] => Array
                (
                    [userid] => 105
                    [name] => Jamie
                )

        )

    [Germany] => Array
        (
            [0] => Array
                (
                    [userid] => 107
                    [name] => Robin
                )

            [1] => Array
                (
                    [userid] => 109
                    [name] => Toni
                )
        )
)

上記の例では、最初のカラムが各行の配列から省略され、 キーとしてのみ利用可能であることに注意してください。 次の例のようにカラムを繰り返すことで含めることができます:

<?php
$stmt
= $pdo->query("SELECT country, userid, name, country FROM users");
$row = $stmt->fetchAll(\PDO::FETCH_GROUP | \PDO::FETCH_ASSOC);
print_r($row);

上の例の出力は以下となります。

Array
(
    [Ukraine] => Array
        (
            [0] => Array
                (
                    [userid] => 104
                    [name] => Chris
                    [country] => Ukraine
                )

            [1] => Array
                (
                    [userid] => 108
                    [name] => Sean
                    [country] => Ukraine
                )

        )
    [England] => Array
        (
            [0] => Array
                (
                    [userid] => 105
                    [name] => Jamie
                    [country] => England
                )

        )

    [Germany] => Array
        (
            [0] => Array
                (
                    [userid] => 107
                    [name] => Robin
                    [country] => Germany
                )

            [1] => Array
                (
                    [userid] => 109
                    [name] => Toni
                    [country] => Germany
                )
        )
)

PDO::FETCH_UNIQUE (int)

PDO::FETCH_UNIQUE は最初のカラムを使用してレコードを インデックス付けし、インデックス値ごとに 1 レコードを返します。 このフェッチモードは PDOStatement::fetchAll() でのみ動作します。

PDO::FETCH_GROUP と組み合わせた場合、 両方のモードが同じカラムを使用するため、 これらのモードの組み合わせは無意味になります。

このフェッチは PDO::FETCH_ASSOCPDO::FETCH_BOTHPDO::FETCH_NAMEDPDO::FETCH_NUMPDO::FETCH_COLUMN または PDO::FETCH_FUNC のいずれかと組み合わせる必要があります。

上記のリストのフェッチモードが指定されない場合、 PDOStatement の現在のデフォルトのフェッチモードが使用されます。

一意であることがわかっているカラム (レコード ID など) と共に使用すると、 このモードはその値でインデックス付けされた結果を素早く返す機能を提供します。

注意: 最初のカラムが一意でない場合、値が失われます。 どの値が失われるかは未定義と考えるべきです。

警告

レコードのフィルタリングは、可能な限り SQL で行うべきです。 データベースはインデックスを使用してこのプロセスを最適化し、 必要なレコードのみを返します。 必要以上のレコードをデータベースから取得すると、 大きな結果セットの場合にメモリ使用量とクエリ時間が大幅に増加する可能性があります。

<?php
$stmt
= $pdo->query("SELECT userid, name, country FROM users LIMIT 3");
$row = $stmt->fetchAll(\PDO::FETCH_UNIQUE | \PDO::FETCH_ASSOC);
print_r($row);

上の例の出力は以下となります。

Array
(
    [104] => Array
        (
            [name] => Chris
            [country] => Ukraine
        )

    [105] => Array
        (
            [name] => Jamie
            [country] => England
        )

    [107] => Array
        (
            [name] => Robin
            [country] => Germany
        )

)

上記の例では、最初のカラムが各行の配列から省略され、 キーとしてのみ利用可能であることに注意してください。 次の例のようにカラムを繰り返すことで含めることができます:

<?php
$stmt
= $pdo->query("SELECT userid, userid, name, country FROM users LIMIT 3");
$row = $stmt->fetchAll(\PDO::FETCH_UNIQUE | \PDO::FETCH_ASSOC);
print_r($row);

上の例の出力は以下となります。

Array
(
    [104] => Array
        (
            [userid] => 104
            [name] => Chris
            [country] => Ukraine
        )

    [105] => Array
        (
            [userid] => 105
            [name] => Jamie
            [country] => England
        )

    [107] => Array
        (
            [userid] => 107
            [name] => Robin
            [country] => Germany
        )

)
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top