PHP
MySQL
PDO
プリペアドステートメント

PHPでPDOを使ってMySQLに接続、INSERT、UPDATE、DELETE、COUNT、SUM

More than 3 years have passed since last update.

今まで mysql... 系を使用していましたが、PHP5.5以降は非推奨となり、将来的には削除される予定らしいので、PDOの使用に変更しようと思い、まとめてみました。

プリペアドステートメントでINSERTすると安全に値を渡せるとか、結構便利みたい。

Manualとか色々読んだけど、分かりにくい言葉が多かったので、自分なりに解釈を書いています。


PDOとかプリペアドステートメントの説明

こっちのページに詳しく書いています。

言葉の意味分からんわー。みたいな時は是非読んでみてください。


PDOでMySQLを色々やる。

まずメソッドや引数をちょっとまとめました。

今後増やしていこうと思っています。

 メソッドや引数
 内容      

 execute() 
準備したprepareに入っているSQL文を実行

 prepare  
値部分にパラメータを付けて実行待ち

 query  
prepareを使わずにSQL文を実行

 PDOException 
エラーを投げる 

 bindParam 
与えられた変数を文字列としてパラメータに入れる

 bindValue 
与えられた変数や数値を型を指定してパラメータに入れる※1

 PDO::PARAM_STR
変数の値を文字列として扱う

 PDO::PARAM_INT
変数の値を数値として扱う

 :nameなど
パラメータ(:の後に任意の文字)

 PDO::FETCH_ASSOC
連想配列として取得します。※2

※1 INSERTの項目でもう少し詳しく触れています。

※2 よく「カラム名で添字を付けた配列を返す」みたいな事を書かれてますが、これManualのコピーですよね?意味分からん。つまり連想配列として取得するって事。


データベースに接続する。

PDOでMySQLに接続します。

現在はPHP5.4.13なのでcharsetが有効。5.3.6以前のバージョンでは無効。

try の中に処理などを書き、catch でエラーを返します。


DBに接続

<?php

try {
$pdo = new PDO('mysql:host=ホスト名;dbname=DB名;charset=utf8','ユーザー名','パスワード',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
exit('データベース接続失敗。'.$e->getMessage());
}
?>


ヘルプ

●ATTR_EMULATE_PREPARES がよく分からない。

 静的プレースホルダに設定しているらしい…。

●そもそも静的とか動的の意味がよく分からん。調べても日本語の意味書いてない。

 ニュアンスは分かるけど…。


データを呼び出し。

queryを使う時はexecute()を使わない。


データを呼び出す

<?php

$stmt = $pdo->query("SELECT * FROM テーブル名 ORDER BY no ASC");
while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
$ttitle = $row["title"];
$tr = $row["r"];
$tk = $row["k"];
$tt = $row["t"];
$tm = $row["m"];
echo<<<EOF

ヒアドキュメント内の表示部分

EOF;
}
?>



INSERT

PDOでデータをINSERTする。

プリペアドステートメントで挿入すると値が文字列になるのでSQLインジェクションにも安心。


INSERT

$stmt = $pdo -> prepare("INSERT INTO テーブル名 (name, value) VALUES (:name, :value)");

$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':value', 1, PDO::PARAM_INT);

$name = 'one';
$stmt->execute();



解説

●bindParam は PDO::PARAM_INT を指定しても文字列として扱われる。

 SQLインジェクションとかは心配なさそう。

●bindValue は値を数値で指定します。

 この場合は PDO::PARAM_INT 型指定が必要。


UPDATE

すでに入っている値を変更する。


UPDATE

<?php

$sql = 'update テーブル名 set name =:name where id = :value';
$stmt = $pdo -> prepare($sql);
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':value', 1, PDO::PARAM_INT);
$stmt->execute();
?>


DELETE

テーブルの値を削除する。


DELETE

<?php

$sql = 'DELETE FROM テーブル名 where id = :delete_id';
$stmt = $pdo -> prepare($sql);
$stmt -> bindParam(':delete_id', $value, PDO::PARAM_INT);
$stmt -> execute();
?>


COUNT


COUNT

$stmt = $pdo -> query("SELECT * FROM テーブル名");

$count = $stmt -> rowCount();

もっとイイやり方があるかも…。

mysql...系みたいに SELECT COUNT(dd) FROM... にしたらエラー出た。


SUM

テーブルのa1の合計を求める。


SUM

$stmt = $pdo -> prepare("SELECT SUM(a1) as a1 FROM テーブル名 WHERE y=:y");

$stmt -> bindParam(':y', $y, PDO::PARAM_STR);
$stmt -> execute();
if($row = $stmt -> fetch()){
$kei = $row['a1'];
}

複数フィールドa1,a2,a3の値を合計する。


SUM

$stmt = $pdo -> prepare("SELECT SUM(a1 + a2 + a3) as goukei FROM テーブル名 WHERE y=:y");

$stmt -> bindParam(':y', $y, PDO::PARAM_STR);
$stmt -> execute();
if($row = $stmt -> fetch()){
$kei = $row['goukei'];
}


テーブルを作成する。

テーブルが存在していなければ作成する。


テーブル作成

<?php 

$sql = "CREATE TABLE IF NOT EXISTS `テーブル名`"
."("
. "`dd` INT auto_increment primary key,"
. "`y` INT,"
. "`m` INT,"
. "`d` INT,"
. "`youbi` INT,"
. "`yokin` INT,"
. "`a1` INT,"
. "`a2` INT,"
. "`a3` INT,"
. "`a4` INT,"
. "`a5` INT,"
. "`i_date` DATETIME"
.");";
$stmt = $pdo -> prepare($sql);
$stmt -> execute();
?>


テーブルを削除する


DROP

$sql = "DROP TABLE IF EXISTS テーブル名";

$pdo -> exec($sql);