PHPを学ぼう!

▼PHPを学ぶチャプターです。


安心サポートのGOG!

 

素材メニュー

 ◆Chapter 1

 ◆Chapter 2

 ◆Chapter 3

 ◆Chapter 4

 

制作ヒント

 ◆制作のヒント

 

レッスンメニュー

 ◆Chapter2 練習問題

 ◆Chapter3 DB練習問題

 

サイト運営者がPHPを学んだ
お勧めの書籍です!
これ一冊で基本的なPHPの仕組み、簡単なプログラムの作成、SQLiteを使ったデータベースなどかなり学べる要素が詰まっています!

↓↓↓ ↓↓↓

PHPレッスンブック―PHP5対応

新品価格
¥2,520から
(2013/2/24 04:38時点)

 

 

サイバーテロの技法について書かれた書籍です!
ハッカーの手法を知ることでご自身のサイトがハッカーに攻撃されたときそれを防ぐ手法を紹介しています。

↓↓↓ ↓↓↓

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/11/5 10:09時点)

 

 

★初年度100円! サブドメインやメールアカウントを無制限に設置できます。
PHPやCGIは勿論、WordPress、Movable Type Open Source、掲示板、ブログ、ショッピングサイトなどが簡単に導入できるので複数サイトを運営したい場合に便利なサービスです。

↓↓↓ ↓↓↓

 

PHPが動作するサーバー

 

はじめての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」を作成しました。
こちらも参考にしてください。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ex-mode.net | ツールEX | 素材EX | アフィモール | 初級者向 初めてのホームページ作り | Htmlタグ辞典 | 初めてのプランター菜園 | リンク・ボード
気のみ気のままなブログ | CSSガイドEX | ホビ★コレ | 班長日記!

▲UP

Copyright (C) ex-mode.net 2018. All Rights Reserved.