フェッチモード
基本的なフェッチモード
PDO::FETCH_CLASS のオプション
これらのモードは
単一結果モード以下のモードは PDOStatement::fetchAll では使用できません。
PDOStatement::fetchAll 用の特殊な動作フラグ以下の複数結果用の特殊モードは PDOStatement::fetchAll でのみ動作し、 一部の他のフェッチモードとは組み合わせて使用できません。 詳細については完全なドキュメントを確認してください。
重複するカラム名の処理結果に同じ名前のカラムが複数含まれる場合があります。 たとえば、同じカラム名を持つ 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::__construct または
PDO::setAttribute で
特定のステートメントに対するデフォルトのフェッチモードは、
PDOStatement::setFetchMode を使用して設定できます。
これはプリペアドステートメントの再利用や ( 警告
PDOStatement::setAttribute はデフォルトのフェッチモードの 設定には使用できません。ドライバ固有の属性のみを受け入れ、 認識されない属性は警告なく無視されます。 PDO::FETCH_DEFAULT (int)PHP 8.0.7 以降で利用可能です。
これは PDOStatement
に対する現在のデフォルトのフェッチモードを使用する特別な値です。
この値は PDO::FETCH_ASSOC (int)
上の例の出力は以下となります。
Array
(
[userid] => 104
[name] => Chris
[country] => Ukraine
)
PDO::FETCH_BOTH (int)これはデフォルトのフェッチモードです。
カラム番号は 0 から始まり、クエリ内の結果カラムの順序によって決まります。 テーブルでカラムが定義されている順序などではありません。
上の例の出力は以下となります。
Array
(
[id] => 104,
[0] => 104,
[name] => Chris,
[1] => Chris,
[country] => Ukraine,
[2] => Ukraine
)
PDO::FETCH_NAMED (int)
重複するカラム名の処理と代替方法についての詳細は、上記の 重複する名前の処理に関する セクション を参照ください。 重複した値が返される順序は未定義と考えるべきです。 各値がどこから来たのかを知る方法はありません。 上の例の出力は以下となります。
Array
(
[userid] => 109
[name] => Array
(
[0] => Toni
[1] => Chris
)
[country] => Germany
[referred_by] = 104
)
PDO::FETCH_NUM (int)
上の例の出力は以下となります。
Array
(
[0] => 104
[1] => Chris
[2] => Ukraine
)
PDO::FETCH_COLUMN (int)
指定されたカラムが存在しない場合、 ValueError がスローされます。 上の例の出力は以下となります。
Array
(
[0] => Chris
[1] => Jamie
[2] => Robin
)
Array
(
[0] => Ukraine
[1] => England
[2] => Germany
)
PDO::FETCH_KEY_PAIR (int)
上の例の出力は以下となります。
Array
(
[Chris] => Ukraine
[Jamie] => England
[Robin] => Germany
)
PDO::FETCH_FUNC (int)返される値を生成するための関数を指定します。このモードは PDOStatement::fetchAll でのみ使用できます。 関数は値をパラメータとして受け取ります。 指定された値がどのカラム名に関連付けられているかを取得する方法はありません。 クエリ内のカラムの順序が関数のパラメータの順序と一致していることを 確認することが重要です。
上の例の出力は以下となります。
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)
PDOStatement::fetchObject および
上の例の出力は以下となります。
stdClass Object
(
[userid] => 104
[name] => Chris
[country] => Ukraine
)
PDO::FETCH_CLASS (int)指定されたクラスのオブジェクトを返します。追加の動作については オプションフラグ を参照ください。 返されるカラム名と一致するプロパティが存在しない場合、 そのプロパティは動的に宣言されます。この動作は推奨されず、 PHP 9.0 からはエラーが発生します。 PDOStatement::fetchObject も参照ください。 上の例の出力は、 たとえば以下のようになります。
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 は返される最初のカラムを 返すクラスの名前として使用します。 指定されたクラスが見つからない場合、警告やエラーなしに stdClass オブジェクトが返されます。 上の例の出力は、 たとえば以下のようになります。
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)
このフェッチモードは このフェッチモードが使用されると、プロパティが設定される前に コンストラクタが呼び出されます。 上の例の出力は、 たとえば以下のようになります。
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 で 非推奨になります。この機能に頼らないことを強く推奨します。
このフェッチモードは このフェッチモードが使用される場合、指定されたクラスは Serializable でなければなりません。 警告
この機能は (serialize による) 完全なシリアライズされたオブジェクトを含む文字列をサポートしていません。 警告
このフェッチモードはコンストラクタを呼び出しません。 上の例の出力は、 たとえば以下のようになります。
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
で指定された変数に値をバインドします。
呼び出されたフェッチメソッドは
上の例の出力は以下となります。 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 からはエラーが発生します。
プロパティは 警告
各レコードの取得間で PDOStatement::setFetchMode を使用せずに、更新対象のオブジェクトを変更する方法はありません。 上の例の出力は、 たとえば以下のようになります。
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 オブジェクトを返し、
値への配列風およびオブジェクト風のアクセスを提供します
(つまり、 これは、データベースサーバー上のバッファリングされていない結果への (PHP 側で) メモリ効率の良いアクセスを提供できます。 PDO が結果にクライアント側のバッファリングを使用するかどうかは、 使用されるデータベース固有のドライバ (およびその設定) に依存します。 警告
PDORow は、定義されていないプロパティやキーに
アクセスした場合、エラーや警告なしに 警告
返される PDORow オブジェクトは、 結果が取得されるたびに更新されます。 上の例の出力は以下となります。 ID: 104 Name: Chris Country: Ukraine Does not exist: NULL ID: 105 PDO::FETCH_GROUP (int)
このフェッチは
上記のリストのフェッチモードが指定されない場合、 PDOStatement の現在のデフォルトのフェッチモードが使用されます。 上の例の出力は以下となります。
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
)
)
)
上記の例では、最初のカラムが各行の配列から省略され、 キーとしてのみ利用可能であることに注意してください。 次の例のようにカラムを繰り返すことで含めることができます: 上の例の出力は以下となります。
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)
このフェッチは
上記のリストのフェッチモードが指定されない場合、 PDOStatement の現在のデフォルトのフェッチモードが使用されます。 一意であることがわかっているカラム (レコード ID など) と共に使用すると、 このモードはその値でインデックス付けされた結果を素早く返す機能を提供します。
警告
レコードのフィルタリングは、可能な限り SQL で行うべきです。 データベースはインデックスを使用してこのプロセスを最適化し、 必要なレコードのみを返します。 必要以上のレコードをデータベースから取得すると、 大きな結果セットの場合にメモリ使用量とクエリ時間が大幅に増加する可能性があります。 上の例の出力は以下となります。
Array
(
[104] => Array
(
[name] => Chris
[country] => Ukraine
)
[105] => Array
(
[name] => Jamie
[country] => England
)
[107] => Array
(
[name] => Robin
[country] => Germany
)
)
上記の例では、最初のカラムが各行の配列から省略され、 キーとしてのみ利用可能であることに注意してください。 次の例のようにカラムを繰り返すことで含めることができます: 上の例の出力は以下となります。
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
)
)
|