とりあえず前回までで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データを一番初めから一番最後まですべて表示させるもの。

フェドラ8環境下でのPHP-MYSQL連携に大苦戦。

とりあえずはうまく…できたかな?

以下メモ書き。
*************************************************************************
fedora8インストール状態でapache(2.2.6),php(5.2.4)は入っている模様。

MYSQLは素だと入ってない?ぽいのでインスコ。

で、素のままインスコ(PHP元から。その後にMYSQL)状態でPHP-MYSQL連携とろうとしてもPHPにMYSQLを扱うためのモジュールが組み込まれていない(素でMYSQLがないのでMYSQLを扱うためのものがはいってない)ので、MYSQLインスコ後は一旦既存(初期にインスコされている)PHPを削除して、もう一度インスコしなおす。

そこで改めてMYSQL用モジュールがインスコされるので@はPHP側でDB操作プログラムを書き書き。で、実行⇒検証。

とりあえず今書いてる段階では無事作成したDBからデータとってこれてるみたいなのでとりあえずメモだけ。ちなみにMYSQLもver5。

っとMYSQLのDBに登録したデータを直で抜いたらちゃんと抜かれていたのでPHP-MYSQL連携はちゃんと成功している模様。
*************************************************************************

以下インスコ~PHP/MYSQL部分・プログラムでの検証作業のやり直し後、無事確立できたら追記にて作業内容まとめます。

以下追記
あーなんかゴメソ。上記一部言葉のニュアンスに誤りが。

誤:
>MYSQLインスコ後は一旦既存(初期にインスコされている)PHPを削除して、もう一度インスコしなおす

訂正:
デフォルト(フェドラ8インストール済状態)から①MYSQLをインストール②PHPのmysql拡張関連をインストール の手順でうまくいきますた。

とりあえず検証済んだので以下で手順晒し。

フェドラ8インスコ完了(フェドラ8のインストール手順は各自ぐぐる様に!)

/etc/rc.d/init.d/httpd start
⇒httpd(apache2.2.6)起動

chkconfig httpd
⇒鯖起動時にapacheを自動起動

httpd -v
⇒apacheのバージョン確認
php -v
⇒phpのバージョン確認(php5.2.4)

yum install mysql-server
⇒mysqlインストール

/etc/rc.d/init.d/mysqld start
⇒mysql起動

chkconfig mysql
⇒鯖起動時にmysqlを自動起動

set password for root@localhost=PASSWORD('password');
⇒mysqlのrootユーザーにパスワードを設定

use mysql;
⇒mysqlの設定DBに移動

delete from user where password='';
⇒passwordの設定されていないユーザーの全削除

mysql> create database testdb;
⇒テスト用DB"testdb"作成

mysql> use testdb;
⇒テスト用DB"testdb"へ移動

mysql> create table namedb(name char(30));
⇒カラム名nameを持つテーブル"name"を作成

mysql> describe namedb;
⇒namedbのデータ型を参照

+-------+----------+------+-----+---------+-------+
| Field  | Type    | Null  | Key | Default  | Extra |
+-------+----------+------+-----+---------+-------+
| name  | char(30) | YES  |     | NULL   |      |
+-------+----------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> insert into namedb values('jirou');
⇒カラムにデータ「jirou」を追加

mysql> select * from namedb;
⇒namedbにjirouが登録されたか確認

+-------+
| name  |
+-------+
| jirou  |
+-------+
1 row in set (0.00 sec)

⇒正常に追加されていた。



⇒⇒次からはいよいよphp-mysql連携がうまくできているかのチェック

php側からmysqlへアクセス、DBから値をとってくるテストコード

<html>
$connect = mysql_connect("localhost","root","passwrod");
⇒mysql接続時にfedoraで設定したホスト名mysqlにて設定したユーザー名、そしてそのユーザーのパスワードを渡す。

mysql_select_db("testdb");
⇒接続するDB名

$sql ="select * from namedb";
⇒実行させたいSQL文 *例だとnamedbテーブルに格納されているすべてのデータ

$rs = mysql_query($sql);
⇒SQL文を実行

