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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

1回答

6998閲覧

PHP 郵便番号検索サイト ページング処理について

gorira6

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

1クリップ

投稿2017/07/12 07:26

###前提・実現したいこと
phpで郵便番号検索サイトを作成しています。

以下が要件です
1.郵便番号及び住所の情報をデータベースで管理する。
2.郵便番号から住所が検索できる。
3.検索結果は一覧で「郵便番号、住所」の最低限2つを1行ずつ表示する。
4.郵便番号が未入力だった場合、エラーメッセージを表示する。
5.郵便番号は7桁の数値のみ検索可能とし、それ以外はエラーメッセージを表示する。
6.都道府県と市区町村から住所が検索できる。
7.都道府県、市区町村のどちらか又は両方が未入力だった場合、エラーメッセージを表示する。※どちらか片方だけの検索禁止
8.郵便番号、都道府県、市区町村の入力の前後にある全角及び半角スペースを削除する。入力値チェックや検索はこの後に行う。
例)「 1100001 」→「1100001」
9.検索結果が10件を超えた場合、表示結果を複数ページに分ける。 ※「前へ」「次へ」のようなリンクによりページ切り替えができる

###発生している問題・エラーメッセージ
9の要件を実現しようとした際に、データの取得で失敗してしまいエラーが出てしまいます。
おそらく、以下に記述しましたソースコードにて**「データベースの処理実行」とコメントアウトしている箇所**
のSQL文のLIMIT以降の文章が誤っている為だとは思いますが、なぜ誤りなのかが分かりません。

エラーメッセージ
①Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/codecamp_17142/htdocs/practice_post_code_advanced.php on line 96
②Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /home/codecamp_17142/htdocs/practice_post_code_advanced.php on line 99

###該当のソースコード

php

