LoginSignup
2
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-22

引用

ドットインストール 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;
}
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3