PHPでプレースホルダを使ってSQLを発行する方法〜PDOの使い方


20140411-10

本日PHPでプレースホルダ(SQLを発行する際に後から値を指定する方法)のやり方を聞かれたのでブログでもシェア。

PHPではPDOを使う事で簡単にプレースホルダが使えるようになりますよ。

IT/WEB業界への転職なら求人サイトGreen

以下のサイトを参考にさせていただきました。感謝!
PDOで接続、SELECT、プリペアドステートメントとは(PHPでMySQLに接続)
PHPでPDOを使ってMySQLに接続、INSERT、UPDATE、DELETE、COUNT、SUM – Qiita

プレースホルダとは

実際にプレースホルダを使った例を見てみましょう

1$sth = $dbh->prepare('SELECT name, color, calories FROM fruit WHERE calories < ? AND color = ?');
2$sth->execute(array(150, 'red'));

この「?(ハテナ)」記号がプレースホルダです。
この例では、calories(カロリー)が150より低く、color(色)が赤のフルーツを探しています。
後から値を指定する事でソースコードを見やすくする事が出来るのと、SQLインジェクションなども防ぐ事が出来ます。

PDOとは

PDOは「PHP Data Objects」の頭文字をとった名称です。
データベースが変わったとしても、ソースコードレベルでの変更点は出さないようにするデータアクセス抽象化レイヤの一つです。

MySQLに接続する方法

PDOでMySQLに接続してみます。

1try {
2  $dbh = new PDO('mysql:dbname=[dbname];host=[hostname]', '[username]', '[password]');
3} catch (PDOException $e) {
4  exit('データベースに接続できませんでした。' . $e->getMessage());
5}

SELECT文を発行する方法

1$stmt = $dbh->query('SELECT id,title FROM [table] WHERE calories <= 150');
2if (!$stmt) {
3  $info = $dbh->errorInfo();
4  exit($info[2]);
5}
6 
7while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
8  echo '<p>' . $data['id'] . ':' . $data['title'] . "</p>\n";
9}

INSERTをする方法

プリペアドステートメントで挿入するとSQLインジェクション対策にもなります。

1$sql = "INSERT INTO [table] (id,title,body,created) VALUES(?,?,?,?)";
2$stmt=$dbh->prepare($sql);
3$res=$stmt->execute(array($no,$name,$text,$datetime));
4if ($res) {
5    echo "登録完了";
6}
7else {
8    echo "登録失敗";
9}

UPDATEをする方法

01$stmt = $dbh->prepare("UPDATE [table] SET no =(no+1) WHERE name = :name");
02$stmt = $dbh->prepare($sql);
03$stmt->bindParam(':name', $name, PDO::PARAM_STR);
04$res = $stmt->execute();
05if ($res) {
06     echo "更新完了";
07 }
08else {
09    echo "更新失敗";
10}

DELETEをする方法

01$stmt = $dbh->prepare("DELETE FROM [table] where id = :delete_id");
02$stmt = $dbh->prepare($sql);
03$stmt->bindParam(':delete_id', $id, PDO::PARAM_STR);
04$res = $stmt->execute();
05if ($res) {
06     echo "削除完了";
07 }
08else {
09    echo "削除出来ませんでした";
10}

使用上の注意

PDOを使ってもプレースホルダを使わない場合、SQLインジェクションに繋がる場合があるようです。

PHP+PDO+MySQLの組み合わせではSQLインジェクション攻撃で複文呼び出しが可能

対策として
・原則として文字列連結でSQL文を組み立てない
・パラメータはプレースホルダにより指定する
・特別な事情がなければ静的プレースホルダを使う。元々その方が安全だが、・PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);により複文の実行も予防できる
・詳しくはIPAの「安全なSQLの呼び出し方」を読む

セキュリティには注意しながら使いたいですね。
以上、PHPでプレースホルダを使ってSQLを発行する方法〜PDOの使い方でした。

 

この記事が気に入ったら
いいね!しよう

最新情報をお届けします

follow us in feedly