こんにちは、
掃除にはまっているサトウです。
さて、本題に入りたいと思います。
phpの学習を進めると、「データベースへの接続」について学び始めている方も多いのではないでしょうか。データベースへの接続方法はやや複雑なため理解できない方も少なくないのでは、、、。と思い、今回はデータベースの接続方法について分かりやすく説明していきます。
データベースの中でも利用頻度の高い「MySQL」への接続について解説していくので、phpを学び始めた方や「phpからMySQLへの接続方法」について分からない方は、是非読んでみてくださいね。
目次
MySQLとは?
MySQLの概要
MySQLとはオープンソース(中身のソースコードが公開されているソース)のデータベースの1つで、世界的に広く使用されています。(他にもMySQL以外だとPostgreSQLやMongoDBといったデータベースもよく使用されています。)
MySQLは特に以下の点が優れています。
・ほとんどのレンタルサーバーで使用することが出来き、データを安全に、かつ高速に検索し、変更の一貫性を保つことが出来る点。
・複数人が同時に利用可能(マルチユーザー対応)な点。
MySQLへの接続方法(PDOでの接続)
MySQLへの接続にはいくつか方法がありますが、今回はPDO(PHP Data Objects)を使っての接続方法を解説していきます。PDOでの接続方法は将来的にMySQL以外のデータベースに変更・移植する可能性があっても同じ関数を使うことができるので、現場での使用頻度が高い書き方になります。
MySQLに接続する時は、以下のように記述します。
1 2 3 4 5 6 7 8 9 10 11 |
$dsn = 'mysql:dbname=mysql_test;host=localhost;charset=utf8'; $user = ユーザー名; $password = 'パスワード; $options = array( // SQL実行失敗時には例外をスローしてくれる PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // カラム名をキーとする連想配列で取得する.これが一番ポピュラーな設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,); |
データソース名(Data Source Name)の略で、データベースに接続するために必要な情報が含まれています。
サーバー名:localhostやIPアドレスなどを指定します。
データベース名:データベース名を指定します。
文字エンコード:文字エンコードを指定します。utf8と指定する場合が多いです。
$user
ルート権限のデフォルト値は、rootになっています。必要に応じて変更するようにしましょう。
$password
データベース利用にあたっての管理者パスワードです。
$options = array();
接続時のオプションを連想配列で渡しています。エラーが起こった際の処理内容やクエリ実行時のデータの取得方法等を指定しています。
この箇所はやや複雑なので、学習初期段階では「こういう指定方法があるんだな」という程度の理解で十分です。
$dbh
これまで変数に入れたものを使って新しいオブジェクトを生成しています。new演算子というものを使い「new PDO()」 といった書き方をします。変数名は何でも良いのですが$dbh(DataBase Holder)といったものがよく使用されます。
ここまでがPDOでのDB接続の基本的な記述方法となります。
DB接続の処理の後にSQL文(データを登録する・検索する等指示)を書いて、処理を実行していきます。
見慣れないものが多いと思いますが、是非何度か書いて接続の確認テストをしてみてください。
MySQLへの接続(実践編)
ここからは実際にMySQLに接続して簡易な機能を作成しながら内容の解説していきます。
題材として以下を用意しました。MySQLへの接続のイメージを掴んでみてください。
「名前」欄を入力する
入力した名前が「送信した名前」に表示される
入力した名前が「データベース」の「usersテーブル」に登録される
完成イメージ
全体のコードがこちらになります。
サンプルコード(完成後)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<?php // ログの表示 ini_set('log_errors','On'); ini_set('error_log','php.log'); // (2)postされていれば以下の処理を実行 if(!empty($_POST['user_name'])){ // (3)POSTした情報を変数に入れる $user_name = $_POST['user_name']; // (5)DBに接続 $dsn = 'mysql:dbname=mysql_test;host=localhost;charset=utf8'; $user = 'ユーザー名'; $password = 'パスワード'; $options = array( // SQL実行失敗時には例外をスローしてくれる PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // カラム名をキーとする連想配列で取得する.これが一番ポピュラーな設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,); // PDOオブジェクト生成(DBへ接続) $dbh = new PDO($dsn,$user,$password,$options); // (6)SQL文の作成:usersテーブルの「user_name」「create_date」カラムに値を挿入 $sql = 'INSERT INTO users(user_name,create_date) VALUES(:user_name,:create_date)'; $stmt = $dbh->prepare($sql); // (7)SQLの命令文を実行する // プレースホルダを使って値をバインドしてあげる $stmt->execute(array( ':user_name' => $user_name, ':create_date' => date("Y-m-d H:i:s"))); // post送信されていなければ何も表示しない }else{ $user_name = ''; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="style.css"> <title>Mysql接続テスト</title> </head> <body> <section class="form-container"> <!-- (4)変数に入れた文字列をそのまま表示 --> <div class="textarea">送信した名前:<?php echo $user_name;?></div> <!-- (1)formタグからpost送信する --> <form action="" method="post" class="form"> <input type="text" name="user_name" class="input input-outline" placeholder="名前"> <input type="submit" value="送信する" class="input btn"> </form> </section> </body> </html> |
大まかな処理の流れは以下のとおりです。
処理の流れ
(4)変数に入れた文字列をそのまま表示
それぞれ内容を解説していきます。
formタグからpost送信する
1 2 3 4 |
<form action="" method="post" class="form"> <input type="text" name="user_name" class="input input-outline" placeholder="名前"> <input type="submit" value="送信する" class="input btn"> </form> |
postされていれば以下の処理を実行
post送信されているかどうかを!emptyで判定しています。
1 2 3 |
// (2)postされていれば以下の処理を実行 if(!empty($_POST['user_name'])){ } |
postした情報を変数に入れる
ユーザー名と分かるようにuse_nameという変数を用意してそこにデータを入れています。
1 2 |
// (3)POSTした情報を変数に入れる $user_name = $_POST['user_name']; |
変数に入れた文字列をそのまま表示
今回は入力チェック等せずに、入力した文字列をそのまま表示しています。
1 2 |
<!-- (4)変数に入れた文字列をそのまま表示 --> <div class="textarea">送信した名前:<?php echo $user_name;?></div> |
DBに接続
2章で解説したPDOでの書き方で記述しています。ユーザー名・パスワードはご自身のMAMPの情報で書き換えて書いてみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// (5)DBに接続 $dsn = 'mysql:dbname=mysql_test;host=localhost;charset=utf8'; $user = 'ユーザー名'; $password = 'パスワード'; $options = array( // SQL実行失敗時には例外をスローしてくれる PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // カラム名をキーとする連想配列で取得する.これが一番ポピュラーな設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,); // PDOオブジェクト生成(DBへ接続) $dbh = new PDO($dsn,$user,$password,$options); |
SQL文の作成:usersテーブルの「user_name」「create_date」カラムに値を挿入
今回の例ではmysql_testというデータベースにusersというテーブルを用意しました。
usersテーブルのカラム(列)にuser_name(入力した名前)とcreate_date(データ登録日)を登録する命令文を書いています。
1 2 3 |
// (6)SQL文の作成:usersテーブルの「user_name」「create_date」カラムに値を挿入 $sql = 'INSERT INTO users(user_name,create_date) VALUES(:user_name,:create_date)'; $stmt = $dbh->prepare($sql); |
SQLの命令文を実行する
命令したSQL文を実行しています。ここではプレースホルダを使って、変数に入れた情報をそのまま登録しないようにしています。(入力した不正値がそのままデータベースに登録されるのを防ぐためプレースホルダを利用します。)
1 2 3 4 5 |
// (7)SQLの命令文を実行する // プレースホルダを使って値をバインドしてあげる $stmt->execute(array( ':user_name' => $user_name, ':create_date' => date("Y-m-d H:i:s"))); |
まとめ
いかがでしたか?今回はphpで「MySQL」への接続方法を中心に解説しました。
プログラミングを学び始めた頃は、「PDOオブジェクトでの接続方法」等、難しく感じる部分も多いと思いますが、量をこなしていくと簡単に使えることができる日が来ると思うので、焦らずにゆっくりと理解を深めていってくださいね。
この記事が、phpの学習に役立つと嬉しいです。