PHPでプレースホルダを使ってSQLを発行する方法〜PDOの使い方
本日PHPでプレースホルダ(SQLを発行する際に後から値を指定する方法)のやり方を聞かれたのでブログでもシェア。
PHPではPDOを使う事で簡単にプレースホルダが使えるようになりますよ。
以下のサイトを参考にさせていただきました。感謝!
PDOで接続、SELECT、プリペアドステートメントとは(PHPでMySQLに接続)
PHPでPDOを使ってMySQLに接続、INSERT、UPDATE、DELETE、COUNT、SUM – Qiita
プレースホルダとは
実際にプレースホルダを使った例を見てみましょう
$sth = $dbh->prepare('SELECT name, color, calories FROM fruit WHERE calories < ? AND color = ?'); $sth->execute(array(150, 'red'));
この「?(ハテナ)」記号がプレースホルダです。
この例では、calories(カロリー)が150より低く、color(色)が赤のフルーツを探しています。
後から値を指定する事でソースコードを見やすくする事が出来るのと、SQLインジェクションなども防ぐ事が出来ます。
PDOとは
PDOは「PHP Data Objects」の頭文字をとった名称です。
データベースが変わったとしても、ソースコードレベルでの変更点は出さないようにするデータアクセス抽象化レイヤの一つです。
MySQLに接続する方法
PDOでMySQLに接続してみます。
try { $dbh = new PDO('mysql:dbname=[dbname];host=[hostname]', '[username]', '[password]'); } catch (PDOException $e) { exit('データベースに接続できませんでした。' . $e->getMessage()); }
SELECT文を発行する方法
$stmt = $dbh->query('SELECT id,title FROM [table] WHERE calories <= 150'); if (!$stmt) { $info = $dbh->errorInfo(); exit($info[2]); } while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) { echo '' . $data['id'] . ':' . $data['title'] . "
\n"; }
INSERTをする方法
プリペアドステートメントで挿入するとSQLインジェクション対策にもなります。
$sql = "INSERT INTO [table] (id,title,body,created) VALUES(?,?,?,?)"; $stmt=$dbh->prepare($sql); $res=$stmt->execute(array($no,$name,$text,$datetime)); if ($res) { echo "登録完了"; } else { echo "登録失敗"; }
UPDATEをする方法
$stmt = $dbh->prepare("UPDATE [table] SET no =(no+1) WHERE name = :name"); $stmt = $dbh->prepare($sql); $stmt->bindParam(':name', $name, PDO::PARAM_STR); $res = $stmt->execute(); if ($res) { echo "更新完了"; } else { echo "更新失敗"; }
DELETEをする方法
$stmt = $dbh->prepare("DELETE FROM [table] where id = :delete_id"); $stmt = $dbh->prepare($sql); $stmt->bindParam(':delete_id', $id, PDO::PARAM_STR); $res = $stmt->execute(); if ($res) { echo "削除完了"; } else { echo "削除出来ませんでした"; }
使用上の注意
PDOを使ってもプレースホルダを使わない場合、SQLインジェクションに繋がる場合があるようです。
PHP+PDO+MySQLの組み合わせではSQLインジェクション攻撃で複文呼び出しが可能
対策として
・原則として文字列連結でSQL文を組み立てない
・パラメータはプレースホルダにより指定する
・特別な事情がなければ静的プレースホルダを使う。元々その方が安全だが、・PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);により複文の実行も予防できる
・詳しくはIPAの「安全なSQLの呼び出し方」を読む
セキュリティには注意しながら使いたいですね。
以上、PHPでプレースホルダを使ってSQLを発行する方法〜PDOの使い方でした。
最新情報をお届けします