質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1961閲覧

郵便番号検索をつくりたい

midori_saki

総合スコア29

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/01/12 23:21

参考書で、phpの勉強をしています。
よくある、郵便番号検索を検索する演習問題でつまずいています。
・テキストエリアに郵便番号を入れたら、該当の番号だけをテーブルで表示させる、
・セレクトメニューで県を選択して市町村区を入れたら該当する地名をテーブルに表示させる、
・郵便番号、市町村区、どちらも空だったらエラーメッセージを出す、
・郵便番号か市町村区、どちらか入力できていれば結果を表示させる
ということを実現させたいです。

どこが間違いなのか、どう直せばいいかを教えてください。
よろしくお願いします。

<?php $msg = array(); $postal_data = array(); $search_method = ''; $zipcode = ''; $pref = ''; $address = ''; $city = ''; $result = ''; $host = 'localhost'; // データベースのホスト名又はIPアドレス $username = 'username'; // MySQLのユーザ名 $passwd = 'passwd'; // MySQLのパスワード $dbname = 'dbname'; // データベース名 $link = mysqli_connect($host, $username, $passwd, $dbname); if ($link){ // 文字化け防止 mysqli_set_charset($link, 'utf8'); if(isset($_GET['search_method']) === TRUE){ $search_method = trim($_GET['search_method']); if($search_method === ($_GET['zipcode'])){ $zipcode = trim($_GET['zipcode']); } print $zipcode; if(mb_strlen($zipcode) === 0){ $msg[] = '郵便番号を入力してください'; } else if(preg_match('/^[0-9]{7}$/',$zipcode) !== 1){ $msg[] = '郵便番号の形式が正しくありません'; } if($search_method === ($_GET['address'])){ $address = trim($_GET['address']); $pref = trim($_GET['pref']); } if($pref === '都道府県を選択'){ $msg[] = '都道府県を選択してください。'; } if (mb_strlen($address) === 0){ $msg[] = '市区町村を入力してください。'; } if(isset($_GET['city']) === TRUE){ $address = trim($_GET['city']); } } mysqli_set_charset($link, 'utf8'); $query = 'SELECT zipcode,pref,city,town FROM zip_table'; $result = mysqli_query($link, $query); while ($row = mysqli_fetch_array($result)) { $postal_data[] = $row; } if($search_method === $zipcode){ $query = 'SELECT zipcode, pref, city, town FROM zip_table WHERE zipcode = \''.$zipcode.'\''; }else if($search_method === $address){ $query = 'SELECT zipcode,pref,city,town FROM zip_table WHERE address = "^$address.*"'; } var_dump($search_method); var_dump($query); mysqli_free_result($result); mysqli_close($link); }else{ print 'DB接続失敗'; } ?> <!DOCUTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>郵便番号検索</title> <style> .search_reslut { border-top: solid 1px; margin-top: 10px; } table { border-collapse: collapse; } table, tr, th, td { border: solid 1px; } caption { text-align: left; } </style> </head> <body> <h1>郵便番号検索</h1> <section> <h2>郵便番号から検索</h2> <form> <input type="text" name="zipcode" placeholder="例)1010001" value="<?php if (isset($zipcode) === TRUE){print $zipcode;}?>"> <input type="hidden" name="search_method" value="zipcode"> <input type="submit" value="検索"> </form> <h2>地名から検索</h2> <form> 都道府県を選択 <select name="pref"> <option value="" selected>都道府県を選択</option> <option value="北海道" >北海道</option> <option value="青森県" >青森県</option> <option value="岩手県" >岩手県</option> <option value="宮城県" >宮城県</option> <option value="秋田県" >秋田県</option> <option value="山形県" >山形県</option> <option value="福島県" >福島県</option> <option value="茨城県" >茨城県</option> <option value="栃木県" >栃木県</option> <option value="群馬県" >群馬県</option> <option value="埼玉県" >埼玉県</option> <option value="千葉県" >千葉県</option> <option value="東京都" >東京都</option> <option value="神奈川県" >神奈川県</option> <option value="新潟県" >新潟県</option> <option value="富山県" >富山県</option> <option value="石川県" >石川県</option> <option value="福井県" >福井県</option> <option value="山梨県" >山梨県</option> <option value="長野県" >長野県</option> <option value="岐阜県" >岐阜県</option> <option value="静岡県" >静岡県</option> <option value="愛知県" >愛知県</option> <option value="三重県" >三重県</option> <option value="滋賀県" >滋賀県</option> <option value="京都府" >京都府</option> <option value="大阪府" >大阪府</option> <option value="兵庫県" >兵庫県</option> <option value="奈良県" >奈良県</option> <option value="和歌山県" >和歌山県</option> <option value="鳥取県" >鳥取県</option> <option value="島根県" >島根県</option> <option value="岡山県" >岡山県</option> <option value="広島県" >広島県</option> <option value="山口県" >山口県</option> <option value="徳島県" >徳島県</option> <option value="香川県" >香川県</option> <option value="愛媛県" >愛媛県</option> <option value="高知県" >高知県</option> <option value="福岡県" >福岡県</option> <option value="佐賀県" >佐賀県</option> <option value="長崎県" >長崎県</option> <option value="熊本県" >熊本県</option> <option value="大分県" >大分県</option> <option value="宮崎県" >宮崎県</option> <option value="鹿児島県" >鹿児島県</option> <option value="沖縄県" >沖縄県</option> </select> 市区町村 <input type="text" name="address" value= "<?php if (isset($address)=== TRUE){print $address;}?>"> <input type="hidden" name="search_method" value="address"> <input type="submit" value="検索"> </form> </section> <section class="search_reslut"> <p>ここに検索結果が表示されます</p> <p>郵便番号を入力してください。</p> </section> <?php foreach($msg as $value){ ?> <p><?php print $value; ?></p> <?php } ?> <?php print $address; ?> <table> <?php foreach ($postal_data as $row) { ?> <tr> <td><?php print htmlspecialchars($row['zipcode'], ENT_QUOTES, 'UTF-8'); ?></td> <td><?php print htmlspecialchars($row['pref'], ENT_QUOTES, 'UTF-8'); ?></td> <td><?php print htmlspecialchars($row['city'], ENT_QUOTES, 'UTF-8'); ?></td> <td><?php print htmlspecialchars($row['town'], ENT_QUOTES, 'UTF-8'); ?></td> </tr> <?php } ?> 検索結果:<?php print count($postal_data, COUNT_RECURSIVE); ?> </table> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/12 23:43

