とりあえず前回まででPHP-MYSQL連携が可能になったので今回は簡単なアプリを。
簡単な概要として、まず名前、パスワード、性別の各入力欄および入力内容を実際にDBへ登録し、DB内に登録されたデータを表示するというもの(画像参照)
ざっと完成までの手順を。
①まずMYSQLにてデータ格納用DBの作成(ID,アカウント,パスワード,性別のカラムを持つテーブルを作成。)
②フォーム入力部分の作成
③フォーム入力データを受け取る部分の作成
④フォーム入力データをDBへ登録する部分の作成
⑤DBへ登録されているデータの表示部分の作成
とりあえずDB
mysql> create database account;
>>DB「account」作成
mysql> use account;
>>DB「account」へ移動
mysql> create table user(id int not null auto_increment,name char(30), pass char(30),sex char(30),primary key(id));
>>table「user」作成。
mysql> create table user(id int not null auto_increment,name char(30), pass char(30),sex char(30),primary key(id));
>>「user」テーブル作成。カラムは「id」「name」「pass」「sex」の4つ。
>>「id int not null」の「notnull」は0を含まない(1から始まる)の意。
>>「auto_increment」は毎回勝手に数値を+1してくれる処理。
>>↑の「not null」と「auto_increment」の2つの機能が合わさると、
>>idは1から始まり、尚且つDBへの書き込みがなされる度に自動でIDNoが増加して>>いく。
mysql> describe user;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(30) | YES | | NULL | |
| pass | char(30) | YES | | NULL | |
| sex | char(30) | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
>>確認。
>>これで準備は完了。
>>次にデータ操作の要となるプログラムの作成。
*********************test3.php*************************************①
<html>
<head></head>
<body>
<form method="POST" action="test3.php">
<table border="1">
<tr>
<td>アカウント名:</td><td><input type="text" name="name"value=""></td>
<td>パスワード:</td><td><input type="password" name="pass" value=""></td>
<td>性別:</td><td><input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="famale">女
<input type="hidden" name="mode" value="input"></td>
<td><input type="submit" value="書き込み"></td>
</tr>
</table>
<table border="1">
<tr>
<td>ID</td><td>アカウント名</td><td>パスワード</td><td>性別</td>
</tr>
</form>
********************↑までがデータ受け取りフォーム部分*******************
********************↓からがデータ処理部分*******************②
<?php
if($_POST["mode"]=="input"){
$name = $_POST["name"];
$pass = $_POST["pass"];
$sex = $_POST["sex"];
$connect = mysql_connect('localhost','root','root0101');
$db_selected = mysql_select_db('account',$connect);
$result = mysql_query("insert into user values('','".$name."','".$pass."','".$sex."')");
}
mysql_close($connect);
?>
<?php
$connect = mysql_connect('localhost','root','root0101');
$db_selected = mysql_select_db('account',$connect);
$result = mysql_query("select id,name,pass,sex FROM user");
while($row = mysql_fetch_assoc($result)){
print('<tr><td>'.$row['id']."</td>");
print('<td>'.$row['name']."</td>");
print('<td>'.$row['pass']."</td>");
print('<td>'.$row['sex'].'</td>');
/*print('id'.$row['id']);
print('name'.$row['name']);
print('pass'.$row['pass']);
print('sex'.$row['sex']);
*/
}
mysql_close($connect);
?>
</table>
</body>
</html>
********************************************************************************************
解説:
まずは①から。
上から順に解説。
基本HTMLは各自ぐぐる様に。HTMLの基礎からは解説しません。予めHTMLの理解があるという前提で解説。
<form method="POST" action="test3.php">
まずはここの部分。WEBアプリでのHTMLページ間でのデータのやりとりは基本的に「データ送信形式」および「データの送り先ファイル名」の2点を指定して行う。
上記に当てはめると、「データ送信形式:POST形式」「データ送信先:test3.php」となる。
このデータ送信形式は基本的に2種類あり、GET形式、POST形式の2つがある。
細かくは解説しないが(POST形式 GET形式でぐぐると出てきます)とりあえずPOSTという形式でデータを送る。
次に送信先だが、一般的には「入力フォーム画面」「確認フォーム画面」「完了フォーム画面」の3つの段階で遷移するので、入力フォーム画面での送信先は確認画面のファイル、また、確認画面では完了画面のファイルを指定することになるが、今回はあくまで簡易なので入力フォームと確認画面(データ登録が完了したかどうか)が同一という設定なので、自分自身(test3.php自身)に対してデータを送信する。
まとめると、<form method="POST" action="test3.php">
は「POSTデータ形式」で「test3.php」にフォームで入力された各値を送りつける。となる。
次に
<input type="text" name="name"value="">
<input type="password" name="pass" value="">
<input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="famale">女
の部分であるが、すべてに共通して「name=」という値があるのがおわかりだろうか。
これは、name=で指定された名前のラベルをデータごとに紐つける役割を果たす。
例をあげるなら、
<input type="password" name="pass" value="">の入力欄でもし「hogehoge」と入力されたとしよう。
すると入力された値「hogehoge」には、「pass」というラベルが付く。
このラベル「pass」を指定することで、中身である「hogehoge」を取得することができるようになる。
実際にこの「hogehoge」をPHP側で取得するにはまだ過程があるが、とりあえずの認識としてそういうことにしておく。
最後に、
<input type="hidden" name="mode" value="input">であるが、この「input type="hidden"」は、他のinput typeと違い、画面上に表示されない。いわば、隠しタグである。
しかし、何故このような隠しタグが必要なのかというと、状態の判別に使用するからである。
ここで、状態とは。
今回取り扱うアプリは、機能として①フォーム入力して登録する機能 ②登録された内容を表示する機能
の2つある。
表示する機能はページがブラウザで表示される度、毎回表示するのはいいとして、書き込み処理は、書き込みがなされた時のみでいはずである。
つまり、ブラウザを表示するたびごとに書き込み処理を行う必要はない(ブラウザ表示毎に勝手に書き込みが実行されると空データばかり無駄に書きこまれてしまうことになる)。
つまるところ、今現在「ブラウザでデータを表示しているだけ」なのか、「書き込み処理をしている」最中なのか、判別する必要が出てくるわけだ。
その判別を行うのが、このmode=""部分である。先にphp部分を見てみると、
if($_POST["mode"]=="input"){}
という表記がある。
これは、もし変数modeに中身がinputだったときに{}内の処理を実行するという意味である。
つまり、modeが空ならば何にもしない「ブラウザでデータを表示しているだけ」
modeにinputという値が入っている場合「書き込み処理をしている」
以上となる。
それでは、phpの解説に入っていく。
<?php
if($_POST["mode"]=="input"){
$name = $_POST["name"];
$pass = $_POST["pass"];
$sex = $_POST["sex"];
$connect = mysql_connect('localhost','root','pass');
$db_selected = mysql_select_db('account',$connect);
$result = mysql_query("insert into user values('','".$name."','".$pass."','".$sex."')");
}
mysql_close($connect);
?>
上で説明したように、modeがinput(書き込み)なら、$name,$pass,$sexそれぞれの変数に対して、
ラベルを基にしてフォームから受け取ったデータを格納している。
$_POST["name"]は、フォームの"name"ラベルのついた入力データ。
$_POST["pass"]は、フォームの"pass"ラベルのついたデータ。
$_POST["sex"]はフォームの"sex"ラベルのついたデータ。
大元となる判断(条件式)として、modeにinputが入っている時、つまり書き込みモードの時のみ上記のフォームからの値の受け渡しが行われる。
次の$connect = mysql_connect('localhost','root','pass');は、データベース接続関数。
mysql_connect('サーバ名','ユーザー名','パスワード');でDBへ接続する。
$db_selected = mysql_select_db('account',$connect);
のmysql_select_db('account',$connect);部分で、DBの指定を行う。
$result = mysql_query("insert into user values('','".$name."','".$pass."','".$sex."')");
そして実際に↑でSQL構文であるINSERT文を用いてそれぞれのフォームの値$name,$pass,$sexをDBへ格納している。
mysql_close($connect);
最後にDBとの接続を切断して処理の終了となる。
ここまでがフォームからのデータ受け取り、及びDBへの登録部分である。
次に、登録された情報をDBから取得し、表示させる部分。
<?php
$connect = mysql_connect('localhost','root','password');
$db_selected = mysql_select_db('account',$connect);
$result = mysql_query("select id,name,pass,sex FROM user");
while($row = mysql_fetch_assoc($result)){
print('<tr><td>'.$row['id']."</td>");
print('<td>'.$row['name']."</td>");
print('<td>'.$row['pass']."</td>");
print('<td>'.$row['sex'].'</td>');
}
mysql_close($connect);
?>
$connectおよび$db_selected は同上。
mysql_query("select id,name,pass,sex FROM user");
SQL文として、select文を使い、userテーブルからid,name,pass,sexそれぞれのデータを取得。
DBからのデータ取得の場合、単一情報の取得はできないので(データは配列・連想配列の形でしか取得できない)mysql_fetch_assoc($result)という関数を用いて、連想配列の(各カラムをキーにした)形ですべて書き出す。
while文は中身がなくなるまで繰り返し。
つまり、DBに登録されているid,name,pass,sexデータを一番初めから一番最後まですべて表示させるもの。