while($item = mysql_fetch_array($rs)){
print "

  • ".$item['name']."";
    }
    ⇒SQLで取ってくるデータは配列・連想配列の形式(単体ではとってこられない)なのでwhile文でグルグル回して展開。たとえDB内のでーたが単一でもwhileで回さないと取ってこられない。

    mysql_close($connect);
    ⇒データを取り終わったら接続断。

    ?>
    </html>

    ⇒上記のコードを実行して無事ブラウザにjirouと表示されればちゃんとDBからデータを取ってこれている。
  • MYSQLでの基本となるコマンドのメモ。ちなみに環境はフェドラ8なんでよろしく。

    mysqlへログイン。

    mysql>create database data;
    >>create database データベース名;でデータベース名のDBを新たに作成。

    mysql>use data;
    >>use データベース名で入力したデータベースへ移動。

    mysql>show tables;
    >>現在のデータベース(以後DB)内に存在するテーブル一覧を表示。
    >>作成したばかりなのでempty set(0.00 sec)と表示される。

    mysql>create table testtable(id int,name text);
    >>create table テーブル名(カラム名1 データ型,カラム名2 データ型);
    >>↑でカラムが2種類あるテーブルを作成する。データ型はカラム・データ型で検
    >>索よろしく。

    mysql>describe testtable;
    >>describe テーブル名;で指定したテーブル内のデータ型を表示。
    >>実際に格納されているデータではなく、あくまでデータ型の表示。

    >>↓実行結果。idの項目(カラム)はint型、nameはtext型になっているのがわかる。
    +-------+---------+------+-----+---------+-------+
    |   Field|     Type|   Null|   Key|   Default|   Extra|
    +-------+---------+------+-----+---------+-------+
    |     id|    int(11)|  YES |    | NULL  |       |
    |  name |     text|   YES|      | NULL   |      |
    +-------+---------+------+-----+---------+-------+

    mysql>insert into testtable values(1,'test1');
    >>INSERT文。要はDBに対してデータを追加するためのコマンド。
    >>insert into テーブル名 values('データ1','データ2');

    >>↓実行結果
    --------------
    insert into testtable values(1,'test1')
    --------------

    Query OK, 1 row affected (0.00 sec)

    >>Query OKと表示されればSQL文は正常に完了。secはかかった時間。
    >>Errorの場合は
    ERROR 1054 (42S22): Unknown column 'test1' in 'field list'
    >↑の様に表示される。

    mysql>select * from testtable;
    >>select文。select * from テーブル名;で指定テーブル内のデータを表示。
    >>*は全部のデータ。where文等でid='2'とすればカラムid内で2のもののみ表示でき>>る。
    >>↓実行結果
    +------+-------+
    |   id |  name |
    +------+-------+
    |  1  |  test1  |
    +------+-------+
    1 row in set (0.01 sec)

    >>1 rowは1つの登録データが存在していることを示す。secは説明済みなので割
    >>愛。

    mysql>delete from testtable where name='test1';
    >>DELETE文。INSERT文が挿入ならDELETEは削除。
    >>delete from テーブル名;だと指定したテーブルの総てのデータを削除してしま
    >>う。
    >>WHERE文を使用。where句以降に条件を入力すれば条件に合致したもののみを対象>>とする。 name='test1'⇒nameカラムの''test1という名前の行のデータ。
    >>纏めると delete from testtable where name='test1';
    >>⇒testtableテーブル内で、nameカラムが「test1」であるデータを削除。

    >>delete文実行。
    Query OK, 1 row affected (0.39 sec)

    mysql>select * from testtable;
    >>で確認してみると…
    --------------
    select * from testtable
    --------------

    Empty set (0.00 sec)
    >>test1のデータが消滅。

    基本コマンドまとめ
    mysql>select * from テーブル名;:テーブル内のすべてのデータを表示。
    mysql>insert into テーブル名 values('データ','データ');:データを追加。
    mysql>delete from テーブル名 where name='データ'; :データを削除。
    mysql>create database DB名; :DB名のDBを作成。
    mysql>use DB名; :DB名のDBへ移動する。
    mysql>create table テーブル名(カラム名 データ型,カラム名 データ型); :テーブル作成。