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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

3回答

2411閲覧

SQL文 SELECT文 LIMIT句に変数を入れ、DBからデータを取得したい

osakanasan

総合スコア18

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

0クリップ

投稿2018/10/02 05:22

前提・実現したいこと

初学者です。よろしくお願いいたします。
PHPとmysqlを勉強しており、課題として郵便番号及び住所を検索するプログラムを作成しています。
データベースはMyAdminにて作成しました。

1ページ10件の検索結果を表示し、ページを「次へ」「戻る」で移動できるページング機能を実装するため、
まずはmysqli_query()やSELECT文およびLIMIT句を用いる事が分かり試したのですが、、、

'LIMIT 10'のような文は動いてくれるのですが、変数を用いた'LIMIT 変数'ではエラーが出てしまい、
検索結果も0件になってしまいます。

エラー内容から、データベースに変数の内容が伝わっておらず、'LIMIT なんだこれ' と処理され、
論理型のtrue or falseで返ってしまってるのだと思い、どうすればデータベースに変数の存在を伝えられるか調べてみましたが分かりませんでした。(そもそも上記の解釈で合っているのかも分かりません、、、)

まだページング機能の作成すらまともにわからない状態ではありますが、
まずは'LIMIT 変数'を用いて検索結果が10件表示されるようにしたいです。
エラーの原因、改善をお教え下さる方いらっしゃいましたら、
改めまして、よろしくお願いいたします。

発生している問題・エラーメッセージ

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in

該当のソースコード

php

