PHP

【PHP・PDO】データベースに接続する方法

こんにちは、ともです。

PHPを利用してデータベースに接続する方法について僕の理解をまとめたいと思います。

記事で利用しているPHPのバージョンは5.3.3でDBはMySQLです。

この記事では、PHPのPDOを利用し、データベースに接続する方法についてまとめます。

mysqlへの接続モジュールを利用する

mysql_connectメソッド等が利用できるモジュールは PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除されましたメソッドです。

一応サンプルを載せておきます。

<?php
// MySQLに接続
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);

// データベースを選択
mysql_select_db('test_db', $link);

// エスケープ処理
$sql = "INSERT INTO `post` (`name`, `comment`, `created_at`) VALUES('"
            . mysql_real_escape_string($name) . "', '"
            . mysql_real_escape_string($comment) . "', '"
            . date('Y-m-d H:i:s') . "')";

// SQLの実行
$result = mysql_query($sql, $link);

// 接続の解放
mysql_free_result($result);
mysql_close($link);

 

MySQLに接続しデータベースを選択。ユーザ入力の文字列をエスケープしSQLの実行を行ない接続を切るまでのコードです。

しかし、これらのコードは非推奨なので利用すべきではありません。

その代わりにPDO(PHP Data Object)という現在もサーポートされているPHP標準のクラスを利用すべきです。

php-mysqlのモジュールを利用していると、mysql専用になってしまうというデメリットもありますし、PDOを利用するようにしましょう。

PDOを利用する(PHP5.1以上)

PDOインスタンスの生成

PDOを利用するにはまずPDOクラスのインスタンスを生成し接続を確立させます。

//$dns = 'mysqld:dbname=データベース名;host=ホスト名';
//dns(Database Source Name)
$dns = 'mysqld:dbname=myapp;host=localhost';
$usre = 'root';
$password = '';
$con = new PDO($dns, $user, $password);

PDOのコンストラクタの引数は次のようになっており、mysqlへの接続の場合を記述しています。DB名やホスト名等を自身の環境に合うように入力します。

第一引数($dns) Database Source NameというDBへの接続情報である文字列
第二引数($user) ユーザ名
第三引数($password) パスワード

次にクエリの実行について見ていきます。

query (ユーザ入力の無いSQL文)

$con->prepare('SQL文');

ユーザ入力が無いSQL文を実行する場合はprepareメソッドが利用できます。

次の場合にこのメソッドを利用します。

  • ユーザ入力の無いSQLを実行する
  • 返り値をPDOStatementクラスのオブジェクトで欲しい

mysqlモジュールの場合であればセキュリティ対策としてユーザ入力があるSQL文はmysql_real_escape_stringを利用してエスケープしていました。

queryメソッドはそのようなエスケープ処理をする必要のないSQL文を実行するために利用できます。

また返り値がPDOStatementクラスのオブジェクトであり、execメソッドは作用した行数が返り値で帰ってきます。

この違いでqueryを利用すべきかexecを利用すべきかの違いになります。

exec (ユーザ入力の無いSQL文)

$con->exec('SQL文');

ユーザ入力が無いSQL文を実行する場合はexecソッドが利用できます。

次の場合にこのメソッドを利用します。

  • ユーザ入力の無いSQLを実行する
  • 返り値を行数で欲しい

例えば、テーブルの全件を削除するSQLを発行する場合、execで実行すればテーブルの行数が返り値として返ってきます。

// $resultはINTであり、削除した件数
$result = $con->exec('DELETE  FROM users');

queryではPDOStatementが返り値でしたがexecは行数であるというのがキーポイントとなります。

execute (ユーザ入力有りのSQL文)

executeのユーザ入力がある場合のSQLの実行を行う場合のメソッドです。

次のような流れで実行します。

// ユーザ入力の部分は:変数名の形式のSQL文
$sql = "INSERT INTO users (id, name) VALUES (:id, :name)";
// プリペアドステートメントの作成
$stmt = $con->prepare($sql);
// SQL文の:id, :nameをキー、値をvalueの連想配列を作成
$param = array(':id' => 3, ':name' => 'hoge');
// executeで実行。paramがsql文にセットされた状態でSQLが実行される
$stmt->execute($param);

初めの$sqlには、ユーザ入力部分が空の状態のSQL文を作成します。

次にそのSQL文をprepareメソッドを利用しプリペアドステートメント(準備済みSQL)を生成します。

最後に、SQLのプレースホルダを埋めるため値を連想配列で作成しexecuteでSQLを実行します

もう少し詳しく説明した記事を書きましたので合わせて読んで見てください。

まとめ

PHPでデータベースを操作する方法について書きました。

  • mysqlモジュールではなくPDOを利用する
  • ユーザ入力を含むSQLかで使い分ける
  • prepareで準備した後にexecuteで実行する

またPDOについて理解が深まれば記事にしたいと思います。