何にどうつまずいているのでしょう。 気になるところを全て指摘していたらキリがないくらいですけど・・・ 解決したい問題は絞った方が良いです。 あと、PHPのバージョンは必ず質問に記載してください。
midori_saki

2020/01/12 23:50

結果を表示させたいのですが、表示されないことに困っています。
m.ts10806

2020/01/13 00:00

質問は編集できますので。 各所でprintさせているようですが、どこまでコードは通っているのでしょう。
m.ts10806

2020/01/13 00:05 編集

「どういうデータがあって」「どういうワードで検索して」 というところも提示されないと他者にはそれが正しい手順なのか判断できませんので、 そのあたりも具体的に追記してください。 「どういうデータがあって」部分はDBの情報、CREATE TABLE文とサンプルデータのINSERT文があればこちらの手元でも確認できます。 今のままだと「入力したデータがないからでは?DBに対して直接同じSQLを実行して確かめてください」くらいしか言えません。
guest

回答1

0

どこが間違いなのか、どう直せばいいかを教えてください。

ある程度PHPやってきたものとしては「ほぼ全部やり直し」をすすめます。
理由はたくさんありますけど。

  • <form>が別だと一発で同時に検索できません。作りを難しくしているだけです。
  • mysqliよりPDOを使うべき
  • じゃなくてもtry-catchは必要
  • $_GETや$_POSTは直接参照すべきではない。filter_input()が望ましい。
  • trim()した情報で検索すべきではない。情報の加工になります。半角スペース来たら半角スペースで検索させたら良いです。「必須」なら「trim()したものと空が=か」を比べるにとどめましょう。
  • デバッグなら__LINE__をechoしておかないとどこ通ったか分かりづらいと思う
  • 定義したものの使われない変数がある

