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の使い方でした。
最新情報をお届けします
