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

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

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

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

PHP

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

Q&A

解決済

2回答

872閲覧

エラーの対処法がわかりません

YutaEvol

総合スコア15

MySQL

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

PHP

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

0グッド

0クリップ

投稿2020/03/23 09:26

phpここに言語を入力

1 <?php 2 $errors=[]; 3 $address_data=[]; 4 $number=''; 5 $flag=FALSE; 6 $host = 'localhost'; // データベースのホスト名又はIPアドレス 7 $username = ''; // MySQLのユーザ名 8 $passwd = ''; // MySQLのパスワード 9 $dbname = ''; // データベース名 10 $link = mysqli_connect($host, $username, $passwd, $dbname); 11 $pref=''; 12 $city=''; 13 $query=''; 14 $page=1; 15 $count=''; 16 $totalpage=''; 17 18 19 20 if(isset($_GET["page"]) && $_GET["page"]>0){ 21 $page=(int)$_GET["page"]; 22 }else{ 23 $page=1; 24 } 25 $perpage=10; 26 27 $start_page=($page-1)*$perpage; 28 if($link){ 29 if($_SERVER['REQUEST_METHOD'] === 'GET'){ 30 mysqli_set_charset($link, 'utf8'); 31 if(isset($_GET['first'])===TRUE){ 32 $flag=TRUE; 33 if(isset($_GET['number'])===TRUE){ 34 $number=$_GET['number']; 35 } 36 if(mb_strlen($number)===0){ 37 $errors[]='未入力です'; 38 }else if(preg_match('/^[0-9]{7}$/',$number)!==1){ 39 $errors[]='形式が違います'; 40 } 41 $query_count="SELECT count(address_number) FROM address_table WHERE WHERE address_number= '$number';"; 42 43 $query="SELECT address_number,address_1,address_2,address_3 FROM address_table WHERE address_number=$number"; 44 45 } 46 47 48 if(isset($_GET['second'])===TRUE){ 49 $flag=TRUE; 50 if(isset($_GET['pref'])===TRUE){ 51 $pref=$_GET['pref']; 52 53 } 54 if(isset($_GET['city'])===TRUE){ 55 $city=$_GET['city']; 56 57 } 58 if(mb_strlen($city)===0){ 59 $errors[]='市区町村が未入力です'; 60 } 61 if($pref==='pref_name'){ 62 $errors[]='選択されていない'; 63 } 64 $query_count="SELECT count(address_number) FROM address_table WHERE address_1='$pref' AND address_2 LIKE '$city%';"; 65 66 67 $totalpage=ceil($count[0]/$perpage); 68 69 $query="SELECT address_number,address_1,address_2,address_3 FROM address_table WHERE address_1='$pref' AND address_2 LIKE '$city%' LIMIT $start_page ,$perpage;"; 70 } 71 // 件数を取得してからにする LIMITの使い方 ページリングでlimitを使うときは二段階でやる 72 $result=mysqli_query($link,$query_count); 73 $count=mysqli_fetch_row($result); 74 75 $result = mysqli_query($link, $query); 76 77 // $row_cnt=mysqli_num_rows($result); // 1行ずつ結果を配列で取得します 78 79 while ($row = mysqli_fetch_array($result)) { 80 $address_data[] = $row; 81 } 82 // 結果セットを開放します 83 mysqli_free_result($result); 84 // 接続を閉じます 85 mysqli_close($link); 86 } 87 88 }else { 89 echo 'DB接続失敗'; 90 } 91 92 ?> 93 94 <!DOCTYPE html> 95 <html> 96 <head> 97 <meta charset='utf-8'> 98 <title>郵便番号</title> 99 </head> 100 <body> 101 <h1>郵便番号検索</h1> 102 <h2>郵便番号から検索</h2> 103 <form method='get'> 104 <input type='text' name='number' placeholder='例) 1010001'> 105 <input type='submit' name='first' value='検索'> 106 <h2>地名から検索</h2> 107 <p>都道府県を検索 108 <select name='pref'> 109   <option value='pref_name'>都道府県</option> 110 <option value="北海道">北海道</option> 111 <option value="青森県">青森県</option> 112 <option value="岩手県">岩手県</option> 113 <option value="宮城県">宮城県</option> 114 <option value="秋田県">秋田県</option> 115 <option value="山形県">山形県</option> 116 <option value="福島県">福島県</option> 117 <option value="茨城県">茨城県</option> 118 <option value="栃木県">栃木県</option> 119 <option value="群馬県">群馬県</option> 120 <option value="埼玉県">埼玉県</option> 121 <option value="千葉県">千葉県</option> 122 <option value="東京都">東京都</option> 123 <option value="神奈川県">神奈川県</option> 124 <option value="新潟県">新潟県</option> 125 <option value="富山県">富山県</option> 126 <option value="石川県">石川県</option> 127 <option value="福井県">福井県</option> 128 <option value="山梨県">山梨県</option> 129 <option value="長野県">長野県</option> 130 <option value="岐阜県">岐阜県</option> 131 <option value="静岡県">静岡県</option> 132 <option value="愛知県">愛知県</option> 133 <option value="三重県">三重県</option> 134 <option value="滋賀県">滋賀県</option> 135 <option value="京都府">京都府</option> 136 <option value="大阪府">大阪府</option> 137 <option value="兵庫県">兵庫県</option> 138 <option value="奈良県">奈良県</option> 139 <option value="和歌山県">和歌山県</option> 140 <option value="鳥取県">鳥取県</option> 141 <option value="島根県">島根県</option> 142 <option value="岡山県">岡山県</option> 143 <option value="広島県">広島県</option> 144 <option value="山口県">山口県</option> 145 <option value="徳島県">徳島県</option> 146 <option value="香川県">香川県</option> 147 <option value="愛媛県">愛媛県</option> 148 <option value="高知県">高知県</option> 149 <option value="福岡県">福岡県</option> 150 <option value="佐賀県">佐賀県</option> 151 <option value="長崎県">長崎県</option> 152 <option value="熊本県">熊本県</option> 153 <option value="大分県">大分県</option> 154 <option value="宮崎県">宮崎県</option> 155 <option value="鹿児島県">鹿児島県</option> 156 <option value="沖縄県">沖縄県</option> 157 </select> 158 市区町村<input type='text' name='city'><input type='submit' name='second' value='検索'> 159 </p> 160 </form> 161 <hr> 162 <?php foreach($errors as $error){ ?> 163 <p><?php echo $error; ?></p> 164 <?php } ?> 165 <?php if($flag===FALSE){ ?> 166 <p>ここに検索結果が表示されます</p> 167 <?php }else if($flag===TRUE && count($errors)===0){ ?> 168 <p><?php echo $count[0]; ?></p> 169 <?php } ?> 170 <?php 171 echo '<table>'; 172 echo '<tr><td>郵便番号</td><td>都道府県</td><td>市区町村</td><td>町域</td></tr>'; 173 ?> 174 <?php foreach($address_data as $address){?> 175 <?php if (count($errors)===0){?> 176 177 178 <tr> 179 <td><?php echo htmlspecialchars($address['address_number'], ENT_QUOTES, 'UTF-8');?></td> 180 <td><?php echo htmlspecialchars($address['address_1'], ENT_QUOTES, 'UTF-8');?></td> 181 <td><?php echo htmlspecialchars($address['address_2'], ENT_QUOTES, 'UTF-8');?></td> 182 <td><?php echo htmlspecialchars($address['address_3'], ENT_QUOTES, 'UTF-8');?></td> 183 </tr> 184 <?php } ?> 185 <?php } ?> 186 <?php echo '<table>'?> 187 188 <!--件数が10件を超えて且つ最後のページでなければ次へを表示--> 189 <?php if($page < $totalpage){?> 190 <a href="./practice_post_code_advanced.php?pref=<?php print $pref; ?>&city=<?php print $city; ?>&second=address&page=<?php echo ($page +1);?>">次へ</a> 191 <?php } ?> 192 <!--件数が10件を超えて且つ最初のページでなければ次へを表示--> 193 <?php if( $page > 1){?> 194 <a href="./practice_post_code_advanced.php?pref=<?php print $pref; ?>&city=<?php print $city; ?>&second=address&page=<?php echo ($page -1);?>">前へ</a> 195 <?php } ?> 196 197 </body> 198 </html>コード

質問
検索件数を表示させたくて地名からの場合はうまく表示されるのですが
郵便番号の検索ではWarning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in /home/ec2-user/environment/htdocs/php17/practice_post_code_advanced.php on line 73
というエラー表示が出ます。

試したこと
$query_count="SELECT count(address_number) FROM address_table
WHERE WHERE address_number= '$number';";(まず数を検索して該当する数を取得)
$result=mysqli_query($link,$query_count); (実行)
$count=mysqli_fetch_row($result);
echo $count[0]件

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/03/23 09:43

bind_param()を使って安全にプリペアドステートメントを実行するべきだと思います。文字列の変数展開でSQL文を作っては脆弱性を生みます。
m.ts10806

2020/03/23 10:15

そのエラーは世界ではじめてあなたが出会ったものだと思いますか? それならなにも調べず質問するのも分かります。「試す」は「調べる」もセットに考えるべきと思います。 もし少しでも調べたことがあるのでしたら具体的に記載してください。なにもなければ読むのは赤の他人、伝わらないし調べてないのと同じです。
YutaEvol

2020/03/23 12:51

エラー表示をコピペしてググりましたよ。 それでもわかりませんでした
m.ts10806

2020/03/23 12:56 編集

私は >もし少しでも調べたことがあるのでしたら具体的に記載してください。 と書いています。 ググって結果何も記事読んでませんか? キーワードと確認した記事をセットで提示してようやく他者は「こういう風に調べたのか」と分かります。「調べました」と書くだけでは不十分です。 本当に何も調べず試さず丸投げする人との区別は他人にはできません。 ガイドラインにも下記のように書いてあります。 >https://teratail.com/help/question-tips#questionTips1-2 検索して見つけたページでわからない事があれば、どのページのどの部分がわからないのかを明確に記し質問してみてください。 いずれにしてもエラーが出た場合、大抵は構文エラーですから、エラーを読んで(Google翻訳レベルでOK)PHPマニュアルで機能仕様を確認すればほとんど解決に至れます。 (既にそういう回答がついています)
YutaEvol