下記、必読
PHPでデータベースに接続するときのまとめ
(関連記事も一通り目を通すのが望ましい)

他、手前味噌ですが、私自身が最近した回答も参考にしてください。
teratail:PHPでのPDOを使用したDBに情報を格納したいのですが…#の回答
teratail:PHP、掲示板の削除機能実装をしたいです#の回答

よくある、郵便番号検索を検索する

よくありますかね?
郵便番号データベースってサイズ凄く大きいので、あまり学習に向かないように思いますし、アプリケーション側のデータベースにデータもつのって余程でかいシステムで内部的な情報も必要な場合に限られるように思いますけど・・
データって「検索だけ」ってありえないので、登録・更新・削除も含めた「CRUD」前程でもっと身近な情報を扱うようにした方が良いように思います。
スケジュールとか、献立とか、趣味とか、 本当によくあるのは「掲示板」ですけど。
ある程度マスタももってリレーション貼れるようなもののほうが学習題材としては向いていると思います。

投稿2020/01/13 01:11

編集2020/01/13 01:21
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/13 01:27

ちなみに、日本郵便の郵便番号 ※7 全角となっている町域名の文字数が38文字を超える場合、また、半角カタカナとなっている町域名のフリガナが76文字を越える場合には、複数レコードに分割しています。 これの制限でまともに使えないw
m.ts10806

2020/01/13 01:31

asahina1979さん、maisumakunさん そうですね。全部入れようと思ったら定義も大変ですし、「欲しい情報だけ取り出す」という作業もそれなりに大変でした。例に挙げられている二行にまたがって出る住所とかは結局import時にエラーが出て手で直す作業とかしましたからね・・ まぁ・本当に郵政省のあれを使っている場合、ですけどね。 質問者さんがどういうデータをどこで入手して使おうとしているのかは知らないので。
退会済みユーザー

退会済みユーザー

2020/01/13 01:31

@maisumakun それの中に > 2行に跨がってる とあるけど、実際に混沌なのは3行以上に跨ってるデータも存在する
m.ts10806

2020/01/13 01:33

まあひとまず「複数の検索条件を学習したいならもっと簡単で良い題材があるのでは」という提案の1部ということで。
退会済みユーザー

退会済みユーザー

2020/01/13 01:35

apiとかjsとか使ってサクッと作っちゃう場面に、 なぜ手間を掛けるのかってゆー疑問はあるけど。 「郵便番号 住所検索 api」とか検索しない?
m.ts10806

2020/01/13 01:37

>「郵便番号 住所検索 api」 「郵便番号 住所検索 PHP」かなぁ。 でも何かの教材らしいのでその指示かもしれませんね。
midori_saki

2020/01/13 01:41

ご指摘ありがとうございました。 初心者なので、大変だということすらわかりませんでした。
m.ts10806

2020/01/13 01:44

>初心者なので、大変だということすらわかりませんでした。 いえ、フォーム送信にしろDBへの検索にしろ、もっと単純な項目から試した方が確実な理解に繋がるということです。 郵便番号・・・というか「住所検索」だと結構色んな項目を含みますし、結構複雑です。 それならもっと身近な情報で、まずは1項目だけから始めるとか、積み重ねていきましょう。
退会済みユーザー

退会済みユーザー

2020/01/13 02:30

https://www.post.japanpost.jp/zipcode/download.html から郵便番号のデータベースをダウンロードできるので、 地元の都道府県だけでも一読するといいですよ。 そーとー複雑だとわかりますので。 (町村合併とか一部併合とかの形跡も見えたりしてニントモカントモ)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問