📢 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>
<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><br>
<br><br>