PHP – pdoでselectするサンプル

pdoでSELECTしてみた。途中エラーが出たからできないんじゃないかと思ったけど単なる構文ミスだった。

<?php
$pdo = new PDO();
$stmt = $pdo->prepare('SELECT * FROM `post` WHERE `category_id`=:category_id;');
$stmt->bindParam(':category_id', $category_id, PDO::PARAM_INT);
if ($stmt->execute()) {
$result = $stmt->fetchAll();
foreach($result as $post) {
echo $post['title'];
}
}

prepareを使うメリットについてPHP Manualに書いてあった。

クエリのパース (あるいは準備) が必要なのは最初の一回だけで、 同じパラメータ (あるいは別のパラメータ) を指定して何度でも クエリを実行することができます。クエリを実行するには、準備として クエリの解析やコンパイル、そして実行プランの最適化が行われます。 クエリが複雑になると、この処理には時間がかかるようになります。 同じクエリを異なったパラメータで何度も実行すると、アプリケーションの 動作は目に見えて遅くなるでしょう。 プリペアドステートメントを使用すると、この 解析/コンパイル/最適化 の繰り返しを避けることができます。 端的に言うと、プリペアドステートメントは使用するリソースが少なくいため 高速に動作するということです。
プリペアドステートメントに渡すパラメータは、引用符で括る必要は ありません。それはドライバが自動的に行います。 アプリケーションで明示的にプリペアドステートメントを使用するように すれば、SQL インジェクションは決して発生しません (しかし、もし信頼できない入力をもとにクエリの他の部分を構築している のならば、その部分に対するリスクを負うことになります)。

PHP: プリペアドステートメントおよびストアドプロシージャ - Manual

つまり

ということだった。せっかくなのでいろんなパターンでこれからテストしてみよう。あと、SELECT * FROM hoge*で指定しているけど、ワイルドカードは基本使わないで、本番では必要最小限を指定しよう。全てのカラムが必要だったとしても、できれば都度指定するほうが良さ気だと思ってるけど、まあ結果が一緒ならワイルドカードを使うほうがナウいのかもしれない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA