もぐたんのブックれびゅーとかプログラム勉強とか

プログラムのど素人もぐたんが、読んだ本の感想を書いたり、勉強中のPHP/MySQLの内容を上から目線で解説するブログ

もぐ・データバンク(その1)
前回紹介したデータベースによって、登録・表示・検索・修正・削除の5つの基本機能を実現させました。あれはあれで一つの機能でしたが、もう少し改良の余地もあります。例えば、大量のデータから検索をかけてみたり、複数のキーワードで検索をかけたり(前回は、名前の検索しかできませんでした)、画像をアップロードしたりです。今回はそうした機能も取り入れた、名づけて「もぐデータバンク」を紹介したいと思います。

まず、テーブル設計です。今回は以下のようなフィールドを設定したいと思います。
(名称,フィールド名,データ型)
1.ID番号, id, int
2.登録日付, hiduke, date
3.タイトル(人物),tilte, char(128)
4.本文, honbun,text
5.タグ, tag,char(80)


上記の内、タイトル(人物)となっているのは、今回のテーブルに通常の日記(のような)記録が付けられるようにすることに加え、日本の歴史人物6,000名のデータをこのテーブルに載せるためです。本来ならちょっとありえない使い方ですが(^^
まずいつも通り、idを連番にします。テーブル名はmoguにします。

create table mogu values(id int, hiduke date, title char(128), honbun text, tag char(80));
alter table mogu add index ind1(id);
alter table mogu modify id int auto_increment;

次にトップページですが、今回はフレームを使います。
(index.html)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html lang="ja">
<head>
<title>もぐ・データバンク</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<frameset cols = "200,*">
<frame name = "menu" src = "m_menu.html">
<frame name = "main" src = "top.html">
<noframes>
<body>
<p>フレーム対応のブラウザを使ってください。</p>
</body>
</noframes>
</frameset>
</html>

フレームを使うことの利点は、メニュー部分とコンテンツ部分を別に分けるためサイトの管理がしやすくなることです。しかし、このフレームという手法は実際のサイトでは殆ど使われておりません。というのも、検索エンジンとの相性が悪く、SEO上非常に不利だからです。ただ今回は、私が勉強本として使っているマニュアルでフレームがモロに使われているため、MySQLの勉強のためと割り切ってフレームを使いたいと思います。
上記の意味ですが、"m_menu.html"がメニュー部分のページ、"top.php"が右側コンテンツ部分のページでして、お互いのページの内容をこのindex.html上に出力するという構造になっています。m_menuの中身や、各種機能のスクリプトは次回以降説明していきます。
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
性格診断サイト、(プルダウンメニューとラジオボタン)
今回は、フォームタグの部品であるプルダウンメニューとラジオボタンの紹介なのですが、単に構文を紹介するだけだとつまらないので、それらを使ったサイトを作りました。名づけて、「性格診断サイト」(と称するもの)で、かなり怪しげです(^^
で、まずはサンプルから。
(uranai_2.php)
<?php
extract($_POST);
$name = htmlspecialchars($name,ENT_QUOTES);
//マジック・クォート対策
if(get_magic_quotes_gpc()){
$name = stripslashes($name);
}

if($kaku<>'' and $name<>''){
echo $name."さんの結果:<br />";
if($fld == "kani" and $b_type == "b") {
echo "あなたは性格がよく、立派な方です";
}
elseif($fld <> "kani" and $b_type == "b"){
echo "あなたはわがままな性格です";
}
else {
echo "あなたは優しさと思いやりに欠けた人です";
}
$kaku = '';
echo "<br /><br />";
echo "<a href=¥"./uranai_2.php¥">占い画面に戻る</a>";
exit;
}
?>

<p>占い・性格判断のサイト</p>
<form action="uranai_2.php" method="POST">
<p>あなたのお名前:<input type="text" name="name" size=10></p>
<p>あなたの星座:<select name="fld">
<option value="kani">カニ座
<option value="yagi" selected>ヤギ座
<option value="oushi">牡牛座
<option value="igai">それ以外の星座
</select>
</p>
<p>
あなたの血液型:<br />
A型:<input type="radio" name="b_type" value="a" checked>  
B型:<input type="radio" name="b_type" value="b"> 
AB型:<input type="radio" name="b_type" value="ab"> 
O型:<input type="radio" name="b_type" value="o"> 
</p>
<input type="submit" name="kaku" value="実行">
</form>


スクリプトの構造はいたって簡単で、後半部がフォーム文で前半がPOSTメソッドで受けた情報を分岐出力します。最初から見ていきます。htmlspecialchars関数は以前出てきたxss対策で、第一引数の$nameは入力フォームから送られてきた名前入力枠のキーの値です。ところで、第二引数のENT_QUOTESって何でしょう?後から知ったのですがこれもxss対策の一部らしく、これによりシングルクォート(')も安全対象に含まれるらしいのです(詳しくは、ENT_QUOTESの説明ページをご覧下さい)。マジック・クォート対策も以前扱いましたね。

その下if条件の中身ですが、$kakuはフォーム・実行ボタンのキーの値、$nameは名前入力枠のキーの値です。なぜ$nameも入れたかというと、こうしないと名前欄を空欄にしても実行できてしまうためです。その下の条件分岐以下はあとで扱います。

さて入力フォーム以下のプルダウンメニューですが、こちらは<select>タグを使います。
<select name="fld">
<option value="kani">カニ座(</option>)
<option value="yagi" selected>ヤギ座
</select>

のような使い方をしまして、<option>タグの後の単語がプルダウンメニューの表示となります。</option>は省略可能で、付けることもできます。valueの中身がselectのキーの値になり、例えばカニ座を選択すると$fld=="kani"ということになります。selectedがついてるのは、デフォルトでの表示項目です。

その下の<input type="radio">部分がラジオボタンの部分です。name部分は合せる必要があるみたいですが、当然キーの値は選択箇所によって違います。checkedが付くと、デフォルトで選択されております。ここから先ほどの条件分岐に戻りますと、プルダウンとラジオボタンで選択した$fldと$b_typeを分岐の軸にしてます。

ということで以上をアップしたのが、プルダウンメニューとラジオボタンのテストサイト(性格診断サイト)になります。ちなみにですが、B型・カニ座の診断結果だけよいものになっているのは、私がそれだからです(^^
| permalink | comments(0) | trackbacks(0) | html | TOP↑ |
歴史人物のデータベースをMySQLで作る(その5)
今回でようやくこのシリーズも最終回です。最終回は、修正ページです。ところで以前にも書きましたが、削除スクリプトより修正スクリプトの方が難しいです。なぜかと言うと、削除の場合はレコードを特定させればその削除だけで済みますが、修正の場合はレコード内のフィールド値を特定させて、その値も渡さなければならないためです。その点も踏まえて、スクリプトを紹介します。
(h_shusei1.php)
<?php
extract($_POST);
extract($_GET);
mysql_connect('localhost', 'root', 'aaabbb');
mysql_select_db('lesson');

//MySQLレコード修正
if($nam<>''){
$sql = "update history set
touroku = '$tou',
simei = '$nam',
kuni = '$cont',
jidai = '$age',
memo = '$mem'
where renban = $ren";

mysql_query($sql);
echo "レコードの修正が完了しました";
exit;
}

//修正のためのフォーム
$sql = "select * from history where renban = $id";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
if($rows == 0){
echo "<p>該当データがありません。</p>";
}
else {
while($row = mysql_fetch_array($result)){
echo "<p>データを修正して下さい。</p>";
echo "<form action= ¥"h_shusei1.php¥" method= ¥"POST¥">";

echo "<p>連番:";
echo $row["renban"];
echo "</p>";

echo "<p>登録日:";
echo $row["touroku"];
echo "</p>";

echo "<p>氏名:<input type= ¥"text¥" name = ¥"nam¥" value =¥"";
echo $row["simei"];
echo "¥" size= ¥"40¥"></p>";

echo "<p>国:<input type= ¥"text¥" name = ¥"cont¥" value =¥"";
echo $row["kuni"];
echo "¥" size = ¥"15¥">";
echo "-";

echo "時代:<input type = ¥"text¥" name = ¥"age¥" value = ¥"";
echo $row["jidai"];
echo "¥" size = ¥"15¥"></p>";

echo "<p><textarea name = ¥"mem¥" rows = ¥"10¥" cols = ¥"50¥">";
echo $row["memo"];
echo "</textarea></p>";

echo "<input type= ¥"hidden¥" name = ¥"tou¥" value = ¥"";
echo $row["touroku"];
echo "¥">";

echo "<input type = ¥"hidden¥" name = ¥"ren¥" value = ¥"";
echo $row["renban"];
echo "¥">";

echo "<p><input type=¥"submit¥" value=¥"登録¥">";
echo "<input type=¥"reset¥" value=¥"リセット¥"></p>";
echo "</form>";

} //while文の終わり
} //else文の終わり
?>

//MySQLレコード修正以下のif文は以前も出てきた形ですよね。こちら同じページの下にあるフォーム文の$namが渡されて条件を満たすことになりますが、初回はスキップします。という訳で最初は、「//修正のためのフォーム」から始まる訳ですが、まず$idでレコードを特定させます。この$idは前回も出てきましたが、GETメソッドで(h_kensaku2.php)のページから渡されたデータです。この特定されたレコードを、
mysql_fetch_array関数で配列にし、各フィールド値を出力・表示させます。表示場所は、<input>タグの中身(value)ですから、初回はレコードの各データが入力枠に表示されていることになります。

これらの情報をPOSTメソッドで自身のページに伝達し、次は$namも満たしていることから//MySQLレコード修正のif文も実行されることになります。if文内は、レコード修正のクエリ文です。
update テーブル名 set フィールド名=レコード値 where 条件式 //レコードの修正

以前扱った上記の構文を、ここでも使ってます。実際クエリ文も、改行こそされてますが全てカンマ(,)で区切られてます。この修正クエリ文を実行させて完了です。

これで今回のシリーズは終了です。次回からは、また別のシリーズを始めたいです。
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
歴史人物のデータベースをMySQLで作る(その4)
今回は、削除ページの紹介です。まずは、スクリプトから。
(h_sakujo1.php)
<?php
extract($_POST);
extract($_GET);
mysql_connect('localhost', 'root', 'aaabbb');
mysql_select_db('lesson');

//MySQLレコード削除
if($kakunin=="確認"){
$sql = "delete from history where renban = $ren";
mysql_query($sql);
echo "レコードの削除が完了しました。";
echo "<br /><br />";
echo "<a href=¥"./h_zenken1.php¥">一覧表示ページに戻る</a>";
exit;
}
//削除確認のためのフォーム
$sql = "select * from history where renban = $id";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
if($rows == 0){
echo "<p>該当データがありません</p>";
}
else {
while($row = mysql_fetch_array($result)){
echo "<p>このレコードを削除します。</p>";
echo "<form action = ¥"h_sakujo1.php¥" method=¥"POST¥">";
echo "<p>連番:";
echo $row["renban"];
echo "</p>";

echo "<p>登録日:";
echo $row["touroku"];
echo "</p>";

echo "<p>氏名:";
echo $row["simei"];
echo "</p>";

echo "<p>国:";
echo $row["kuni"];
echo " - ";

echo "時代:";
echo $row["jidai"];
echo "</p>";

echo "<p>メモ:<br />";
echo $row["memo"];
echo "</p>";

echo "<input type=¥"hidden¥" name= ¥"ren¥" value=¥"";
echo $row["renban"];
echo "¥">";

echo "<input type=¥"submit¥" name=¥"kakunin¥" value=¥"確認¥">";
echo "<input type=¥"reset¥" value=¥"リセット¥">";
echo "</form>";
} //while文の終わり
} //else文の終わり
?>

まず初っ端ですが、$_POSTはいいとして、extract($_POST)があるのは何故でしょう?これは前回紹介した通り$idがGETメソッドで送信されてくるためです。
その次のif($kakunin=="確認")部分ですが、初めてみる形ですね。これは$kakunin="確認"のときにif文内つまり「レコード削除」が実行される訳ですが、当然初回は変数$kakuninがカラなので実行されません。この変数は、スクリプト最後の方のsubmitタグのキーであるname="kakunin"が実行された時に満たされるので、初回はスルーしたif文が
フォームによって情報が伝達された後に実行されるという構成です。

ということでif文内は後回しにして、//削除確認のためのフォームから先にみますと、まずレコードを取り出す条件としてrenban = $idを設定しているクエリ文が出てきます。この$idがこの前のページから送信された$_GETの中身ということになります。このクエリ文の実行結果(=取り出したレコード)を配列にして表示させてるのは今まで通りですが、
下記が新たに見る箇所です。

echo "<input type=¥"hidden¥" name= ¥"ren¥" value=¥"";
echo $row["renban"];
echo "¥">";

今までinput typeというと、入力枠か確認・リセットボタンしかありませんでしたが、これは入力フォームが隠れた形になってます(hiddenという名前の通り)。表示はされませんが、きちんと存在はしていて、nameとvalueはキチンと存在していて、$ren = $row["renban"]として情報が出力されてます。ここで(連番で)特定されたレコードが、
削除対象となるレコードな訳で、この$renが//レコード削除の箇所で受け取られ削除手続きに進む、という格好です。

一つ一つを見ていくと難しい手続きではないのですが、これを使いこなせるようになるには多少時間がかかりそうですね(少なくとも私には^^)。とはいえ、これで削除スクリプトが完成です。次回はより難しい修正ページのスクリプトを紹介したいと思います。
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
歴史人物のデータベースをMySQLで作る(その3)
前回の続きです。修正と削除についてですが、単純にこの機能だけを考えればいい訳ではないのです。というのも、実際に我々がデータを修正したり削除する場合を思い出してほしいのですが、その前にデータを特定させてます。つまり、修正と削除は、その機能の前提として検索が必要になります。ということで、前回作った検索ページを改良して修正・削除ページにつなげるようにしたいと思います。
まず、前回の検索スクリプトの最後の部分は以下のようになってました。
echo nl2br($row["memo"]);
echo "</p>";

こちらを以下のように書き換えます。
echo $row["memo"];
echo "</p>";
echo "<a href=¥"h_shusei1.php?id=";
echo $row["renban"];
echo "¥">[このレコードを修正する]</a> "
echo "<a href=¥"h_sakujo1.php?id=";
echo $row["renban"];
echo "¥">[このレコードを削除する]</a><hr>";


このように書き換えた上、form actionの送信先をh_kenskau2.phpとし、このファイル名もh_kensaku2.phpとします。
次に、この追記された文章の意味について説明します。まず、

のすぐ下の文章ですが、
<a href="h_shusei1.php?id=11">[このレコードを修正する]</a>

のような一文があったと仮定してみて下さい。ご存知の通り、こちらはテキストリンクを表す記述です。このタグがecho""内で出力されるため、URL部分がエスケープされている点は大丈夫だと思います。問題はURL内の?id=11の部分です。こちら$_GETでも扱いましたが、GETメソッドによるデータの送信方式です。おさらいすると、「?変数名=変数の値」です。上では変数の値を11と置いてましたが、実際は$row["renban"]ですので、$id=$row["renban"]として、データが送られたことになります。そして、このrenbanはレコード一つ一つに割り振られているため、これによりレコードの特定もできるようになりました。

今まで、POSTメソッドなりGETメソッドのデータ送信方法は、フォームタグによるものだけでした。しかし、GETについてはこうした使い方も可能のようです(実はこの点が、今回のシリーズで私にとって一番の難所でした)。なお、上記で説明した変数idについては、修正ページ(h_shusei1.php)と削除ページ(h_sakujo1.php)でGETメソッドによるデータの受信先として再度取り扱いますので、よく覚えておいて下さい。

次に修正ページと削除ページのスクリプトを考えたいのですが、削除ページの方が簡単ですので、次回は削除ページのスクリプトについて説明します。
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
歴史人物のデータベースをMySQLで作る(その2)
続いて、全件表示画面のスクリプトです。
(h_zenken1.php)
<?php
mysql_connect('localhost', 'root', 'aaabbb');
mysql_select_db('lesson');
$sql= "select * from history";
$result= mysql_query($sql);
$rows = mysql_num_rows($result);
if($rows == 0){
echo "<p>該当データはありません。</p>";
}
else {
while($row = mysql_fetch_array($result)){
echo "<p>";
echo $row["renban"];
echo " ";
echo $row["touroku"];
echo "<br />";
echo $row["simei"];
echo "  ";
echo $row["kuni"];
echo "-";
echo $row["jidai"];
echo "<br />";
echo nl2br($row["memo"]);
echo "</p>";
} //while文終わり
} //else文終わり
?>

特に説明の必要はないと思いますが、nl2brについてはnl2brによる改行処理をご覧下さい。

では次にデータ検索画面について考えたいと思います。改めて言うまでもないですが、検索とは検索語句からデータ(つまりレコード)を探し出す行為です。そこでMySQLのクエリ文を振り返ってみると、以下のような使い方をしてました。

select * from テーブル名 where フィールド like '%検索語句%';

これを使う訳ですが、どう処理するかと言えば、
1.入力フォームに検索語句を入れる
2.上記のクエリ文をdbに伝える
3.引っ張ってきたデータ(レコード)を表示

大まかな流れはこんな感じです。ではスクリプト
(h_kensaku1.php)
<?php
extract($_POST);
echo "
<p>検索する氏名の一部を入力する</p>
<form action=¥"h_kensaku1.php¥" method=¥"POST¥">
<p><input type= ¥"text¥" name=¥"nam¥" value=¥"$nam¥" size=¥"40¥"></p>
<p><input type=¥"submit¥" value=¥"送信¥"> <input type=¥"reset¥" value=¥"reset¥">
</p>
</form>
";

if($nam<>''){
mysql_connect('localhost', 'root', 'aaabbb');
mysql_select_db('lesson');

$sql= "select * from history where simei like '%$nam%'";
$result= mysql_query($sql);
$rows = mysql_num_rows($result);
if($rows == 0){
echo "<p>該当データはありません。</p>";
}
else {
while($row = mysql_fetch_array($result)){
echo "<p>";
echo $row["renban"];
echo " ";
echo $row["touroku"];
echo "<br />";
echo $row["simei"];
echo "  ";
echo $row["kuni"];
echo "-";
echo $row["jidai"];
echo "<br />";
echo nl2br($row["memo"]);
echo "</p>";
} //while文終わり
} //else文終わり
} //if文終わり
?>

注意すべき点は二点です。まず、入力フォームをechoで囲っている点ですが、入力フォームそのものはhtmlであるためPHPスクリプト内では、そのままだと出力されません。また、ダブルクォートが重なっているときはエスケープ処理が必要になります。

注意すべきもう一点は、以下の文です。
<p><input type= ¥"text¥" name=¥"nam¥" value=¥"$nam¥" size=¥"40¥"></p>

今回はvalueに値が入ってます。実はvalue="文字列"のように設定すると、初期段階で入力フォームに「文字列」が表示されます。今回は$namが入ってる訳ですから、初回こそは空欄ですが、送信ボタンを押して自身のページにデータを送ると、namのキーの値つまり$namが入力フォーム内で表示されてる訳です。逆に、もし検索後の表示画面で入力欄をカラにしておきたければ、valueの箇所を削除すればいいです。

次回は、修正・削除の機能について考えたいと思います。
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
歴史人物のデータベースをMySQLで作る(その1)
今回から新シリーズです。今までやってきたのは、データの登録とその表示だけでした。今回からは1歩前進させて、データの登録・表示・検索・修正・削除を行いたいと思います。一気にできることも増え、私も若干消化不良気味ですが^^;)、一歩ずつ丁寧に理解して紹介していきたいと思います。

先ほども書きましたように、今回は歴史上の人物を登録するためのdbを作りたいと思います。そこでCMDを使って、以下のようなテーブル・フィールドを設置します。

1.連番(renban, int)
2.日付(touroku, date)
3.人物名(simei, char(30))
4.国(kuni, char(15))
5.時代(jidai, char(15))
6.メモ(memo, text)


カッコ内はフィールド名とデータ型です。今回新しく出たdateとtextですが、dateは日付(2006-8-15みたいな)を表示するためのデータ型、textはcharと同じ文字型ですが65,535文字まで入力ができます。

create table history (renban int, touroku date, simei char(30), kuni char(15), jidai char(15),memo text);

上記でまず「history」というテーブルを作成し、フィールドを定義します。次に以前紹介したように、renbanを自動連番にします

alter table history add index ind1(renban);
alter table history modify renban int auto_increment;

ここからの流れですが、
・入力フォームでデータをPOSTメソッドで送信するページ(h_touroku1.html)
・送信されたデータを受け取り、dbに書き込むページ(h_touroku2.php)
・dbからデータを取り出し、表示するページ(h_zenken1.php)

という順で作成します。この3つは前回も扱ってますので、細かい説明は割愛します。

(h_touroku1.html)
<p>データを入力して下さい。</p>
<form action="h_touroku2.php" method="POST">
<p>氏名:<input type="text" name="nam" size="40"></p>
<p>国:<input type="text" name="cont" size="20">―時代:
<input type="text" name="age" size="20"></p>
<p>メモ:<br />
<textarea name="mem" rows="10" cols="50"></textarea></p>
<p><input type="submit" value="記録"> <input type="reset" value="リセット"></p>
</form>

(h_touroku2.php)
<?php
extract($_POST);
mysql_connect('localhost', 'root', 'aaabbb');
mysql_select_db('lesson');
$kyou = date("y-m-d");
$sql = "insert into history values(0, '$kyou', '$nam', '$cont', '$age', '$mem')";
mysql_query($sql);
?>

データを表示するページ(h_zenken1.php)は次回取り扱います。
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
入力フォームからMySQLにデータを保存する(1ファイル版)
前回は2ファイルに分けてデータの送受信を実現させましたが、別ファイルにすることで後々にメンテナンスが面倒になることも考えられます(そうです)。そこで今回は、一つのファイルにしてみたいと思います。まずサンプルです。
(ken4.php)
<?php
extract($_POST);

if($ken<>''){ //$kenにデータがある場合
mysql_connect ('localhost', 'root', 'aaabbb');
mysql_select_db ('lesson');
$sql = "insert into todofuken values ('$ken', '$kec', $jin, $men, 0)";
mysql_query($sql);

$ken ='';
echo "データを登録しました。<br />";
echo "登録を続けますか  <a href=¥"ken4.php¥">続行</a>";
exit;
}  //if文ここまで
?>

<p>データを入力して下さい。</p>
<form action="ken4.php" method="POST">
<p>県名:<input type="text" name="ken" size="40"></p>
<p>県庁所在地:<input type="text" name="kec" size="40"></p>
<p>人口:<input type="text" name="jin" size="40"></p>
<p>面積:<input type="text" name="men" size="40"></p>
<input type="submit" value="送信">
<input type="reset" value="リセット">
</form>

まずスクリプトの構成から見ますと、前半がif文で後半がフォーム文になってます。ifの条件式($ken<>'')ですが、まず「<>」は「等しくない」という意味です。その後の''はカラですから、「カラと等しくない場合」→「何か代入された数字がある場合」という意味です。つまり$kenに何か代入されていればif文は実行されますが、初回は当然何も代入されてませんので、初回は必ずスルーします。

後半部にフォーム分がありますが、実際はここからスタートになります。ここでデータを入力しますと、データの送信先が自身ですから(aciton="ken4.php")、スクリプトの先頭に戻って、ここで$_POSTがデータを受け取ることになります。extract関数は前回説明した通りです。

if以下で、dbに接続→クエリ文の変数化→クエリ実行という流れは前回と同様です。その後、$kenをカラにしています。これは、このまま再度同じページに来たときに$kenの数字が残っていると、if以下が実行されてしまうためです。
その後、続行で同じページへのリンクを付けてますが、リンク内URLがダブルクォートで囲まれているため、エスケープ処理をしています。

その下にexitという命令文がありますが、「ここでスクリプト終了ですよ」という意味らしくて、実際その下の入力フォームは表示されません。ただし、「続行」のリンクをクリックすると、$kenの値がカラになっているので、if文は実行されず再度入力フォームが現れる、という仕組みです。

こちらをken1.phpで確認すると、確かに入力内容が反映されてます。という訳で、今回はここまでです。次回は、よりデータベースを使った住所録について紹介します。
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
入力フォームからMySQLにデータを保存する(2ファイル版)
前回はテーブルの中身をブラウザで表示させましたが、今回は入力フォームを使ってブラウザ上からデータを入力・保存し、それをブラウザ上で表示させます。今回は、入力フォームが2ファイルになるバージョンを紹介します。

(ken2.html)
<p>データを入力してください。</p>
<form action="ken3.php" method="POST">
<p>県名<input type="text" name="ken" size="40"></p>
<p>県庁所在地<input type="text" name="kec" size="40"></p>
<p>人口<input type="text" name="jin" size="40"></p>
<p>面積<input type="text" name="men" size="40"></p>
<input type="submit" value="登録">
<input type="reset" value="リセット">
</form>

(ken3.php)
<?php
extract($_POST);
mysql_connect ('localhost', 'root', 'aaabbb');
mysql_select_db ('lesson');

$sql = "insert into todofuken values ('$ken', '$kec', $jin, $men, 0)";
mysql_query($sql);
?>

(ken2.html)は入力フォームの「データを送る側」ですが、特に問題ないと思います。新しく、input typeでresetが出てきましたが、入力内容を消去するボタンです。問題は、ken3.phpの方です。まず新しく出てきたのが、extract関数です。こちらは引数にある配列の各キーを変数にするという関数です。例えば今回の場合ですと、$ken = $_POST['ken']となり、他のキーについても同様です。

その後の処理の流れですが、データベースに接続した後、クエリ文を変数$sqlに代入し、これをmysql_queryとしてdbにクエリを伝える、という流れです。なお、$jinと$menにクォートがないのは、どちらもデータ型がintだからです。実際ここで入力したデータを、前回のファイル(ken1.phpとします)で確認すると、確かに新規の内容を確認できます。

次回は、今回のスクリプトを1ファイルにしたバージョンを紹介します。

(参考):
extract関数のより詳しいページ
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
MySQLのテーブルをブラウザで表示する
今まではCMDで表示させていたテーブルですが、今度はそれをブラウザ上で表示させたいと思います。ブラウザで表示するので当然htmlを使う訳ですが、それだけでなくクエリ文をブラウザに伝えるためにPHPも使うことになります。ここに来て、ようやくPHPの知識が活かせることになります。まずはサンプル。

<?php
mysql_connect('localhost', 'root', 'aaabbb');
mysql_select_db('lesson');

$sql= "select * from todofuken";
$result= mysql_query($sql);
$rows = mysql_num_rows($result);
 if($rows == 0){
  echo "<p>該当データはありません。</p>";
 }
 else {
  while($row = mysql_fetch_array($result)){
   echo "<p>";
   echo $row["kenmei"];
   echo " ";
   echo $row["kencho"];
   echo " ";
   echo $row["jinko"];
   echo " ";
   echo $row["menseki"];
   echo "</p>";
  } //while文終わり
 } //else文終わり
?>

一つ一つ解説していきます。まず最初にいきなりmysqlが先頭にくる関数が来ています。ここでCMDの時の初期操作を思い出してほしいのですが、mysql -u root -pと入力して後パスワードを入力し、use lesson; で扱うデータベースを選択しました。これと同じ命令を、PHP上で行っている訳です。
mysql_connect(ホスト名、ユーザー名、パスワード);
mysql_select_db(データベース名); //mysqlに接続し、dbを選択する(20)


これが接続の際の定型フォームらしいので、このまま覚えたいと思います。

$sql= "select * from todofuken";
$result= mysql_query($sql);
$rows = mysql_num_rows($result);

次にこちらですが、一番上はよいと思います。クエリ文を変数$sqlに代入しただけですから。その下
mysql_query("クエリ文字列");  //クエリ文字列をクエリとして処理
mysql_num_rows($結果);  //クエリ処理結果を引数で渡すと、含まれる行数を戻り値で返す
これでテーブル内の一連のデータが$rowsに格納されたことになります。なおこれもよく使うスクリプトなので、このまま覚えた方がよいそうです。

最後はif以下です。($rows == 0)の場合(データがない場合)はこれでよいとして、問題はelseつまりそうでない場合です。whileの条件式
$row = mysql_fetch_array($result)
ですが、$resultを引数として配列$rowを取得し、そのキーをwhile以下で指定します。このif以下も頻繁に使う「決まり文句」らしいので、このまま覚えたいです。

以上でブラウザ上で出力すると、県名・県庁・人口・面積が順に表示されます。

(参考):(21)select系の処理
$sql ="MySQLクエリ文字列";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);

if($rows == 0){
  die;
  //または結果がなかったときの処理
}
else {
 while($row = mysql_fetch_array($result)){
  $変数1= $row["フィールド1"];
  $変数2= $row["フィールド2"];
   ・・・・・・
 }  //while文終わり
}  //else文終わり
| permalink | comments(0) | trackbacks(0) | MySQL | TOP↑ |
1 / 25 >>