1<?php 2$zipcode = NULL; 3$pref = NULL; 4$address = NULL; 5//var_dump用 6$zipcode_data = NULL; 7$address_data = NULL; 8 9//ページング用 10$page = 1; 11$count = 10; 12////////////////////////////////////////////////////////// 13//入力された値のチェック 14////////////////////////////////////////////////////////// 15//ここのissetでボタンの判別してます//hiddenで判別できたなぁ(今更感) 16//postボタンを押して入力された値がある場合 17if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST ['post_button']) === true && empty($_POST['zipcode']) !== true) { 18 $trim_zipcode = trim($_POST['zipcode']); //入力された値にトリムをかける 19 if(preg_match('/^[0-9]{7}?$/', $trim_zipcode) === 1) { //トリム後1~9の数字7文字なら 20 $zipcode = $trim_zipcode; 21 //トリム後1~9の数字7文字でないなら 22 } else if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST ['post_button']) === true && mb_strlen($trim_zipcode) !== 7) { 23 $message2 = '郵便番号は半角で7つの数字で入力してください'; 24 } 25//postボタンを押して入力された値がない場合 26} else if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST ['post_button']) === true && empty($_POST['zipcode']) === true) { 27 $message2 = '郵便番号を入力してください'; 28} 29 30//prefボタンを押して、都道府県に入力された値がある場合 31if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST ['pref_button']) === true && empty($_POST['pref']) !== true) { 32 $pref = $_POST['pref']; 33//prefボタンを押して、都道府県に入力された値がない場合 34} else if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST ['pref_button']) === true && empty($_POST['pref']) === true) { 35 $message2 = '都道府県を入力してください'; 36} 37 38//prefボタンを押して、市区町村に入力された値がある場合 39if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST ['pref_button']) === true && empty($_POST['address']) !== true) { 40 $trim_address = trim($_POST['address']); 41//正規表現はQiitaの投稿より拝借。凄い闇を感じる、、、 42 if(preg_match('/(...??[都道府県])((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村)市|.+?郡(?:玉村|大町|.+?)[町村]|.+?市.+?区|.+?[市区町村])(.+)/', $trim_address) === 1) { 43 $address = $trim_address; 44 } 45} else if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST ['pref_button']) === true && empty($_POST['pref']) !== true && empty($_POST['address']) === true) { 46 $message2 = '市区町村を入力してください'; 47} 48//dbからデータの検索と取得 49//db接続の準備 質問のため消してます 50$host = 'localhost'; 51$username = ''; 52$passwd = ''; 53$dbname = ''; 54$link = mysqli_connect($host, $username, $passwd, $dbname); 55 56//郵便番号から検索 57if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($zipcode) === true) { //$zipcodeに値が入っている段階で郵便番号7桁はクリア 58 if($link) { 59 mysqli_set_charset($link, 'utf8'); 60 //とりあえずここは保留 61 $query = 'SELECT * FROM postal_code_table WHERE postal_code ='. $zipcode; 62 $result = mysqli_query($link, $query); 63 $data = array(); 64 $count_r = 0; 65 while($row = mysqli_fetch_array($result)) { 66 $data[] = $row; 67 $count_r++; 68 } 69 mysqli_free_result($result); 70 mysqli_close($link); 71 } else { 72 $message1 = 'DBに接続できませんでした'; 73 } 74//郵便番号が入力されてない場合(上に移動しました) 75} 76 77//地名(都道府県と市区町村)から検索 78if($_SERVER['REQUEST_METHOD'] === 'POST' && empty($pref) !== true && empty($address) !== true) { 79 if($link) { 80 mysqli_set_charset($link, 'utf8'); 81 ///////////////////////////////////////////////////////////////// 82 //問題の箇所はこちらです 83 //////////////////////////////////////////////////////////////// 84 $offset = $count * ($page - 1); 85 // ??この変数の入れ方は禁止ですか?また、禁止であればどのように入れると良いですか? 86 //こちらは質問内容と関係ございません 87 88 $query = 'SELECT * FROM postal_code_table WHERE prefectures = \'' .$pref. '\' AND city = \'' .$address. '\' LIMIT \'' .$offset. '\' , \'' .$count.'\''; 89 90 //ここでlimitを使っても検索結果を10件にするだけ、、、? 91 //$query = 'SELECT * FROM postal_code_table WHERE prefectures =' . $pref . 'AND' . 'city =' . $address; これでは駄目でした。(もしかしてスペースが無くて全部つながってる?) 92 //$query = "SELECT * FROM postal_code_table WHERE (prefectures = ".$pref." AND city = ".$address.") LIMIT ".$offset.",".$count; 93 94 $result = mysqli_query($link, $query); 95 $data = array(); 96 $count_r = 0; 97 while($row = mysqli_fetch_array($result)) { 98 $data[] = $row; 99 $count_r++; 100 } 101 mysqli_free_result($result); 102 mysqli_close($link); 103 } else { 104 $message1 = 'DBに接続できませんでした'; 105 } 106//地名(都道府県と市区町村)が入力されてない場合(上に移動しました) 107} 108?> 109 110<!DOCTYPE html> 111<html lang="ja"> 112 <head> 113 <meta charset="utf-8"> 114 <title>郵便番号検索</title> 115 <style> 116 .search_reslut { 117 border-top: solid 1px; 118 margin-top: 10px; 119 } 120 121 table { 122 border-collapse: collapse; 123 } 124 table, tr, th, td { 125 border: solid 1px; 126 } 127 caption { 128 text-align: left; 129 } 130 </style> 131<link rel="stylesheet" id="coToolbarStyle" href="chrome-extension://cjabmdjcfcfdmffimndhafhblfmpjdpe/toolbar/styles/placeholder.css" type="text/css"> 132<script type="text/javascript" id="cosymantecbfw_removeToolbar"> 133 (function () {var toolbarElement = {},parent = {},interval = 0,retryCount = 0,isRemoved = false; 134 if (window.location.protocol === 'file:') { interval = window.setInterval(function () { toolbarElement = document.getElementById('coFrameDiv'); 135 if (toolbarElement) {parent = toolbarElement.parentNode; 136 if (parent) {parent.removeChild(toolbarElement); 137 isRemoved = true; 138 if (document.body && document.body.style) {document.body.style.setProperty('margin-top', '0px', 'important'); 139 } 140 } 141 } 142 retryCount += 1; 143 if (retryCount > 10 || isRemoved) {window.clearInterval(interval); 144 } 145 }, 10); 146 } 147 })(); 148 </script> 149 </head> 150<body> 151 <h1>郵便番号検索</h1> 152 <h3>兵庫県がおすすめ!</h3><?php var_dump($count); var_dump($offset);?> <!--デバック用--> 153 <!-- <?php var_dump($zipcode_data); var_dump($address_data);?> デバック用--> 154 <section> 155 <h2>郵便番号から検索</h2> 156 <form method ="POST"> 157 <input type="text" name="zipcode" placeholder="例)1010001" value=""> 158 <input type="hidden" name="search_method" value="zipcode"> 159 <input type="submit" name = "post_button" value="検索"><!--郵便番号からの検索ボタン--> 160 </form> 161 <h2>地名から検索</h2><?php var_dump($zipcode); var_dump($pref); var_dump($address);?> <!--デバック用--> 162 <form method ="POST"> 163 都道府県を選択 164 <select name="pref"> 165 <option value="" selected="">都道府県を選択</option> 166<!-- 文字数のため割愛 全ての都道府県が入っています --> 167 <option value="北海道">北海道</option> 168 <option value="兵庫県">兵庫県</option> 169 <option value="沖縄県">沖縄県</option> 170 </select> 171 市区町村 172 <input type="text" name="address" value=""> 173 <input type="hidden" name="search_method" value="address"> 174 <input type="submit" name = "pref_button" value="検索"><!--都道府県と市区町村からの検索ボタン--> 175 </form> 176 </section> 177 <section class="search_reslut"> 178 <p>ここに検索結果が表示されます</p><!--<?php var_dump($_POST ['post_button']);?> デバック用--> 179 <?php if(isset($count_r) === true) { ?> <span><?php print '結果:' . $count_r . '件'; ?></span> <?php } ?> 180 181 <?php if($_SERVER['REQUEST_METHOD'] === 'POST') { 182 183 if(isset($message1) === true) { ?> 184 <p><?php print $message1; ?></p> 185 <?php } ?> 186 <?php if(isset($message2) === true) { ?> 187 <p><?php print $message2 ?></p> 188 <?php } ?> 189 190 <!-- 検索の結果表示 or 結果ゼロ件--> 191 <?php if(isset($data) === true) { ?> 192 <table> 193 <tr> 194 <th>郵便番号</th><th>都道府県</th><th>市区町村</th><th>町域</th> 195 </tr> 196 197 <?php foreach($data as $value){ ?> 198 <tr> 199 <td><?php print htmlspecialchars($value['postal_code'], ENT_QUOTES, 'UTF-8'); ?></td> 200 <td><?php print htmlspecialchars($value['prefectures'], ENT_QUOTES, 'UTF-8'); ?></td> 201 <td><?php print htmlspecialchars($value['city'], ENT_QUOTES, 'UTF-8'); ?></td> 202 <td><?php print htmlspecialchars($value['town_range'], ENT_QUOTES, 'UTF-8'); ?></td> 203 </tr> 204 205 <?php } ?> 206 207 <?php } else if(isset($_POST ['post_button']) === true || isset($_POST ['pref_button']) === true && isset($data) !== true ) { ?> 208 <p><?php print '結果:0件' ?></p> 209 <?php } ?> 210 </table> 211 <?php } ?> 212 </section> 213 214</body> 215<div id="coFrameDiv" style="height:0px;display:none;"> 216 <iframe id="coToolbarFrame" src="chrome-extension://cjabmdjcfcfdmffimndhafhblfmpjdpe/toolbar/placeholder.html" style="height: 0px; width: 100%; display: none;"> 217 </iframe> 218 </div> 219</html>

