slimでpimpleを使ってデータベースに接続

pimpleを使ってデータベースへの接続を行いデータベースからデータを取ってくるようにします。

データベースにテーブルとデータを追加

MYSQLのhogeデータベースにユーザ「hoge」パスワード「hogepass」で接続できるように設定してます。

create databases hoge;
GRANT ALL PRIVILEGES ON hoge.* TO hoge@localhost IDENTIFIED BY 'hogepass';
flush privileges;
mysql> use hoge
mysql> create table user (name varchar(10));
mysql> insert into user (name)values('taka512');

dbに接続するクラスを作成

PDOを利用してMYSQLに接続するクラスです。

$ mkdir src/Taka512/Db
$ vi src/Taka512/Db/Mysql.php
<?php
namespace Taka512\Db;
class Mysql
{
    protected static $conn = null;
    public static function connect($host, $database, $user, $password)
    {
        if (self::$conn == null) {
            try {
                self::$conn = new \PDO(
                    sprintf('mysql:host=%s;dbname=%s;charset=utf8', $host, $database),
                    $user,
                    $password,
                    array(\PDO::ATTR_EMULATE_PREPARES => false)
                );
            } catch (\PDOException $e) {
                echo 'Connection failed: ' . $e->getMessage();
                die;
            }
        }
        return self::$conn;
    }
}

dbからデータを取得処理を作成

今までgetNameは固定文字列を返してましたがデータベースからデータを取得するように修正

$ vi src/Taka512/Services/NameService.php
class NameService
{
~省略~
    public function getName()
    {
        $name = null;
        try {
            $stmt = $this->di['db_master']->query("SELECT name FROM user");

            while($row = $stmt->fetch(\PDO::FETCH_ASSOC)){
                $name =  $row['name'];
            }
        } catch (\PDOException $e){
            var_dump($e->getMessage());
            die;
        }
        return $name;

index.phpの修正
pimpleにデータベースへの接続処理を追加します。

$ vi web/index.php
~省略~
$container = new Pimple();
$container['app'] = $app;

$container['db_master'] = $container->share(function($c){
       return \Taka512\Db\Mysql::connect(
            'localhost'/*host*/,
            'hoge'/*database*/,
            'hoge'/*id*/,
            'hogepass'/*pass*/);
        });

こんな感じでデータベースへの接続処理を追加できます。