はじめに
この記事で紹介するサンプルプログラムは次の記事で書いている共通関数を使用している場合があります。
データ検索処理の流れ
PDOを使用し、データを検索する場合のコードは次のように書きます。
1.データベースに接続する。
2.データベースに接続したPDOオブジェクトを使用し、次のどちらかの方法でSELECT文を発行する。
①PDO::query()を使用する
次のコードのようにPDO::query()を使用し、SELECT文を実行する
$pst = $pdo->query("SELECT * FROM GOODS WHERE GOODS_CODE IN ('1000000001', '1000000002')");
SELECT文の結果は、検索条件に一致した配列でレコードの数だけ返却されるため、次のようにループして結果を取り出す。
配列の中身はテーブルの列(カラム)を持つ連想配列になっているため、カラムのデータを取り出す場合、連想配列にテーブルのカラム名、または列の順番を指定する。
foreach($pst as $row) {
print_r($row);
}
文章だけでは分かりにくいと思うので、実際のサンプルプログラムを見てください。
②プリペアドステートメントを使用する
次のコードのようにPDO::prepare()でSQL文を組み立てた結果はPDOStatementオブジェクトで返却される。
SQLは PDOStatement::execute()で実行する。
$stmt = $pdo->prepare("SELECT * FROM GOODS WHERE GOODS_CODE IN ('1000000001', '1000000002')"); // SQL文の組み立てて
$stmt->execute(); // SQL文の発行
SELECT文でプリペアドステートメントの実行結果を取り出す場合、次のコードのように書いて1行ずつ取り出す。
while($row = $stmt->fetch()) {
print_r($row);
}
3.生成したPDOStatementオブジェクト、PDOオブジェクトを破棄する。
$stmt = null; // PDOStatementオブジェクト
$pdo = null; // PDOオブジェクト、データベースのクローズ
注意事項
2つの方法のうち、SQLインジェクションに対応している2のプリペアドステートメントを使用した方がよいです。
1の方法はSQLインジェクションを防ぐように意識してプログラミングする必要があるため、セキュリティの問題が発生しやすいです。
SQLインジェクションでセキュリティの脆弱性があり、情報を漏洩したというニュースが流れることがありますが、1の方法を使用したことが原因だと考えられます。
サンプルプログラム
サンプルプログラム1
サンプルプログラム1では、PDO::query()の使い方・戻り値について紹介します。
PDO::query()の戻り値はfalse・0件・データ返却の3パターンがあることを考慮し、プログラミングを行う必要があります。
サンプルプログラムは長くなるため、次の記事で紹介します。
サンプルプログラム2
サンプルプログラム2では、検索条件入力画面から検索結果表示画面に遷移するプログラムで、次のパターンについて説明します。
- SQLインジェクション対応なしのPDO::query()
- SQLインジェクション対応ありのPDO::query()
- プリペアドステートメント
内容が長くなるので次の記事でサンプルプログラムを紹介します。
コメント