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");
PDOクラスを使って接続
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 テーブル名");
PDOでSELECT文を発行する
$sql = $pdo->prepare("SELECT * FROM テーブル名");
$sql->execute(); 
PDOでSELECT文(並び替え)
$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]";
}
SELECTしたのをwhileで表示する(PDO)
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はデータベース接続値
PDOを使ったINSERT文
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);
UPDATE文(PDO)
$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文
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を使った場合の切断の仕方
$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関連の情報

PDOでテーブルの存在を確める(MySQL)

PDOでAND検索,OR検索


Ads by Sitemix