SQLインジェクションを防ぐPDOクラスライブラリを使って接続
PHPを使ってMySQL(データベース)につなぐ場合
PDOを使うとSQLインジェクションを自動的に防いでくれるらしいので使ってみることにする
ついでにあやしい文字列も自動的にエスケープしてくれるみたい・・・
PDOクラスを覚えておけば色々なデータベースで
PDOが利用できるので便利らしい・・・
PDOを利用する方法
PDOは、PHPのバージョンが5.1以上なら
PHPをダウンロードした時についてきますので、特に何もしなくても普通に使えるはずです
PDOを使わない場合のつなぎ方
$s=mysql_connect($serv,$user,$pass) or die("接続エラー");//接続値を$sに代入 mysql_select_db($db_name); mysql_set_charset("utf8");
try { $pdo = new PDO("mysql:dbname=$db_name;host=$serv","$user","$pass", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } catch (PDOException $e) { die($e->getMessage()); }
SELECT文でMySQLからデータを受け取る
まずは、普通に書くとこうなる$sql = mysql_query("SELECT * FROM テーブル名");
$sql = $pdo->prepare("SELECT * FROM テーブル名"); $sql->execute();
$st = $pdo->prepare("SELECT * FROM user_table WHERE id=:id ORDER BY `uriagebi` DESC LIMIT 0,50"); //降順にならべて0件目から50件目までを並び替えて表示 $st->bindParam(':id',$id); $st->execute();
$sql = $pdo->prepare(SQL文);とした方が ↑ 「プレースホルダ」にいれる $st->bindParam(':id',$id); ↑ 「バインド」 より安全である
PDOでSELECT文(あいまい検索)
検索窓などをつける時は 「LIKE %検索文字%」という感じでレコードを抽出するが
PDOで LIKEを使う時は少し注意しないといけない
$st = $pdo->prepare("SELECT * FROM user_table WHERE uriagebi LIKE ?"); $st->execute(array("%$kensaku%"));//配列で全部調べないとNG $max=$st->rowCount();// 数をカウント
SELECTしたやつをwhileで表示する部分
(まずは普通に書くバージョン)
while($kekka=mysql_fetch_array($sql)){ echo "$kekka[0]"."<br />"; echo "$kekka[1]"; }
while($row = $sql->fetch()) { $id = $row['id']); $name = $row['name']); echo "$id"."<br />"; echo "$name"; }
My SQLでレコード数をカウントする
//テーブルすべてのレコードをカウント $sql= mysqlquery("SELECT COUNT(*) FROM テーブル名"); //行数を取得する $count = mysql_num_rows($re); //($re)は接続値
PDOで行数を取得する
//行数を取得する $st = $pdo->prepare("SELECT * FROM item"); $st->execute(); $count=$st->rowCount();
次はINSERT文
例のごとく普通のやり方から
$sql= 'INSERT INTO テーブル名 (カラム名) VALUES ("新しく入れる値")'; mysql_query($sql,$s);// $sはデータベース接続値
1行目のprepareと2行目のbindParamで
SQLインジェクションを防ぐとともに怪しい文字のエスケープ処理を
自動でしてくれます
$sql = $pdo->prepare("INSERT INTO テーブル名(カラム名) VALUES (:name)"); $sql->bindParam(':name',新しく入れる値); $sql->execute(); 数値を入れたい場合は $sql = $pdo->prepare("INSERT INTO テーブル名(カラム名) VALUES (:id)"); $sql->bindParam(':id',新しく入れる値, PDO::PARAM_INT); $sql->execute(); 2行目の PDO::PARAM_INT で数値型だよと教えないと 入れれないことがあるっぽい(ちょっと面倒)
PDOで値を入れる 「もう少しINSERT文をのせておく」
[複数のレコード]を入れる $st = $pdo->prepare("INSERT INTO table_1(id,name,kazu) VALUES items (:id,:name,:kazu"); $st->bindParam(':id',$id, PDO::PARAM_INT);//数値型 $st->bindParam(':name',$name); $st->bindParam(':kazu',$kazu); $st->execute();
次はUPDATE文
基本的にSELECTと同じ
UPDATE文MySQL まずは普通の書き方
$sql='UPDATE テーブル名 SET カラム名1 = "値" WHERE テーブル名.カラム名="値2" LIMIT 1'; mysql_query($sql,$s);
$st = $pdo->prepare ("UPDATE テーブル名 SET カラム名1 = :name WHERE カラム名2= :id LIMIT 1"); $st->bindParam(':name',カラム1に入れる値); $st->bindParam(':id',カラム2に入れる値, PDO::PARAM_INT); $st->execute();
MYSQLでDELETE文を発行
これもSELECTと同じ
普通の書き方
$sql= 'DELETE FROM テーブル名 WHERE テーブル名.カラム名="削除する値" LIMIT 1'; mysql_query($sql,$s);
PDOを使ってDELETE文を発行した場合
意図しない数値などすべてはじいてくれるので効果大です
(1 = 1 or 1)とかw
データベースのデータ全削除など怖いので
PDOを使ったほうがいいでしょう・・・
$st=$pdo->prepare("DELETE FROM テーブル名 WHERE カラム名 = :id LIMIT 1"); $st->bindParam(':id',削除する値, PDO::PARAM_INT); $st->execute(); 上の例は数値型のカラム(テーブル)をDELETEするサンプルです
データベースの接続を切断する記述です
普通バージョン
$s = mysql_close($s);
$pdo = null; //接続値に null を入れるだけです
PDOで情報を得る方法
PDOでデータベースのバージョンを調べたり
トランザクションの設定(オートコミット機能)がONなのか調べたい場合
//データベース名を調べる
$sql_name = $pdo->getAttribute(constant("PDO::ATTR_DRIVER_NAME"));
//データベースのバージョンを調べる
$sql_version = $pdo->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
//オートコミット機能のON、OFFを調べる
$auto_commit = $pdo->getAttribute(constant("PDO::ATTR_AUTOCOMMIT"));
//オートコミットを調べる 1が有効(ロールバック無効) 0が無効(ロールバック可能状態)
if($auto_commit == 0){
$commit_mes = 'オートコミット無効';
}elseif($auto_commit== 1){
$commit_mes = 'オートコミット有効';
}
その他のPDO関連の情報