PHPのPDOクラスを使ってMySQLにデータを保存・抽出

## この記事について　
PHPを使ってデータベース内にデータを保存したり、取り出したりする際の手順をメモしています。　
細かいところは色々と省いています。

## まずは使用するデータベースの作成
以下でまずはデータベースの準備をします。　

```mysql:ターミナル
mysql -u root
→Mysqlへログイン

create database hogehoge_db;
→データベースの作成

grant all on hogehoge_db.* to dbuser@localhost identified by 'hugahuga';
→dbuser@localhostに対してhogehoge_dbというデータベースへの権限を与えて、　パスワードはhugahugaにする

use hogehoge_db;
→操作するデータベースを選択

create table users (
  id int not null auto_increment primary key,
  name varchar(255),
  score int
);
→テーブルを作成

mysql -u dbuser -p dotinstall_db
→パスワード付きで作成したデータベースへアクセス
```
## トライとキャッチを使ってデータベースへ接続
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)に関しては以下のURLを参考にいたしました。　要はエラーがでて、例外がthrowされた時にエラーメッセージを出すことができるオプションらしいです。　決まり文句だと思って記述しています。

参考URL：　http://takuya-1st.hatenablog.jp/entry/20110907/1315372181

```php:index.php
<?php

define('DB_DATABASE', 'hogehoge_db');
define('DB_USERNAME', 'dbuser');
define('DB_PASSWORD', 'hugahuga');
define('PDO_DSN', 'mysql:host=localhost;dbname=' . DB_DATABASE);
#PDOを作成する為に必要な情報を定数として用意
#mysql:dbhost=localhosはデータベースの場所
#dbname=' . DB_DATABASEはデータベースの名前

try {
  #PDOの引数に以下を設定し、データベースとの接続を行う
  $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を使ってテーブルにデータを挿入　
さて、データベースへの接続の用意はできたのでexecメソッドを使ってデータを挿入

```php：index.php
try {
  // connect
  $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // insert
  $db->exec("insert into users (name, score) values ('ROGER', 55)");
  echo "user added!";
 #　execメソッドを使ってデータを挿入
} catch (PDOException $e) {
  echo $e->getMessage();
  exit;
}
```
## prepare,bindvalue,executeを使ってデータを挿入
prepareでSQL分を準備し、bindvalueで値をセットし、executeで実行します。

```php:index.php
try {
  $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $stmt = $db->prepare("insert into users (name, score) values (?, ?)");

  $name = 'Roger';
  $stmt->bindValue(1, $name, PDO::PARAM_STR);
#prepareで用意された１つ目の？に対して値をセットし、データの型はSTRを指定している
  $score = 23;
  $stmt->bindValue(2, $score, PDO::PARAM_INT);
#prepareで用意された2つ目の？に対して値をセットし、データの型はINTを指定している
  $stmt->execute();

} catch (PDOException $e) {
  echo $e->getMessage();
  exit;
}
```
## queryメソッドを使って挿入されたデータを取得し、表示する

さて、挿入はできましたので、次はデータベースに保存されているデータを取得し、表示することをしたいと思います。
データベースのデータを取得するメソッドにはqueryとfetchAllを利用します。

```php:index.php
try {
  // connect
  $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // select all
  $stmt = $db->query("select * from users");
#queryを使ってSQLを発行します
  $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
#SQLを発行した後、ステートメントオブジェクトが持つfetchAllメソッドを使い全件抽出しています。引き数にはFETCH_ASSOCを利用し、連想配列になるように取得しています。
  foreach ($users as $user) {
    var_dump($user);
  }
#返り値が配列となって返ってきているので、　繰り返し処理で１つづつ取り出していきます。　
  echo $stmt->rowCount() . " records found.";
#rowCountメソッドを使っていくつのレコードを取得したかを表示しています。

} catch (PDOException $e) {
  echo $e->getMessage();
  exit;
}
```
## おまけ
念のためphpのビルドインサーバーを立ち上げ方法も書いておきます。

```
ip a
→マシーンのIPアドレスを調べることができるコマンド
PDOに関しては他にも色々ありますが、上記を組み合わせれば基本的なフォームの処理は実現できるとおもいます。

php -S [ip aで調べたアドレス]:[ポート番号]
→ビルドインサーバの立ち上げ。　その後はブラウザで確認
```

PDOは他にも色々ありますが、　上記のメソッドを組み合わせれば色々と処理ができるかと思います。