試したこと

(素人目で行っております)
「$offset」や「$count」などの値を、var_dumpを用いて確認
SELECT文の繋ぎ方に間違いが無いか確認
スペルミスの確認

補足情報(FW/ツールのバージョンなど)

DBではこのようになっており、兵庫県のデータが入っています。

イメージ説明

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

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

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

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

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

guest

回答3

0

単純にスペースが足りないとかそういった話じゃないですか?
エラーとなった完成系の SQL 文を載せると早いと思います。

投稿2018/10/02 06:04

ssasaki

総合スコア1167

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

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

0

インジェクション対策もあるのでprepareで処理してください

投稿2018/10/02 05:59

yambejp

総合スコア114839

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

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

osakanasan

2018/10/02 06:21

ご回答いただき、誠にありがとうございます。 まだ理解が及ばないのですが、 必要な処理ということなので勉強します
guest

0

ベストアンサー

SQL文間違ってるような

PHP

1$address. '\' LIMIT \'' .$offset. '\' , \'' .$count.'\'';

$offsetが10 $countが20だとしたら
LIMIT '10', '20'となりますが文法エラーです(LIMIT 10, 20が正しい)

投稿2018/10/02 05:40

編集2018/10/02 05:41
rururu3

総合スコア5545

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

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

osakanasan

2018/10/02 06:14

ご回答いただき、誠にありがとうございます。 間違った箇所が判明し、助かりました。 sql文の書き方やエスケープについてなどが、私自身まだ理解できていないようです。 もう少し粘ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問