PHPからMySQLを扱う方法を解説
世界的に広く使われているオープンソースのデータベースのひとつに、MySQLがあります。多くのシステムやWEBアプリ等で利用されているMySQLですが、PHPにはMySQLと簡単に接続することができるクラスが用意されています。
MySQLとは
MySQLとは世界的に広く使われているデータベースのひとつです。オープンソースのデータベースとして公開されており、初めてデータベースの学習をする人や、個人で開発を行う際にもおすすめのデータベースです。
データベースとは
データベースとは端的に言えば情報の集まりです。プログラムでWEBアプリやWEBシステム、スマホアプリ等を使用する場合、そのアプリ等に必要な情報は全てプログラム上に存在するわけではありません。多くの場合、そういった必要な情報は、情報を管理・集計するためにつくられた『データベース』に保存されます。
MySQLの特徴
プログラムが活用するデータベースには様々なものがあります。MySQLは世界的に使われている人気のデータベースのひとつです。
MySQLの他にはPostgreSQLやMongoDBなどが有名です。
様々なデータベースの中で、MySQLの特徴とされているのは『シンプルで速く、PHPやJavaなどと簡単に接続できる』ことです。
またその他にも、マルチユーザ対応がされており、複数人が同時に利用可能であるという点もまた、MySQLの特徴です。
PHPでMySQLを扱う
データベースは、ただデータベース単体で運用されるものではありません。基本的には、プログラムとデータベースを連携させることで、様々なWEBアプリやシステムを実現するものです。PHPからMySQLに接続して、データベースから値を取得したり、値を書き込んだりするためにはPDO ( PHP Data Object ) というデータベース接続用のクラスを使用します。
PDOでPHPからMySQLに接続する
localhostのMySQLサーバに接続する場合は、次のようにPDOのコンストラクタを呼び出します。
// 以下に接続する
// DB名:foo_db
// ユーザ名:user
// パスワード:’pass’
$pdo = new PDO('mysql:host=localhost;dbname=foo_db', ‘user’, ‘pass’);
コンストラクタに渡す引数は次の通りです。
- 第1引数:接続先(DSN:データソース名)
- 第2引数:ユーザ名
- 第3引数:パスワード
このうち第1引数の接続先 ( DSN:データソース名 ) はMySQLに接続する場合、基本的には次のような書式で書きます。
mysql:host=[ホスト名];port=[ポート番号];dbname=[データベース名]
ただし、portについては、MySQLがデフォルトのポート番号3306で起動している場合には省略することが可能です。上記のサンプルコードではportを省略しています。
PHPでMySQLにデータベースを作成する
MySQLに接続したら、次はMySQLに対してPHPからSQL文を実行します。SQLとはデータベースを操作するための『問い合わせ言語』です。SQLの基本構文についてはMySQL公式のリファレンスマニュアル 等で詳しく解説されているので、そちらをご参照ください。
PHPからMySQLにSQL文を実行するためのもっとも基本的な方法は、PDOクラスのquery()メソッドを使用することです。query()メソッドは、PDOクラスが持つSQL実行用のメソッドで、第1引数に実行したいSQL文を文字列として指定することで、そのSQLを実行することができます。
query()メソッドでtable作成、データの入力、データの取得を行う実際のサンプルコードは以下の通りです。
// MySQL接続
$pdo = new PDO('mysql:host=localhost;dbname=foo_db', ‘user’, ‘pass’);
// table作成
$pdo->query('CREATE TABLE foo_table (id INT, name VARCHAR(20))');
// 作成したテーブルにデータを入力する
$pdo->query('INSERT INTO foo_table (id, name) VALUES (1, "yamada")');
// テーブル全行取得(データ取得)
$result_rows = $pdo->query('SELECT * FROM foo_table');
query()メソッドはSQL文の実行結果を返却します。そのため、データ取得のサンプルコードで返却値を変数result_rowsに格納していますが、この変数の中にはSQL文の実行結果として、テーブルの全行のデータが設定されています。
なお、pdoメソッドの返却値はPDOStatementというクラスの値として返却されており、これは配列同様foreach文で扱うことのできる型となっています。
このため、この変数の中身を画面に出力する場合、次のように書くことができます。
foreach ( $result_rows as $row ) {
// テーブルの1行ごとに1つの配列として格納されている($row)
// その1行ごとの配列内で、列名をキーにした連想配列でデータが格納されている。
echo "id: {$row['id']}"; // id列
echo "name: {$row['name']}"; // name列
}
また、単にSQL文を実行するのみであればquery()メソッドで事足りますが、パラメータのみ異なる同じSQL文を複数回実行するとき等はPDOクラスのprepare()メソッドが有効です。prepare()メソッドには以下の特徴があります。
- メソッド実行後すぐにSQL文が実行されない(PDOStatementクラスのexecute()メソッドでSQL文が実行される)
- execute()実行時に用意したSQL文にパラメータを渡せる
prepareメソッドを使ってSQL文を実行するには、次のように書きます。
// MySQL接続
$pdo = new PDO('mysql:host=localhost;dbname=foo_db', ‘user’, ‘pass’);
// prepare()メソッド1 はてなマーク(?)でパラメータ指定
$pdoStatment1 = $pdo->prepare('INSERT INTO saitama_test (id, name) VALUES (?, ?)');
$pdoStatment1->execute(array(2, "akamine"));
// prepare()メソッド2 コロン(:)でパラメータ指定
$pdoStatment2 = $pdo->prepare('INSERT INTO saitama_test (id, name) VALUES (:id, :name)');
$pdoStatment2->execute(array(":id"=>3, ":name"=>"nishiyama"));
prepare()メソッドでSQL文にパラメータを設定するためには、上記サンプルコード中にもあるように、ふたつの方法があります。
ひとつ目は、はてなマーク(?)を利用する方法です。
prepare()メソッドの第一引数に指定するSQL文中のパラメータのうち、execute()実行時に値を設定したいパラメータをはてなマークにすると、その値は前から順にexecute()メソッドの第一引数に指定された配列の要素が先頭から割り当てられていきます。
サンプルコード中では『$pdoStatment1->execute(array(2, "akamine"));』というように、最初のはてなマークには2が、次のはてなマークには’akamine’が指定された状態でSQL文が実行されます。
もうひとつの方法は、コロン(:)を利用する方法です。
SQL文中のパラメータのうち、execute()実行時に値を設定したいパラメータを『コロン + パラメータ名』という形に変えます。
するとサンプルコードのように、execute()の第一引数に連想配列でパラメータを指定できます。
query()メソッドとprepare()メソッドを使い分けできると効率よくMySQLを操作するコードをPHPで書くことができます。
状況に応じて適切なメソッドを使いましょう。