3回ゼミの資料

2016/04/20: MySQL入門のデータの更新を除く(7)まで。
2016/4/25: 2016_DB_1で入力画面を作り、新規登録できるか。まで。

入力に必要なのは、title、chosha_id、shuppansha、shuppannen

insert into shoseki (title, chosha_id, shuppansha, shuppannen) values ('$title', $chosha_id, '$shuppansha', '$shuppannen');

一覧表は

select * from shoseki;

最初に<table>タグ。
  print "<table>";
それから見出しを出力
  print "<tr><th>タイトル</th><th style="width:10px">著者ID</th><th>出版社</th><th>出版年</th></tr>\n";

whileの中で
  extract($record);
   print "<tr>";
   print "<td>$title</td><td>$chosha_id</td><td>$shuppansha</td><td><$shuppannen</td>";
   print "</tr>";
最後に
  print "</table>\n";

書籍一覧のところで、著者名を出したい。→リレーションを使う。→
select * from shoseki order by id;
while ($record = $result->fetch_assoc()) {
  extract($record);
   $sql2 = "select choshamei from chosha where id=$chosha_id;
   $result2 = $db->query($sql2);
   if ($record2 = $result2->fetch_assoc()) {
       $choshamei = $record2['choshamei'];
   } else {
       $choshamei = "";
   }
   テーブルの行表示
}
一覧表では、shosai.phpへのリンクを張る。
<td><a href=\"shosai.php?id=$id\">$title</td>....
詳細画面shosai.phpを作る。
レイアウトは入力画面と同じ。ただ、input要素の代わりに$titleなどの変数を表示する。
$id = $_GET['id'];
これで書籍のidが得られる。
次に
$sql = "select * from shoseki where id=$id";
$result = $db->query($sql);
if ($result) {
  $record = $result->fetch_assoc();
   extract($record);
   $sql2 = "select choshamei from chosha where id=$chosha_id";
   以下同様。
   後は、入力画面と似たレイアウトで、<input...>の代わりに、$titleなどを表示する。
}
5/11
詳細画面に、編集ボタンを作る。
henshu.phpに飛ぶ。(form要素のaction属性にhenshu.phpを指定する。)
form要素はsumitボタンと、書籍のidのみからなる。
データを密かに送るには、
<input type="hidden" name="id" value="<?php echo $id;?>" />
というタイプ属性がhiddenのinput要素をform要素の中に入れておく。hiddenとは「隠れた」という意味なので、これは画面には表示されないinput要素となる。

編集画面は、入力画面と同じレイアウトにするが、最初に
$id = $_POST['id']で書籍のidを受け取り、
$sql = "select * from shoseki where id=$id";
というSQLをデータベースに送信し、返ってきたデータを$resultに代入し、
if ($record = $result->fetch_assoc()) {
  extract($record);
で各項目のデータを各変数に代入する。
入力画面のinput要素には、value属性を追加し、value=\"$title\"など、各変数をvalue属性に指定しておく。
送信ボタンは、「更新」というvalueに変更しておく。
書籍idは、詳細画面の編集ボタンの時と同様、hidden属性のinput要素を指定しておく。
form要素のaction属性では、koshin.phpを指定する。

次に更新処理をするkoshin.phpを作る。
extract($_POST);
で各変数に値を受け取り、次に更新するためのSQL文を作る。
$sql = "update shoseki set title='$title', chosha_id=$chosha_id, shuppansha='$shuppansha', shuppanenn='$shuppannen' where id=$id"; // id=$id
とすることで、書籍テーブルの書籍idが$idのレコードのみを変更する。
$sqlを$dbに送信し、結果を受け取り、それがエラーだったら「更新できませんでした」、そうでなければ「一件更新しました」と表示する。
元の詳細画面に戻るリンクと一覧画面に戻るリンクを表示する。詳細画面に戻るリンクには、一覧のタイトルと同様、?id=$idをURLに追加する。
書籍と著者について入力、一覧、詳細、編集、更新処理をそれぞれ作る。

書籍の入力・編集において、著者idではなく、著者名を<select><option>要素で選択できるようにする。
新規入力バージョン
<select name="chosha_id">
  $sql = "select id as chosha_id, choshamei from chosha order by id";
   $result = $db->query($sql);
   while ($record = $result->fetch_assoc()) {
       extract($record);
       print "<option value=\"$chosha_id\">$choshamei</option>\n";
   }
</select>
編集バージョン
  $sql = "select id as chosha_id2, choshamei from chosha order by id";
   $result = $db->query($sql);
   while ($record = $result->fetch_assoc()) {
       extract($record);
       if ($chosha_id == $chosha_id2) {
           print "<option value=\"$chosha_id\" selected>$choshamei</option>\n";
       } else {
           print "<option value=\"$chosha_id\">$choshamei</option>\n";
       }
   }
受信する側は、$chosha_idで受け取る。書籍データのinsertとupdateは、$chosha_idをchosha_idフィールドにセットするので、変更なし。

・レコードの削除(著者と書籍)
詳細画面で削除ボタンを作る。
<form action="shoseki_sakujo_kakunin.php" method="POST">
<input type="hidden" name="id" value="<?php echo $id;?>">
<input type="submit" value="削除">
</form>

shoseki_sakujo_kakunin.phpでは、詳細画面をもう一度表示して、削除していいですか。と質問し、yesならばshoseki_sakujo.phpに進む。
shoseki_sakujo.phpでは
$id = $_POST['id'];
$sql = "delete from shoseki where id=$id";
うまくできたかどうかは、$resultがfalseかどうかでメッセージを出す。

・著者一覧
著者名だけではなく、書籍名も表示する。
$sql = "select title, shuppansha, shoseki.id as id, chosha_id, choshamei from shoseki, chosha where chosha.id=chosha_id order by chosha.yomi
一覧で、choshameiには、chosha_idから著者の詳細画面へのリンク、titleには、書籍idで書籍の詳細に飛ぶリンクを張る。

実は、書籍一覧で、書籍のidで並べるか、著者名で並べるかの違いに過ぎない。ただ、著者名にも著者の詳細に飛ぶリンクを貼る点が拡張になる。

・検索機能
メニューに検索窓をつける。(<form action="search.php"...)
input type="text" name="sw"...
search.phpは、実は上で作った一覧表示とほぼ同じ。違うのはSQLだけ。
$sw = $_POST['sw'];
検索の定石は、
$sw = "%" . $sw . "%"; // 検索語の前後に%を付けると、語中検索になる。スペースで区切られたもののAND検索は難しいので考えない。
$sql = "select ......... where (title like '$sw' or choshamei like '$sw') and chosha.id=chosha_id order by chosha.yomi";
として一覧表示する。
=だと完全一致でないと検索しないので、一部に含まれるものを検索するには、"like (似ている)"という演算子を使う。

  • 最終更新:2016-05-25 16:06:48

このWIKIを編集するにはパスワード入力が必要です

認証パスワード