22
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPでデータベースに接続してみる

Last updated at Posted at 2016-03-22

はじめに

前提として、Vagrantでローカル環境を構築しPHPとApacheをインストールしておきます。
インストールしていない場合、下記でインストールします。

$ sudo yum install httpd
$ sudo yum install php php-cli php-common php-gd php-in tl php-mbstring php-mysql php-pdo

テーブルの構造

下記のようなテーブルがあるという前提となります。

mysql> desc users;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
| email | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

PDOでのデータベース接続

PDOとは

PDOは「PHP Data Objects」の略で、PHP標準(5.1.0以降)のデータベース接続クラスのことです。

PDOでデータベースに接続する

$db = new PDO('データベースの種類:host=接続先アドレス;dbname=データベース名', 'ユーザー名', 'パスワード');

エラーがでた場合はPDOException(PDO が発するエラー)を投げるようにする

エラーをスローするには、PDO->setAttribute()でエラーの属性を設定します。

//PDO::ATTR_ERRMODE エラーレポート 
//PDO::ERRMODE_EXCEPTION exceptionsを投げる
PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION) 

接続してみる。

<?php
  define('DB_DATABASE','my_db');
  define('DB_USERNAME','my_user');
  define('DB_PASSWORD','password');
  define('PDO_DSN','mysql:host=localhost;dbname=' . DB_DATABASE);

  try{
    //DB接続
    $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
    //エラーをスロー
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  } catch(PDOException $e){
    echo $e->getMessage();
    exit;
  }
 ?>

データベースへの接続を切る

データベースへの接続を切るには、PDOクラスで作成したオブジェクトをnullで置き換えるだけです。

$db = null;

PHPからテーブルにレコードを入れてみる

レコードを追加するには、下記のPDOオブジェクトのメソッドを使用します。

  • exec()
  • query()
  • prepare()

exec関数

引数に指定したコマンド($command)を実行します。
また、コマンドの実行結果を返却しません。

exec ( string $command [, array &$output [, int &$return_var ]] );

実行

<?php
  define('DB_DATABASE','php_test');
  define('DB_USERNAME','user');
  define('DB_PASSWORD','Sato2323');
  define('PDO_DSN','mysql:dbhost=localhost;dbname=' . DB_DATABASE);

  try{
    //DB接続
    $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //テーブルにレコードを追加
    $db -> exec("insert into users (name,email) values ('sato','sato@hogehoge.com')");

  } catch(PDOException $e){
    echo $e->getMessage();
    exit;
  }
 ?>

実行結果

設定した値が挿入されているのが確認できる。

mysql> select * from users;
+----+------+-------------------+
| id | name | email             |
+----+------+-------------------+
|  1 | sato | sato@hogehoge.com |
+----+------+-------------------+

prepare関数

引数に指定したコマンド($command)に、異なるパラメータを用いて複数回実行するコマンドに適しています。
また、コマンドの実行結果を返却します。

prepare ( string $command [, array driver_options] );

実行

<?php
  define('DB_DATABASE','php_test');
  define('DB_USERNAME','user');
  define('DB_PASSWORD','Sato2323');
  define('PDO_DSN','mysql:dbhost=localhost;dbname=' . DB_DATABASE);

  try{
    //DB接続
    $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $db->prepare('insert into users (name,email) values(?,?)');
    $stmt->execute(array('sato','sato@hogehoge.com'));

  } catch(PDOException $e){
    echo $e->getMessage();
    exit;
  }
 ?>

$stmt->execute(array('sato','sato@hogehoge.com'));の箇所を、
$stmt->execute(['sato','sato@hogehoge.com']);と書いたら動かなかった。なぜ・・・。

追記:下記の書き方はPHP 5.3以前では動かないようです。ちなみに実行時のバージョンは5.3.3でした。

$stmt->execute(['sato','sato@hogehoge.com']);

実行結果

設定した値が挿入されているのが確認できる。

mysql> select * from users;
+----+------+-------------------+
| id | name | email             |
+----+------+-------------------+
|  1 | sato | sato@hogehoge.com |
+----+------+-------------------+

prepare関数のパラメーターに名前を指定する

prepare関数のパラメーターに名前を指定することができます。指定の仕方は下記になります。

名前無しのパラメーター

$stmt = $db->prepare('insert into users (name,email) values(?,?)');
$stmt->execute(array('sato','sato@hogehoge.com'));

名前付きのパラメーター

$stmt = $db->prepare('insert into users (name,email) values(:name,:email)');
$stmt->execute(array('name'=>'sato','email'=>'sato@hogehoge.com'));

execute()する際に、パラメーターの値をbindValueで設定する

例えば、satoという名前のユーザーに、複数のemailを設定したい場合などに、bindValue関数を使用すると便利らしい。。。

