Help us understand the problem. What is going on with this article?

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);
tabo_purify
WEBに特化しています。 その他の言語は分かりません。 間違いを発見した方はご指摘くださいませ。
https://labo-iwasaki.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした