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

よく使いそうなPHPでのデータベースへのアクセス

引用

ドットインストール PHPデータベース入門
自分用にメモしてます。

DBのセットアップ

最初のセットアップ
mysql -u root
create database new_db;
grant all on new_db.* to admin@localhost identified by 'password';
use dotinstall_db;

create table users (
  id int not null auto_increment primary key,
  name varchar(255),
  score int
);

mysql -u admin -p password

PDOのセットアップ

DBの基本情報を定数で定義

define('DB_DATABASE', 'new_db');
define('DB_USERNAME', 'dbuser');
define('DB_PASSWORD', 'password');
define('PDO_DSN', 'mysql:host=localhost;dbname=' . DB_DATABASE);

PDOは基本的にtryとcatchで記述
エラーが出た時にはExceptionを発生させるため、setAttributeというメソッドで設定する。
PHPで定義済みのクラスを書くときは先頭に「\」を付ける習慣をつける。(※)
※名前空間を使っている場合、PHPに標準で用意されているException()やDateTime()のようなクラスに関しては一番上の名前空間から呼び出さなければならない。

try {
  // connect
  $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
  echo $e->getMessage();
  exit;
}

exec()

  • 引数に与えられたSQL文を実行する。
  • 返り値は更新・削除された行数を返す。作用しなかった場合は0を返す。
  • SELECT文からは結果を返さない
  // insert
  $db->exec("insert into users (name, score) values ('yamada', 28)");
  echo "success!";

  // disconnect
  $db = null;

prepare() execute()

prepare()

  • 複数回実行されるSQL、安全対策が必要なSQL文に適している。
  • DBが正常に文を準備する場合は、PDOStatementオブジェクトを返す。もしDBが文を準備できなかった場合はFALSEかPDOExceptionを発行する(エラー処理の方法に依存)

execute()

  • 配列型でパラメータを渡す。
  • 何も指定しない場合は文字列で渡される。数値を渡したい場合はbindvalue,bindparam 型を指定する必要がある。
  $stmt = $db->prepare("insert into users (name, score) values (?, ?)");
  $stmt->execute(['taguchi', 44]);
  echo "inserted: " . $db->lastInsertId();

名前つきパラメータ

扱うカラムが多くなってきたときに整理しやすくなる。

  $stmt = $db->prepare("insert into users (name, score) values (:name, :score)");
  $stmt->execute([':name'=>'hoge', ':score'=>80]);
  echo "inserted: " . $db->lastInsertId();

bindvalue()

  • 第一引数:パラメータid(1から始まる)
  • 第二引数:バインドする値
  • 第三引数:データの型
    • 文字列:PDO::PARAM_STR
    • 数値は:PDO::PARAM_INT
  • これを使うとループなどで一部の値だけ違うレコードを一気に挿入できる。
  • 名前付きパラメータの場合にも適用できる。
  $name = 'yamada';
  $stmt->bindValue(1, $name, PDO::PARAM_STR);
  // $stmt->bindValue(':name', $name, PDO::PARAM_STR);
  $score = 35;
  $stmt->bindValue(2, $score, PDO::PARAM_INT);
  $stmt->execute();
  $score = 29;
  $stmt->bindValue(2, $score, PDO::PARAM_INT);
  $stmt->execute();

bindParam()

  • bindvalueは値をバインド、bindParamは変数への参照をバインド
  • 実際に変数を参照するのはexecute()時。
  $stmt->bindParam(2, $score, PDO::PARAM_INT);
  $score = 52;
  $stmt->execute();
  $score = 44;
  $stmt->execute();
  $score = 6;
  $stmt->execute();

query() fetchAll() rowCount()

query()

  • 何回も実行されないSQLに適する。
  • 返り値はPDOStatementオブジェクトを返す。失敗した場合はFALSEを返す。
    fetchAll()

  • 引数に返り値の形式を指定できる。

rowCount()

  • 取得したレコードの数を取得
  // select all
  $stmt = $db->query("select * from users");
  $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  foreach ($users as $user) {
    var_dump($user);
  }
  echo $stmt->rowCount() . " records found.";

transaction

複数の処理により整合性を保つ必要がある場合に必要。

try {
  // transaction
  $db->beginTransaction();
  //処理1
  //処理2
  $db->commit();

} catch (\PDOException $e) {
  $db->rollback();
  echo $e->getMessage();
  exit;
}
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
ユーザーは見つかりませんでした