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

プレースホルダとは

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

$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の使い方でした。

 

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

最新情報をお届けします

follow us in feedly