📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 532行目: | 532行目: | ||
== レコードの取得(プリペアドステートメント) == | == レコードの取得(プリペアドステートメント) == | ||
<center> | |||
{| class="wikitable" style="background-color:#fefefe;" | |||
|- | |||
! style="background-color:#00ffff;" | MySQL | |||
! style="background-color:#00ffff;" | PHPのデータ型<br>(エミュレーション無しmysqlnd) | |||
! style="background-color:#00ffff;" | PHPのデータ型(libmysqlclient)<br>(エミュレーション有りmysqlnd) | |||
|- | |||
| NULL || NULL || NULL | |||
|- | |||
| 文字列 || String || String | |||
|- | |||
| 日付 || String || String | |||
|- | |||
| タイムスタンプ || Integer || String | |||
|- | |||
| 論理値 || Integer || String | |||
|- | |||
| PHPで扱える値の整数 || Integer || String | |||
|- | |||
| PHPで扱えない値の整数 || String || String | |||
|- | |||
| 浮動小数点 || String || String | |||
|} | |||
</center> | |||
<u>※注意</u><br> | |||
<u>エミュレーションに関するオプションは、PDO::ATTR_EMULATE_PREPARESという命名ではあるが、</u><br> | |||
<u>プリペアドステートメントを使用しない場合にも影響が及ぶことに注意すること。</u><br> | |||
<br> | |||
下表に、<code>PDO::setAttribute</code>で取得するデータ型を変更できるものを示す。<br> | |||
<code>PDO::ATTR_ORACLE_NULLS</code>オプションは、Oracle以外のデータベースでも使用できる。<br> | |||
<center> | |||
{| class="wikitable" style="background-color:#fefefe;" | |||
|- | |||
! style="background-color:#00ffff;" | データベース | |||
! style="background-color:#00ffff;" | PDO::NULL_EMPTY_STRING | |||
! style="background-color:#00ffff;" | PDO::NULL_TO_STRING | |||
|- | |||
| NULL || NULL || "" | |||
|- | |||
| "" || NULL || "" | |||
|} | |||
</center> | |||
<br> | |||
また、PDO::ATTR_STRINGIFY_FETCHESオプションをtrueに指定する時、エミュレーションが無効の場合は数値が文字列に変換される。<br> | |||
エミュレーションが有効の場合、設定に関わらず常に数値が文字列に変換される。<br> | |||
<br> | |||
==== PDOStatement::fetchメソッド ==== | ==== PDOStatement::fetchメソッド ==== | ||
カーソルを移動して、指定したフェッチモードで1行ずつ取得する。<br> | カーソルを移動して、指定したフェッチモードで1行ずつ取得する。<br> | ||
| 602行目: | 648行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== PDOStatement::setFetchModeメソッド == | |||
上記のセクションでは、<code>PDO</code>クラス自身にデフォルトフェッチモードを指定する方法を記載したが、<br> | |||
<code>PDOStatement::setFetchMode</code>メソッドを使用する場合、個別に発行された<code>PDOStatement</code>クラスに対して、後からフェッチモードを指定できる。<br> | |||
また、モードにより引数の渡し方が異なるため、詳細はPHPのマニュアルを参照すること。<br> | |||
<br> | |||
以下の例では、0番目のカラムをforeach文で取得している。<br> | |||
<syntaxhighlight lang="php"> | |||
$stmt->setFetchMode(PDO::FETCH_COLUMN, 0); | |||
foreach($stmt as $i => $name) | |||
{ | |||
// ...処理 | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
また、<code>PDO::query</code>メソッドも同様の形式でフェッチモードを指定することができる。<br> | |||
以下の例では、上記の例と同様、0番目のカラムをforeach文で取得している。<br> | |||
<syntaxhighlight lang="php"> | |||
foreach($pdo->query($sql, PDO::FETCH_COLUMN, 0) as $i => $name) | |||
{ | |||
// ...処理 | |||
} | |||
<br> | |||
==== SQLインジェクション攻撃の対策 ==== | |||
以下の例では、フォームで入力したキーの値に応じたデータを取得している。<br> | 以下の例では、フォームで入力したキーの値に応じたデータを取得している。<br> | ||
ユーザの入力内容は自動的に引用符で括られるため、SQLインジェクション攻撃の恐れは無い。<br> | ユーザの入力内容は自動的に引用符で括られるため、SQLインジェクション攻撃の恐れは無い。<br> | ||
| 616行目: | 686行目: | ||
?> | ?> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||