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

  • 448
    いいね
  • 8
    コメント
この記事は最終更新日から1年以上が経過しています。

今まで 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);