ウェブアプリケーションにおいて良く利用されるリレーショナルデータベース・MySQLとの連帯を学ぶにあたり、まずはフォーム画面に入力した名前をデータベースに登録するだけのシンプルなシステムを作成します。
※前提条件
MySQLはLINUX等のシステムで既にインストール済
MySQLコマンドでの操作を行う
スポンサーリンク
手順
まずはデータベースを用意します。MySQLにつないだら、sample01データベースを生成し、その中にnameテーブルを作成します。
sample01データベースの作成
1 |
CREATE DATABASE sample01; |
次にidとnameをカラムとして持つ下記のような構造のnameテーブルを作成します。
1 2 3 4 5 6 |
USE sample01; CREATE TABLE name ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name TEXT NOT NULL )DEFAULT CHARACTER SET=utf8; |
次にフォーム画面(database1.html)とMySQLと接続しデータを登録するファイル(database2.php)を作成します。
database1.html(フォーム画面)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!DOCTYPE html> <html> <head> <title>データを入力する</title> <meta charset="utf-8"> </head> <body> <h1>フォーム画面</h1> <form action="database2.php" method="post"> 名前を入力:<input type="text" name="yourname"> <input type="submit" value="登録する"> </form> </body> </html> |
関連ページ
database2.php
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 |
<?php header("Content-type: text/html; charset=utf-8"); //データベース接続 $server = "◯◯◯"; $userName = "◯◯◯"; $password = "◯◯◯"; $dbName = "sample01"; $mysqli = new mysqli($server, $userName, $password,$dbName); if ($mysqli->connect_error){ echo $mysqli->connect_error; exit(); }else{ $mysqli->set_charset("utf-8"); } if(empty($_POST)) { echo "<a href='database1.html'>database1.html</a>←こちらのページからどうぞ"; }else{ //名前入力判定 if (!isset($_POST['yourname']) || $_POST['yourname'] === "" ){ echo "名前が入力されていません。"; }else{ //プリペアドステートメント $stmt = $mysqli->prepare("INSERT INTO name (name) VALUES (?)"); if($stmt){ //プレースホルダへ実際の値を設定する $stmt->bind_param('s', $yourname); $yourname = $_POST['yourname']; if($stmt->execute()){ echo htmlspecialchars($yourname, ENT_QUOTES, 'UTF-8')."さんで登録いたしました。"; }else{ echo $stmt->errno . $stmt->error; } //ステートメント切断 $stmt->close(); }else{ echo $mysqli->errno . $mysqli->error; } } } // データベース切断 $mysqli->close(); ?> |
5〜18行目
MySQLとの接続
6〜8行目
環境に合わせて適当な値を設定して下さい。
PHPがMySQLと接続する方法は主に下記の4つあります。
mysqli拡張モジュール(MySQLi関数)
PDO(PHP Data Objects)
PEARパッケージ(MDB2が有名だが実質メンテナンスはストップしている)
フレームワーク(CakePHP等)の独自機能
今回はmysqli拡張モジュールを利用しています。記述の方法には、オブジェクト指向型と手続き型がありますが、今回はオブジェクト指向型で記述しています。
参照ページ
http://php.net/manual/ja/mysqli.construct.php
ちなみに古い参考書等で見かけるmysql拡張モジュールは、PHPのバージョン5.5.0以降は非推奨であり、PHP7.0.0では削除されたので利用しないほうがいいでしょう。
http://php.net/manual/ja/intro.mysql.php
PDOはMySQLのみならず、他のデータベースに対しても違いを意識せずにプログラムを記述することができます。mysqli拡張モジュールと同じくPHPに標準でバンドルされ、処理能力も速いです。
20行目
このページに直接アクセスされた場合の判定をしています。
24行目
isset($_POST[‘yourname’]) では変数がセットされNULLでないことを判定しています。
$_POST[‘yourname’] === “”では値が空でないことを判定しています。
値が入力されているかをチェックしています。
28〜33行目
プリペアドステートメントでSQLを生成しています。mysqli拡張モジュールは名前付きプレースホルダが利用できないので、name(nameテーブルのnameカラム)をプレースホルダ「?」に置き換えてクエリを実行しています。プリペアドステートメントは値が文字列になるので、SQLインジェクションの対策としても有効です。
もしプリペアドステートメントを利用せずに、入力された値をSQL文に直接連結する場合は、各データベースインターフェースが提供しているエスケープ関数などを利用します。mysqliでは、mysqli_real_escape_string()関数が用意されています。
参照ページ
http://php.net/manual/ja/pdo.prepared-statements.php
http://php.net/manual/ja/mysqli.real-escape-string.php
36行目
HTMLで表示させる直前にhtmlspecialchars関数でHTMLエンティティに変換しています。
※注意
htmlspecialchars関数はクロスサイト・スクリプティング(XSS)対策のために利用されますが、HTMLテキスト用のエスケープ関数なので万全ではありません。例えば、 <a href=”◯◯◯”>sample</a>の◯◯◯のようなタグの中で出力する場合は、htmlspecialcharsが効かない場合があります。
試しに javascript:alert(‘Test’) という文字列が入力された場合を想定して、下記のコードのようにa hrefの属性に設定します。ブラウザで表示させるとアラートが表示されてしまいます。
1 2 3 4 |
<?php $xss = "javascript:alert('Test')"; echo '<a href="'.htmlspecialchars($xss, ENT_QUOTES).'">Test</a>'; ?> |
このような場合は、入力時に正規表現でjavascriptが入っていないかをチェックしたり、「http://」や「https://」で始まる文字列のみを出力するなどの処理(ホワイトリスト方式)が必要となります。
htmlspecialchars関数についての関連ページ
次はこちらのページへ
関連ページ