bindValue(パラメーター名もしくはindex番号,パラメータにバインドする値,データ型);
実行
<?php
  define('DB_DATABASE','php_test');
  define('DB_USERNAME','user');
  define('DB_PASSWORD','Sato2323');
  define('PDO_DSN','mysql:dbhost=localhost;dbname=' . DB_DATABASE);

  try{
    //DB接続
    $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $db->prepare('insert into users (name,email) values(?,?)');
    
    //名前付きパラメーターの場合
    //$stmt = $db->prepare('insert into users (name,email) values(:name,:email)');

    
    $name = 'sato';
    $stmt -> bindValue(1,$name,PDO::PARAM_STR);
    //名前付きパラメーターの場合
    //$stmt -> bindValue(':name',$name,PDO::PARAM_STR);
    
    $email = 'sato@hogehoge.com';
    $stmt -> bindValue(2,$email,PDO::PARAM_STR);
    //名前付きパラメーターの場合
    //$stmt -> bindValue(':email',$email,PDO::PARAM_STR);
    $stmt->execute();

    $email = 'sato2@hogehoge.com';
    $stmt -> bindValue(2,$email,PDO::PARAM_STR);
    $stmt->execute();

    $email = 'sato3@hogehoge.com';
    $stmt -> bindValue(2,$email,PDO::PARAM_STR);
    $stmt->execute();

  } catch(PDOException $e){
    echo $e->getMessage();
    exit;
  }
 ?>

実行結果

名前を固定化して値が挿入されているのが確認できる。

mysql> select * from users;
+----+------+--------------------+
| id | name | email              |
+----+------+--------------------+
| 10 | sato | sato@hogehoge.com  |
| 11 | sato | sato2@hogehoge.com |
| 12 | sato | sato3@hogehoge.com |
+----+------+--------------------+

execute()する際に、パラメーターの値をbindParamで設定する

bindValueは値そのものを設定するのに対して、bindParamは変数への参照を設定します。
bindParamが変数の値を参照するタイミングはexecute()が実行時です。

実行
<?php
  define('DB_DATABASE','php_test');
  define('DB_USERNAME','user');
  define('DB_PASSWORD','Sato2323');
  define('PDO_DSN','mysql:dbhost=localhost;dbname=' . DB_DATABASE);

  try{
    //DB接続
    $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

    $name = 'sato';
    $stmt -> bindValue(1,$name,PDO::PARAM_STR);
    $email = 'sato@hogehoge.com';
    $stmt -> bindParam(2,$email,PDO::PARAM_STR);
    $stmt->execute();
    $email = 'sato1@hogehoge.com';
    $stmt->execute();
    $email = 'sato2@hogehoge.com';
    $stmt->execute();

  } catch(PDOException $e){
    echo $e->getMessage();
    exit;
  }
 ?>


実行結果

変数を書き換えた値が、正しく反映されていることが確認できます。

mysql> select * from users;
+----+------+--------------------+
| id | name | email              |
+----+------+--------------------+
| 16 | sato | sato@hogehoge.com  |
| 17 | sato | sato1@hogehoge.com |
| 18 | sato | sato2@hogehoge.com |
+----+------+--------------------+

query関数

引数に指定したコマンド($command)に、異なるパラメータを用いて1回実行するコマンドに適しています。
また、コマンドの実行結果を返却します。

query ( string $command [, array driver_options] );
実行

<?php
  define('DB_DATABASE','php_test');
  define('DB_USERNAME','user');
  define('DB_PASSWORD','Sato2323');
  define('PDO_DSN','mysql:dbhost=localhost;dbname=' . DB_DATABASE);

  try{
    //DB接続
    $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //テーブルのレコードを抽出
    $stmt = $db->query('select * from users');
    //fetchAll(PDO::返却される配列の形式)でquery関数で返却された値を全件取得します
    $users = $stmt -> fetchAll(PDO::FETCH_ASSOC);

    foreach ($users as $user) {
      var_dump($user);
      echo
    }

  } catch(PDOException $e){
      echo 'user error';
    echo $e->getMessage();
    exit;
  }
 ?>

実行結果

画面上に下記のように表示され、レコードが取得出来ているのが確認できます。

array(3) {
  ["id"]=>string(2) "16"
  ["name"]=>string(4) "sato"
  ["email"]=>string(17) "sato@hogehoge.com"
}
array(3) {
  ["id"]=>string(2) "17"
  ["name"]=>string(4) "sato"
  ["email"]=>string(18) "sato1@hogehoge.com"
}
array(3) {
  ["id"]=>string(2) "18"
  ["name"]=>string(4) "sato"
  ["email"]=>string(18) "sato2@hogehoge.com"
}

おわり

データベースに接続して、値を設定したり、取得できたりしました。
この辺りはもっと勉強が必要そうです。

22
35
2

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
22
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?