2020/03/23 14:01

参考にします。 ありがとうございます
m.ts10806

2020/03/23 14:04

質問は編集できるので適宜ご対応ください
guest

回答2

0

ベストアンサー

Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result
の原因は、引数にFALSEが与えられた、
つまりmysqli_query()で実行しているクエリーに失敗しています。
WHEREが2個あるけど?

address_numberって文字列なのか数字なのか、DB上の定義はどっちでしょうか。
それによって、数値文字列を与えるかシングルクォートつきで文字列で与えるのかを統一しましょう。

そこで。
数字で与えるのか文字列で与えるのかをドライバーに任せるために、
PHP: mysqli_stmt::bind_param - Manual
を駆使してください。

php

1$query_count = <<<EOT 2SELECT count(address_number) 3FROM address_table 4WHERE address_number=?; 5EOT; 6$stmt = mysqli_prepare($link, $query_count); 7mysqli_stmt_bind_param($stmt, 'i', $number); 8mysqli_stmt_execute($stmt);

みたいな流れ。

投稿2020/03/23 09:48

編集2020/03/23 09:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YutaEvol

2020/03/23 12:56

わざわざご丁寧にありがとうございます
退会済みユーザー

退会済みユーザー

2020/03/23 12:59 編集

「わざわざご丁寧に?」冷やかしてるの? 言葉のチョイス、それでいいの? 他人を馬鹿にするときにも使うような言い回しを、ここで使っていいのですか?
guest

0

php

1$result=mysqli_query($link,$query_count);

こちらの処理でFALSEが返ってきています。つまりクエリが間違っている場合があります。
ifで回避するという方法もなくはありませんが、クエリが間違っているので、クエリを直すのが第一だと思います。

php

1 $query_count="SELECT count(address_number) FROM address_table WHERE WHERE address_number= '$number';";

このクエリは、syntax errorになります。(WHEREが2つ連続になっているので)

投稿2020/03/23 09:57

hayato7

総合スコア1135

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

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

YutaEvol

2020/03/23 12:57

参考になりました。 ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問