forever 朝 活 php 講 座 データベースの 巻 株 式 会 社 フォーエバー
目 次 データベースを 使 う... 2 mysqliを 使 用 する... 2 郵 便 番 号 データベースを 作 る... 4 市 ごとに ドロップダウンリストにしてみる... 8 Foundation を 使 ったサンプルソース... 11 1
データベースを 使 う 今 日 は php でデータベースをさわりましょう mysqliを 使 用 する 教 科 書 で mysqlと 繋 ぐ 方 法 でmysql 関 数 を 使 いました 授 業 中 にも 言 ったように mysqlはすでにサポートを 終 了 しています そこでmysqli を 使 ったやり 方 をまず 勉 強 しようと 思 います mysqliは 現 在 サポートが 続 けられているので バージョンアップがあります dbconnect.phpのmysql 版 とmysqli 版 の 違 いを 見 ていましょう mysql 版 mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('yubin') or die(mysql_error()); mysql_query('set NAMES UTF8'); mysqli 版 $mysqli = new mysqli("localhost","root","","yubin"); if($mysqli->connect_errno) die($mysqli->connect_error); $mysqli->query('set NAMES UTF8') or die($mysqli->connect_error); mysqli は 実 は 2 種 類 方 法 があって 手 続 き 型 とオブジェクト 指 向 型 があり 今 回 の 紹 介 は java でもやったオブジェクト 型 です 最 初 にコンストラクタで$mysqli のオブジェクトを 作 っておき そのオブジェクトのメソッドを 呼 び 出 す 形 で 処 理 を 行 います 実 際 にコーディングする 場 合 は require で dbconnect した 時 の オブジェクト 変 数 をそのまま 利 用 して query を 実 行 します query を 実 行 するとレザルトセットが 返 ってきます ここでは$record ですが これを 作 ったら 最 後 にかならず close()する 必 要 があります また$mysqli に 関 しても 最 後 に close()の 必 要 があり ます 2
require('dbconnect.php'); if (!empty($_post)) { // 初 回 はチェックしない //ログイン 処 理 if ($_POST['name']!= '' && $_POST['pass']!= '') { $sql = sprintf('select LNO,LUNO FROM 抽 選 ユーザーテーブル WHERE lid="%s" AND lpass="%s"', mysql_real_escape_string($_post['name']), mysql_real_escape_string($_post['pass'])); $record = $mysqli->query($sql) or die($mysqli->error); if ($table = $record->fetch_assoc()) { //ログイン 成 功 $_SESSION['lno'] = $table['lno']; $_SESSION['luno'] = $table['luno']; $_SESSION['user'] = $_POST['name']; $luno = $table['luno']; $record->close(); } else { $mysqli->close(); header('location: login.php'); exit(); } } } $mysqli->close(); では 実 験 も 兼 ねて データベースの 復 習 のために 鹿 児 島 県 の 郵 便 番 号 一 覧 を 取 得 してみまし ょう 3
郵 便 番 号 データベースを 作 る 郵 便 番 号 検 索 で 検 索 すると 日 本 郵 便 の 郵 便 番 号 のページが 出 てきます そのページの 日 本 地 図 の 下 にある 郵 便 番 号 データのダウンロード のリンクをクリックして 読 み 仮 名 データの 促 音 拗 音 を 小 書 きで 表 記 するもの のリンクをクリックします 都 道 府 県 一 覧 の 中 から 鹿 児 島 県 をクリックして 鹿 児 島 県 の 郵 便 番 号 データの 圧 縮 データをダウ ンロードします それを すべて 展 開 で 展 開 して 46kagosh.csv ファイルを 用 意 します このファイルを notepad++で 開 いて フォーマットを UTF-8N に 変 換 します 続 いて xampp のコントローラーから MySQL の admin を 呼 び 出 して データベーススペース を 作 成 します 名 前 は yubin で 参 照 設 定 は utf8_general_ci にします そして 読 み 込 み 用 のテーブルを 作 ります 次 の SQL を 実 行 してください 4
CREATE TABLE zip_code ( jis varchar(10) NULL, zip_old varchar(5) NULL, zip varchar(7) NULL, addr1_kana varchar(100) NULL, addr2_kana varchar(100) NULL, addr3_kana varchar(100) NULL, addr1 varchar(100) NULL, addr2 varchar(100) NULL, addr3 varchar(100) NULL, c1 int NULL, c2 int NULL, c3 int NULL, c4 int NULL, c5 int NULL, c6 int NULL ); ここに 先 ほどの 46KAGOSH.CSV をインポートします 主 キーはなしでいいです 5
これで 1458 行 の 鹿 児 島 県 内 の 郵 便 番 号 のデータが 取 れました これを 一 覧 表 示 するプログラムを 作 ってみましょう sample1.php 先 頭 部 分 - // 不 要 なエラー 表 示 を 止 める おまじない error_reporting(e_all ^ ~E_NOTICE ^ ~E_DEPRECATED); require('dbconnect.php'); $sql ='SELECT addr1,addr2,addr3,zip FROM zip_code'; $record = $mysqli->query($sql) or die($mysqli->error); 読 み 込 んだ zip_code テーブルの 中 身 の 内 漢 字 の 部 分 と 郵 便 番 号 を 表 示 しましょう 6
sample1.php body 部 分 - <table> <thead> <tr> <th> 県 </th> <th> 市 </th> <th> 町 </th> <th> 郵 便 番 号 </th> </tr> </thead> <tbody> while($table = $record->fetch_assoc()): <tr> <td> print(htmlspecialchars($table['addr1'],ent_quotes,'utf-8')); </td> <td> print(htmlspecialchars($table['addr2'],ent_quotes,'utf-8')); </td> <td> print(htmlspecialchars($table['addr3'],ent_quotes,'utf-8')); </td> <td> print(htmlspecialchars($table['zip'],ent_quotes,'utf-8')); </td> </tr> endwhile; $record->close(); $mysqli->close(); </tbody> </table> while でループを 回 して 最 後 にレザルトセットと mysqli オブジェクトをクローズしています 前 回 勉 強 した Foundation を 使 ってレスポンシブに 作 って 見 ました 参 照 :asakatsu06.pdf(wordpress の 巻 ) 7
かなり 大 きいので 遅 いですが できました 市 ごとに ドロップダウンリストにしてみる 今 は 鹿 児 島 県 全 部 が 出 ていますが これを 市 ごとにドロップダウンリストを 作 って 表 示 ボタン で 表 示 するようにしてみましょう まずは ドロップダウンリストの 内 容 を 作 らないといけませんが 固 定 でやっては 面 白 くありま せん データベースから 抽 出 してみましょう zip_codeテーブルから addr2( 市 名 )を 重 複 なしで 取 得 するには DISTINCT を 使 い ます $sql ='SELECT distinct addr2 FROM zip_code'; $droplist = $mysqli->query($sql) or die($mysqli->error); 取 得 した$droplistをループして optionを 出 力 します このとき 選 択 した 市 が 鹿 児 島 市 に 戻 らないように selected=selectedを 選 択 した 市 のoptionに 出 力 するようにします ここでも3 項 演 算 子 を 使 います 8
<form action="" method="post"> <select name="si" id="si"> while($drop = $droplist->fetch_assoc()): $sel = $drop['addr2']==$_post['si']? 'selected=selected' : ''; <option value=" print(htmlspecialchars($drop['addr2'],ent_quotes,'utf-8'));" echo $sel; > print(htmlspecialchars($drop['addr2'],ent_quotes,'utf-8'));</option> endwhile; $droplist->close(); </select> <input type="submit" value=" 表 示 "/> </form> これで 選 択 した 市 の 情 報 が$_POST[ si ]で 自 分 に 返 ってきますので それを 使 って 郵 便 番 号 一 覧 を 出 すように 変 更 します 最 初 は 鹿 児 島 市 にしておきます if (!isset($_post['si'])) { $_POST['si']=' 鹿 児 島 市 '; } $sql =sprintf('select addr1,addr2,addr3,zip FROM zip_code WHERE addr2="%s"', mysql_real_escape_string($_post['si'])); $record = $mysqli->query($sql) or die($mysqli->error); これで 出 来 上 がりです 9
Foundation で 作 ると スマホ 対 応 までできます 幅 を 狭 くすると このように 表 示 されます 課 題 : 検 索 画 面 を 作 ってみましょう 10
Foundation を 使 ったサンプルソース php 部 分 は 同 じ <!DOCTYPE html> <!-- [if IE 8]> <html class="no-js lt-ie9" lang="ja"> <![endif]--> <!-- [if gt IE 8]><!--> <html class="no-js" lang="ja"> <!--<![endif]--> <head> <meta charset="utf-8"> <meta name="viewport" content="width-device-width" /> <title> 朝 活 - 第 7 回 データベース-</title> <link rel="stylesheet" href="/_shared/css/foundation.css" /> <script src="/_shared/js/vendor/modernizr.js"></script> <style type="text/css"> #content { width: 100%; margin: 20px auto; } table { width: 100%; } </style> </head> <body> <!-- header --> <div class="row"> <div class="large-12 columns"> <h1>データベース <small>-sample2-</small></h1> 次 ページへつづく 11
<!-- navi --> <div class="row"> <div class="large-12 columns"> <nav class="top-bar" data-topbar> <ul class="title-area"> <!-- Title Area --> <li class="name"> <h1><a href="./sample1.php">データベースの 巻 </a></h1> </li> <li class="toggle-topbar menu-icon"><a href="#"><span>menu</span></a></li> </ul> <section class="top-bar-section"> <!-- Right Nav Section --> <ul class="right"> <li><a href="./sample1.php">sample1</a></li> <li><a href="./sample2.php">sample2</a></li> </ul> </section> </nav> 次 ページへつづく 12
<!-- content & sidebar --> <div class="row" id="content"> <div class="large-12 columns"> <form action="" method="post"> <div class="row"> <div class="large-6 columns"> <lavel> 市 選 択 <select name="si" id="si"> while($drop = $droplist->fetch_assoc()): $sel = $drop['addr2']==$_post['si']? 'selected=selected' : ''; <option value=" print(htmlspecialchars($drop['addr2'],ent_quotes,'utf-8'));" echo $sel; > print(htmlspecialchars($drop['addr2'],ent_quotes,'utf-8'));</option> endwhile; $droplist->close(); 次 ページへつづく </select> </lavel> <div class="large-6 columns"> <input type="submit" value=" 表 示 " class="button"/> </form> 13
<table> <thead> <tr> <th> 県 </th> <th> 市 </th> <th> 町 </th> <th> 郵 便 番 号 </th> </tr> </thead> <tbody> while($table = $record->fetch_assoc()): <tr> <td> print(htmlspecialchars($table['addr1'],ent_quotes,'utf-8')); </td> <td> print(htmlspecialchars($table['addr2'],ent_quotes,'utf-8')); </td> <td> print(htmlspecialchars($table['addr3'],ent_quotes,'utf-8')); </td> <td> print(htmlspecialchars($table['zip'],ent_quotes,'utf-8')); </td> </tr> endwhile; $record->close(); $mysqli->close(); </tbody> </table> 次 ページへつづく 14
<!-- footer --> <footer class="row"> <div class="large-12 columns"> <h3><small> Eternal Lab</small></h1> </footer> <script src="/_shared/js/vendor/jquery.js"></script> <script src="/_shared/js/foundation.min.js"></script> <script> $(document).foundation(); </script> </body> </html> 参 考 にしてください 15
forever 朝 活 php 講 座 2014 年 2 月 28 日 初 版 発 行 著 作 / 制 作 : 株 式 会 社 フォーエバー 890-0053 鹿 児 島 市 中 央 町 22-16 アエールプラザ 4F TEL:099-296-9118 FAX:099-250-2333 http://www.forever.co.jp 本 書 は 構 成 文 書 プログラム 画 像 データなどのすべてにおいて 著 作 権 上 の 保 護 を 受 けています 本 書 の 一 部 あるいは 全 部 について いかなる 方 法 においても 複 写 複 製 など 著 作 権 法 上 で 規 定 された 権 利 を 侵 害 する 行 為 を 行 うことは 禁 じられています 16