1<?php 2$message = 'ここに検索結果が表示されます'; 3$error = ''; 4$research_result = ''; 5$post_code = ''; 6$prefectures = ''; 7$municipality = ''; 8$query = ''; 9$pre_data = array(); 10$post_data = array(); 11$search_method = ''; 12$page_limit = 1; 13$page_num = 1; 14 15//都道府県データ 16$host = 'localhost'; 17$username = 'codecamp17142'; 18$passwd = 'jv652011'; 19$dbname = 'codecamp17142'; 20$link = mysqli_connect($host, $username, $passwd, $dbname); 21if (isset($_POST['search_method']) === TRUE){ 22 $search_method = $_POST['search_method']; 23 24}else if(isset($_GET['search_method']) === TRUE){ 25 $search_method = $_GET['search_method']; 26 27} 28 29if ($link){ 30 mysqli_set_charset($link, 'utf8'); 31 $query = 'SELECT prefectures_name FROM pre_table'; 32 $result = mysqli_query($link, $query); 33 while($row = mysqli_fetch_array($result)){ 34 $pre_data[] = $row; 35 } 36 mysqli_free_result($result); 37} 38 39$request_method = $_SERVER['REQUEST_METHOD']; 40 41if(isset($_GET['search_method']) === TRUE || isset($_POST['search_method']) === TRUE){ 42 if(isset($_GET['search_method']) === TRUE){ 43 if($_GET['search_method'] === 'post_search'){ 44 $post_code = $_GET['post_num']; 45 } 46 if($_GET['search_method'] === 'area_search'){ 47 $prefectures = $_GET['pref']; 48 $municipality = $_GET['munici']; 49 } 50 } 51 52 if (isset($_POST['post_code']) === TRUE){ 53 $post_code = $_POST['post_code']; 54 $post_code = trim($post_code); 55 if (mb_strlen($post_code) === 0){ 56 $error = '郵便番号を入力してください。'; 57 }else if (preg_match('/\d{7}/', $post_code) !== 1){ 58 $error = '郵便番号は7桁の半角数字を入力してください'; 59 } 60 } 61 62 if (isset($_POST['prefectures']) === TRUE){ 63 if (($_POST['prefectures']) !== '都道府県を選択'){ 64 $prefectures = $_POST['prefectures']; 65 } else { 66 $error = '都道府県を選択してください。'; 67 } 68 } 69 70 if (isset($_POST['municipality']) === TRUE){ 71 $municipality = $_POST['municipality']; 72 $municipality = trim($municipality); 73 if (mb_strlen($municipality) === 0){ 74 $error = '市区町村を入力してください。'; 75 } 76 } 77 78 //データベースの処理実行 79 mysqli_set_charset($link, 'utf8'); 80 $sql_count = ''; 81 if ($search_method === 'post_search'){ 82 $query = 'SELECT post_code, prefectures, municipality, area FROM post_table WHERE post_code LIKE \''.$post_code.'\' LIMIT 10 OFFSET'.((($page_num)-1)*10); 83 $sql_count = 'SELECT count(post_code) FROM post_table WHERE post_code LIKE \''.$post_code.'\''; 84 }else if ($search_method === 'area_search'){ 85 $query = 'SELECT post_code, prefectures, municipality, area FROM post_table WHERE (prefectures = \''.$prefectures.'\') 86 AND (concat(municipality,area) LIKE \'%'.$municipality.'%\') LIMIT 10 OFFSET'.((($page_num)-1)*10); 87 $sql_count = 'SELECT count(post_code) FROM post_table WHERE (prefectures = \''.$prefectures.'\') 88 AND (concat(municipality,area) LIKE \'%'.$municipality.'%\')'; 89 } 90 //データ件数の取得処理 91 $result_count = mysqli_query($link, $sql_count); 92 $count_row = mysqli_fetch_row($result_count); 93 $page_limit = ceil($count_row[0]/10); 94 /*データの取得処理*/ 95 $result = mysqli_query($link, $query); 96 while($row = mysqli_fetch_array($result)){ 97 $post_data[] = $row; 98 } 99 mysqli_free_result($result); 100 mysqli_close($link); 101 102 if (isset($count_row[0])){ 103 $message = '検索結果'. $count_row[0] .'件'; 104 } 105 106} 107 108?> 109<!DOCTYPE html> 110<html lang = "ja"> 111 <head> 112 <meta charset="UTF-8"> 113 <title>郵便番号検索</title> 114 <style type="text/css"> 115 section{ 116 border-top:solid 1px; 117 margin-top:10px; 118 } 119 table, tr, td, th{ 120 border: solid black 1px; 121 } 122 table{ 123 width:250px; 124 border-collapse:collapse; 125 } 126 caption{ 127 text-align:left; 128 } 129 </style> 130 </head> 131 <body> 132 <h1>郵便番号検索</h1> 133 <h2>郵便番号から検索</h2> 134 <form method="POST"> 135 <input type="text" name="post_code" value="<?php if (isset($post_code) === TRUE){print $post_code;}?>"> 136 <input type="hidden" name="search_method" value="post_search"> 137 <input type="submit" value="検索"> 138 </form> 139 <h2>地名から検索</h2> 140 <form method="POST"> 141 都道府県を選択 142 <select name="prefectures"> 143<?php 144foreach ($pre_data as $value){ 145?> 146 <option value = "<?php print $value[0];?>" <?php if($prefectures === $value[0]){print 'selected';}?>><?php print $value[0];?></option> 147<?php 148} 149?> 150 151 </select> 152 市区町村 153 <input type="text" name="municipality" value = "<?php if (isset($municipality)=== TRUE){print $municipality;}?>"> 154 <input type="hidden" name="search_method" value="area_search"> 155 <input type="submit" value="検索"> 156 </form> 157<section> 158<p><?php print $message; ?></p> 159<p><?php print $error; ?></p> 160</section> 161 162 <table> 163<?php 164if ((mb_strlen($post_code) === 7) || (($prefectures !== '') && (mb_strlen($municipality) > 0))){ 165?> 166<caption>郵便番号検索結果</caption> 167 <tr> 168 <th>郵便番号</th> 169 <th>都道府県</th> 170 <th>市区町村</th> 171 <th>町域</th> 172 </tr> 173<?php 174} 175?> 176<?php 177foreach ($post_data as $value){ 178?> 179 <tr> 180 <td><?php print htmlspecialchars($value['post_code'], ENT_QUOTES, 'UTF-8')?></td> 181 <td><?php print htmlspecialchars($value['prefectures'], ENT_QUOTES, 'UTF-8')?></td> 182 <td><?php print htmlspecialchars($value['municipality'], ENT_QUOTES, 'UTF-8')?></td> 183 <td><?php print htmlspecialchars($value['area'], ENT_QUOTES, 'UTF-8')?></td> 184 </tr> 185<?php 186} 187?> 188 </table> 189<?php if ($page_num !== 1){ ?> 190 <a href = 'practice_post_code_advanced.php?pref=<?php print $prefectures;?>&munici=<?php print $municipality;?>&post_num=<?php print $post_code;?>&search_method=<?php print $search_method;?>&page=<?php print $page_num - 1;?>'>前のページ</a> 191<?php } ?> 192<?php if ($page_num !== $page_limit){ ?> 193 <a href = 'practice_post_code_advanced.php?pref=<?php print $prefectures;?>&munici=<?php print $municipality;?>&post_num=<?php print $post_code;?>&search_method=<?php print $search_method;?>&page=<?php print $page_num + 1;?>'>次のページ</a> 194<?php } ?> 195 </body> 196</html>

###試したこと
mysqli_fetch_array() に正しい値が返っていないとのエラーなので
SQL文を何度か書き換えてみました。
まず、LIMIT 10 までは正しいか確かめるために、OFFSET以降は消して実行してみたところ、問題なく処理されました。
では、OFFSET以降がおかしいのだと思い

WHERE post_code LIKE \''.$post_code.'\' LIMIT 10 OFFSET'.((($page_num)-1)*10);

↓↓

WHERE post_code LIKE \''.$post_code.'\' LIMIT 10 OFFSET ((('.$page_num.')-1)*10)';

のように書いてみましたが、相変わらずエラーメッセージは変わらないままでした。

エラーの原因になっている場所と、解決方法について

大変お手数かと思いますが、ご教授して頂けると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

OFFSETの後にスペース入れたらどうでしょう

PHP

1WHERE post_code LIKE \''.$post_code.'\' LIMIT 10 OFFSET '.((($page_num)-1)*10);

投稿2017/07/12 07:39

kunai

総合スコア5405

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

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

gorira6

2017/07/12 07:47

ありがとうございます! 無事エラーが消えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問