はじめてのHP
| 無料素材
| タグ辞典
| CSSガイドEX
| PHPを学ぼう!
◆Answer! - DB練習問題2の答え
【解答】
001|<html lang="ja">
002|<head>
003|<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
004|<title>DB練習問題2のサンプルプログラムです。</title>
005|<?php
006| //actionのページ指定
007| $self_page = "./indexDB.php";
008|
009| //GET & POSTの処理
010| $mode = isset($_REQUEST['mode']);
011| $task = isset($_REQUEST['task']);
012| $id = isset($_REQUEST['id']);
013|
014| //POSTとGETを変数名に置換する処理
015| foreach($_REQUEST as $hensu => $value){
016|   $$hensu = $value;
017| }
018| //print_r($_REQUEST);
019|
020| //変数の初期化
021| $name = isset($name) ? $name : "";
022| $home = isset($home) ? $home : "";
023| $year = isset($year) ? $year : "";
024| $mess = "";
025|
026| //データベースに接続する
027| try{
028|   $db = new PDO("sqlite:akb.db");
029|   //PDO(PHP Data Object)PDO
030|   $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
031| }catch(PDOException $e){
032|   echo "データベースにアクセスできません".$e->getMessage();
033|   exit;
034| }
035|
036| //DBの新規登録処理
037| if($mode == "new" && $task == "on"){
038|   $mess = "*新規登録を受けつけました。";
039|   $name = $db->quote($name);
040|   $home = $db->quote($home);
041|   $year = intval($year);
042|   $data = "INSERT INTO members(name,home,year) VALUES($name,$home,$year)";
043|   $db->query($data);
044|   //or die(sql_error);
045| }
046|
047| //DBの修正処理
048| if($mode == "rev" && $task == "on"){
049|   if($id <= 10){
050|     $mess = "*ID:1~10は保護されていますので修正できません。";
051|   }else{
052|     $mess = "*修正しました。";
053|     $name = $db->quote($name);
054|     $home = $db->quote($home);
055|     $year = intval($year);
056|     $update = "name=$name, home=$home, year=$year";
057|     $data = "UPDATE members SET $update WHERE id=$id";
058|     $db->query($data);
059|   }
060| }
061| if($mode == "rev" && $task == "chk"){
062|   $data = $db->prepare("SELECT * FROM members WHERE id=$id");
063|   $data->execute();
064|   
065|   /* 結果セットに残っている全ての行をフェッチする */
066|   $result = $data->fetchAll();
067|   //print_r($result);
068|   if($result){
069|     $mess = "*このデータを修正しますか?";
070|     $name = htmlspecialchars($result[0]['name']);
071|     $home = htmlspecialchars($result[0]['home']);
072|     $year = $result[0]['year'];
073|   }else{
074|     $mess = "*IDが存在しません。";
075|   }
076| }
077|
078| //DBの削除処理
079| if($mode == "del" && $task == "on"){
080|   if($id <= 10){
081|     $mess = "*ID:".$id."は保護されていますので削除できません。";
082|   }else{
083|     $mess = "*削除しました。";
084|     $data = "DELETE FROM members WHERE id=$id";
085|     $db->query($data);
086|  
087| }
088| if($mode == "del" && $task == "chk"){
089|   $data = $db->prepare("SELECT * FROM members WHERE id=$id");
090|   $data->execute();
091|
092|   /* 結果セットに残っている全ての行をフェッチする */
093|   $result = $data->fetchAll();
094|   //print_r($result);v
095|   if($result){
096|     $mess = "*このデータを削除しますか?2";
097|     $name = htmlspecialchars($result[0]['name']);
098|     $home = htmlspecialchars($result[0]['home']);
099|     $year = $result[0]['year'];
100|   }else{
101|     $mess = "*IDが存在しません。";
102|   }
103| }
104|
105| echo "<h3>
106|<a href=\"{$self_page}?mode=new\">新規登録</a> |
107|<a href=\"{$self_page}?mode=rev\">修正</a> |
108|<a href=\"{$self_page}?mode=del\">削除</a>
109|</h3>";
110|
111| //入力画面の分岐
112| if($mode == "rev"){
113|   if($task == "chk" && $result){
114|     $mess = $mess=="" ? $mess : "*このデータを修正しますか?";
115|     echo $mess.'
116|<table boder=1>
117|<form action="'.$self_page.'" method="POST" name="del_task">
118|<tr>
119|<td>[ID]</td>
120|<td>お名前</td>
121|<td>出身地</td>
122|<td>生 年</td></tr>
123|<tr>
124|<td width="12" bgcolor="#eeeeee" align="center">'.$id.'</td>
125|<td><input type="text" name="name" value="'.$name.'"></td>
126|<td><input type="text" name="home" value="'.$home.'"></td>
127|<td><input type="year" name="year" value="'.$year.'"></td>
128|</tr>
129|<tr><td colspan="3">
130|<input type="hidden" name="id" value="'.$id.'" maxlenth="10">
131|<input type="hidden" name="mode" value="rev" maxlenth="10">
132|<input type="hidden" name="task" value="on" maxlenth="4">
133|<input type="submit" name="new_label" value="修正する">
134|</form>
135|</table>
136|';
137|   }else{
138|     $mess = $mess!="" ? $mess : "*IDを入力してください。";
139|     echo $mess.'<br >
140|<form action="'.$self_page.'" method="POST" name="rev">
141|<input type="text" name="id">
142|<input type="hidden" name="mode" value="rev">
143|<input type="hidden" name="task" value="chk">
144|<input type="submit" name="del_label" value="ID検索">
145|</form>
146|';
147|   }
148| //削除処理
149| }elseif($mode == "del"){
150|   if($task == "chk" && $result){
151|     $mess = $mess=="" ? $mess : "*このデータを削除しますか?";
152|     echo $mess.'
153|<table boder=1>
154|<form action="'.$self_page.'" method="POST" name="del_task">
155|<tr><td>[ID]</td><td>お名前</td><td>出身地</td><td>生 年</td></tr>
156|<tr>
157|<td width="12" bgcolor="#eeeeee" align="center">'.$id.'</td>
158|<td><input type="text" name="name" value="'.$name.'"></td>
159|<td><input type="text" name="home" value="'.$home.'"></td>
160|<td><input type="year" name="year" value="'.$year.'"></td>
161|</tr>
162|<tr><td colspan="3">
163|<input type="hidden" name="id" value="'.$id.'">
164|<input type="hidden" name="mode" value="del">
165|<input type="hidden" name="task" value="on">
166|<input type="submit" name="new_label" value="削除する">
167|</form>
168|</table>
169|';
170|   }else{
171|     $mess = $mess!="" ? $mess : "*IDを入力してください。";
172|     echo $mess.'<br >
173|lt;form action="'.$self_page.'" method="POST" name="del">
174|<input type="text" name="id">
175|<input type="hidden" name="mode" value="del">
176|<input type="hidden" name="task" value="chk">
177|<input type="submit" name="del_label" value="ID検索">
178|</form>
179|';
180|   }
181| }else{
182|   //新規登録処理v
183|   echo $mess.'
184|<table>
185|<form action="'.$self_page.'" method="POST" name="new_task">
186|<tr><td>お名前</td><td>出身地</td><td>生 年</td></tr>
187|<tr>
188|<td><input type="text" name="name" maxlenth="10"></td>
189|<td><input type="text" name="home" maxlenth="10"></td>
190|<td><input type="year" name="year" maxlenth="4"></td>
191|</tr>v
192|<tr><td colspan="3">
193|<input type="hidden" name="mode" value="new">
194|<input type="hidden" name="task" value="on">
195|<input type="submit" name="new_label" value="新規登録">
196|<input type="reset" name="new" value="リセット"></td></tr>
197|</form>
198|</table>
199|';
200| }
201|
202| //データの表示
203| echo "<p> </p>";
204| echo "【登録内容】<br />";
205| $stmt = $db->query("SELECT * FROM members");
206| $align = "align=center";
207| $bgcolor = "bgcolor=#eeeeee";
208| echo "
209|<table border='1'>
210|<tr>
211|<th width=60 {$bgcolor}>ID</th>
212|<th width=140 {$bgcolor}>名 前</th>
213|<th width=120 {$bgcolor}>出 身</th>
214|<th width=120 {$bgcolor}>生 年</th>
215|</tr>
216|";
217| while($row = $stmt->fetch()){
218|   $id = $row[id""];"
219|   $name = htmlspecialchars($row["name"]);
220|   $home = htmlspecialchars($row["home"]);
221|   $year = $row["year"];
222|   echo
223|"<tr><td {$align}>{$id}</td>
224|<td {$align}>{$name}</td>
225|<td $align>{$home}</td>
226|<td $align>{$year}</td>
227|</tr>;"
228| }
229| echo "</table>";
230|
231| // DBから切断する ( $db = null; も可能)
232| unset( $db );
233|?>
234|</body>
235|</html>
プログラムのサンプルが確認できます。
SQliteは私自身がまだ勉強不足(2014/4時点)なこともあり、間違った記述があるかもしれません。
一応、動作しているので良しとしていますのでご了承ください。
ではこのコードの解説をしていきます。
7行目で任意のファイル名を設定します。
このプログラムでは新規登録、検索、編集、削除は同じページ内で処理しますのでここで設定しておくと便利です。
10~12行では、$mode、$task、$idの "GET" と "POST" の値を変数に代入しています。
15~17行では、"GET" と "POST" のインデックスを変数名で作り値を格納する一括処理です。
$mode、$task、$id が重複する作業ではないかと思うかもしれませんが、10~12行では空データの変数を設定しています。
21~24行では、データベースで取り扱う値を格納する変数とメッセージの変数を初期化及び定義しています。
27~34は、データベースに接続する処理です。
28行目で "akb.db" の情報が "$db" に引き渡されます。
31行目は、インスタンスの変数に null を入れたり、unset(変数)を実行するだけで切断します。
簡単にいえば、SQlite を使う為の呪文と考えるといいでしょう。
37~104行は、データベースに新規、検索、編集、削除をするための処理です。
42行の
"INSERT INTO members(name,home,year) VALUES($name,$home,$year)"
はデータベースに新規登録する際の SQL 文になります。
id は、自動で割り振れますので記述する必要はありません。
57行の
"UPDATE members SET $update WHERE id=$id"
はデータベースの内容を修正するSQL文になります。
ここでは、"$update"に"name=$name, home=$home, year=$year"、つまりカラムと変更した値が入ることになります。
WHERE は、データベースのどのカラムのどんな条件なのかを指定します。
この記述では、id が一致するデータを修正することになります。
62、89行の
$data = $db->prepare("SELECT * FROM members WHERE id=$id");
は、WHERE の条件に合った内容を $data に格納します。
84行の
$data = "DELETE FROM members WHERE id=$id";
は、WHERE の条件に合ったデータを削除します。
新規登録、及び修正する値には、
$name = $db->quote($name);
$home = $db->quote($home);
39、40行のようにクォート処理(quote)をすることを忘れずにしましょう。
修正と削除では ID 検索後に確認用に値を表示するようにしています。
70、71行と97、98行では表示される値にサニタイズ化しています。
(*htmlやプログラムを埋め込まれないよう)
$messは、各処理対応したメッセージを表示するようにしています。
それぞれの動きは、フォームを実行したときにどんなメッセージを読み込むか確認してください。
105~109行は、新規、修正、削除のメニューを表記し、mode のパラメータをそれぞれに付加しています。
この値は、GETで習得ができます。
112~200行は、フォームの分岐と表示内容です。
203~229行は、データベースの内容を評する処理です。
232行では、データベースの切断を処理します。
このプログラムでは最低限の入力制限しか設けていません。
新規登録で生年を未入力にすると、"0" が自動的に入力されます。
入力時の制限機能についてはご自身で追加してみてください。
データベースのファイルをアップロードする際には、バイナリーモードでアップロードをします。
アスキーモードでは、動作に不具合が発生する場合があります。
データーベースへのアクセス、書き込みを許可しなければデータベースの更新はできないので関連するフォルダやファイルの属性は "777" に変更しましょう。
必要に応じてアクセス制限などを設けることにより、第三者からのアクセスを制限することもできます。
【追記 : 2014/5/8】
これをベースに少し改変したデーターベース、「Nondemo DB」を作成しました。
こちらも参考にしてください。
|