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

本日PHPでプレースホルダ(SQLを発行する際に後から値を指定する方法)のやり方を聞かれたのでブログでもシェア。
PHPではPDOを使う事で簡単にプレースホルダが使えるようになりますよ。
以下のサイトを参考にさせていただきました。感謝!
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に接続してみます。
2 | $dbh = new PDO( 'mysql:dbname=[dbname];host=[hostname]' , '[username]' , '[password]' ); |
3 | } catch (PDOException $e ) { |
4 | exit ( 'データベースに接続できませんでした。' . $e ->getMessage()); |
SELECT文を発行する方法
1 | $stmt = $dbh ->query( 'SELECT id,title FROM [table] WHERE calories <= 150' ); |
3 | $info = $dbh ->errorInfo(); |
7 | while ( $data = $stmt ->fetch(PDO::FETCH_ASSOC)) { |
8 | echo '<p>' . $data [ 'id' ] . ':' . $data [ 'title' ] . "</p>\n" ; |
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 )); |
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(); |
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(); |
使用上の注意
PDOを使ってもプレースホルダを使わない場合、SQLインジェクションに繋がる場合があるようです。
PHP+PDO+MySQLの組み合わせではSQLインジェクション攻撃で複文呼び出しが可能
対策として
・原則として文字列連結でSQL文を組み立てない
・パラメータはプレースホルダにより指定する
・特別な事情がなければ静的プレースホルダを使う。元々その方が安全だが、・PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);により複文の実行も予防できる
・詳しくはIPAの「安全なSQLの呼び出し方」を読む
セキュリティには注意しながら使いたいですね。
以上、PHPでプレースホルダを使ってSQLを発行する方法〜PDOの使い方でした。
この記事が気に入ったら
いいね!しよう
最新情報をお届けします