検索結果の分割表示時のSQLエラー

このQ&Aのポイント
  • PHP, MySQLで検索システムを作り、検索結果の分割表示にエラーが生じる問題の原因と対策を解説します。
  • 検索条件のSQL文内のNUM_SHOPSという部分を数値に変えると1ページ目はきちんと分割表示されますが2ページ目以降が全件表示されてしまいます。そして、NUM_SHOPSの部分をそのままにすると、SQLがエラーを起こします。
  • この問題は、SQL文が二重に入ってしまっていることが原因です。解決策としては、クエリ生成の段階でNUM_SHOPSの部分を直接置き換えることでエラーを回避することができます。
回答を見る
  • ベストアンサー

検索結果の分割表示時のSQLエラー

PHP, MySQLで検索システムを作り、検索結果の分割表示をしようとしています。 その際、SQL文にエラーが生じるのですが、原因が調べてみてもわかりません。 検索条件のSQL文内のNUM_SHOPSという部分を数値に変えると1ページ目はきちんと分割表示されますが2ページ目以降が全件表示されてしまいます。 そして、NUM_SHOPSの部分をそのままにすると、SQLがエラーを起こします。var_dumpで$queryを確認すると、SQL文が二重に入ってしまっているのですが、どうしてこのような現象が起きるのかがいまいちわかりません。 アドバイス、ご指摘等いただけないでしょうか。 よろしくお願い致します。 以下に該当箇所のコードを記載します。 【result.php】 <?php require_once('config.php'); require_once('functions.php'); connectDb(); if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { $page = (int)$_GET['page']; } else { $page = 1; } $offset = NUM_SHOPS * ($page - 1); //クエリ生成 $query = "SELECT * FROM テーブル名"; //検索条件抽出 $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; } if (count($where) <> 0) { $query .= "limit " . $offset . ", NUM_SHOPS" ; } var_dump($query); //Result $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); //検索結果件数カウント $query = "SELECT COUNT(id) FROM テーブル名"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC'; } $total = mysql_result(mysql_query($query), 0); $from = $offset + 1; $to = ($offset + NUM_SHOPS) < $total ? ($offset + NUM_SHOPS) : $total; ?> 【config.php】 <?php define('DB_HOST', '*************'); define('DB_USER', '*************'); define('DB_PASSWORD', '*************'); define('DB_NAME', '*************'); //ページごとのショップ数 define('NUM_SHOPS', 10); //エラー表示 error_reporting(E_ALL & ~E_NOTICE); 【functions.php】 <?php function connectDb() { mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die("can not connect to DB:".mysql_error()); mysql_select_db(DB_NAME) or die("can not select DB: ".mysql_error()); } function h($s) { return htmlspecialchars($s); }

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5067/13241)
回答No.1

定数はダブルコーテーションで囲まれた文字列内で変数のように展開されませんので、 $query .= "limit " . $offset . ", NUM_SHOPS" ; は $query .= "limit " . $offset . ", " . NUM_SHOPS; にしないといけませんね。

lolololol
質問者

お礼

ご指摘ありがとうございます。 アドバイス頂いたとおり改善することで解決しました。 見落としやすいミスでした。 きっちりこのようなミスをしないよう気をつけていきます。 ありがとうございます。

関連するQ&A

  • ページング実装で2ページ目以降が全件表示してしまう

    検索システムの検索結果を分割表示する仕組みを作っているのですが、1ページ目は問題無く思った通りに表示されます。 しかし、2ページ目以降はすべて全件表示してしまいます。 「◯件中△件表示」というのは正常に動作しています。 いろいろ試行錯誤する中で、$queryの中身が2ページ目以降はwhere句等が外れてしまっているのが原因だということがわかりました。 じゃあ2ページ目以降にもきちんとそれらが反映されるように手直ししていこうということなのですが、どう対処していいかにつまづいています。 いろいろ情報を見ながら何度もチャレンジしているのですがうまくいきません。 2ページ目以降が全件表示ではなく検索結果として1ページ目の続きとして表示させるためにどうすればいいか、アドバイスをいただけないでしょうか。 よろしくお願い致します。 ※以下に今回の該当箇所のコードを記載します。 <?php $debug = false; //DB 接続 $url = "localhost"; $user = "DBユーザー名"; $pass = "DBパスワード"; $db = "DB名"; $link = mysql_connect($url,$user,$pass) or die("No Connected"); $sdb = mysql_select_db($db,$link) or die("No Connected"); if($debug) echo_r($_GET); mysql_set_charset('utf8'); //エラーチェック //リクエストメソッドチェック if($_SERVER["REQUEST_METHOD"] != "GET") { echo "Error: invalid method"; exit(); } define('NUM_SHOPS', 10); error_reporting(E_ALL & ~E_NOTICE); if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) { $page = (int)$_GET['page']; } else { $page = 1; } $offset = NUM_SHOPS * ($page - 1); //クエリ生成 $query = "SELECT * FROM テーブル名"; //検索条件抽出 $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; } if (count($where) <> 0) { $query .= "limit " . $offset . ", " . NUM_SHOPS; } //Result $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); $num_rows = mysql_num_rows($result); //検索結果件数カウント $query = "SELECT COUNT(id) FROM テーブル名"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC'; } $total = mysql_result(mysql_query($query), 0); $from = $offset + 1; $to = ($offset + NUM_SHOPS) < $total ? ($offset + NUM_SHOPS) : $total; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> </head> <body> <!--検索結果表示画面始まり--> ~~~~~省略~~~~~ <!--検索結果表示画面終わり--> <!--以下、ページリンク--> <p> <?php if ($page > 1) : ?> <a href="?page=<?php echo $page - 1; ?>">前</a> <?php endif; ?> <?php for ($i = 1; $i <= ceil($total / NUM_SHOPS); $i++) : ?> <?php if ($page == $i) : ?> <strong><?php echo $i; ?></strong> <?php else : ?> <a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a> <?php endif; ?> <?php endfor; ?> <?php if ($page < ceil($total / NUM_SHOPS)) : ?> <a href="?page=<?php echo $page + 1; ?>">次</a> <?php endif; ?> </p> </body> </html>

    • 締切済み
    • PHP
  • SQLエラー

    検索システムの検索結果の分割をしようとしています。 しかしどうしてもSQL文にエラーがでてしまいます。 SELECT * FROM shops where (area='◯◯◯') ORDER BY id DESC limit0, 10 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit0, 10' at line 1 該当するSQL文は以下になります。 $query = "SELECT * FROM shops"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; }   $query .= "limit" . $page_num*10 . ", 10" ; limit句の使い方等間違いはないのかなと思うのですが、いかがでしょうか? アドバイスご教示いただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • 検索結果件数を取りたいです。

    環境は、php + mysqlで作ってます。 DBのテーブルに格納されている文字列をセレクト文で取り出して 対象件数が何個あるか知りたいです。 DBのテーブルに格納されている文字列はURLの文字列が入ってます。 例えば http://www.yahoo.com/ 確認のため、予め $obj = "http://www.yahoo.com/"; として、DBに入っているデータを書いておいて以下を実行しました。 $sql="select * from geturl where url=".$obj; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo $num; 結果: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/~~ といったエラーが出てしまいました。。。 今度は、予め数字を入れておいて実行してみました。 入れた文字は「123」です。 $obj = "123"; $sql="select * from geturl where url=".$obj; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo $num; 結果:正しく対象件数がブラウザに表示されてました。 数字だと正しく処理されて、英文字だとエラーになる原因がわかりません。。 アドバイスいただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql内データ検索結果の表示順について

    mysql内のデータを条件検索する時、検索結果の表示順を指定します。 新着順(id降順)で指定する場合のエラーについてアドバイスをいただけないでしょうか。 例えば、DB内データを降順で全件表示する場合は、 $query = "SELECT * FROM テーブル名 ORDER BY id DESC"; とすることでできると思います。 そこで、条件検索で結果表示をする場合は、上記の通りにしてもエラーが発生します。これについてのコードは以下のような感じです。 $query = "SELECT * FROM テーブル名 ORDER BY id DESC"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where); } これは、ORDER BY id DESCを書く位置が悪いのでしょうか? order by句は$query = select ~~~のあとに付けるという認識だったのですが、場合によって間違いとなるということなのでしょうか。 アドバイスをいただければ幸いです。

    • 締切済み
    • PHP
  • PHPの簡易データ検索プログラムを書いていますがページャーを使ったデー

    PHPの簡易データ検索プログラムを書いていますがページャーを使ったデータ連動でうまくいかないところがあります。問題は1のデータ数取得がどのように2回(カウント+本検索)クエリを投げれば良いか判りません。どうかご教授いただきますようお願いします。 <?php require_once "./rank/config.php"; require_once("Pager/Pager.php"); //【1】カウント用データベースに接続 $link = mysql_connect($server, $usr, $pass); $db = mysql_select_db($mydb, $link); $query = "SELECT COUNT(*) FROM detail WHERE category = '".$ID."'"; $count = mysql_query($query); //【1】データ数の取得 $limit = $count; $page = empty($_GET['p']) ? 1: $_GET['p']; $offset = ($page - 1) * $limit; // クエリ条件部分 $query = "SELECT * FROM detail"; $query .= " where 1"; $query .= " and category = '".$ID."'"; $query .= " limit {$limit} offset {$offset}"; $flag = true; //MySQLデータベースに接続 if(!$link = mysql_connect($server, $usr, $pass)){ $flag = false; } //データベース選択 if(!$db = mysql_select_db($mydb, $link)){ $flag = false; } //lolipop用 mysql_set_charset("utf8"); //クエリ実行 if(!$result = mysql_query($query)){ $flag = false; } if(mysql_num_rows($result)==0){ echo 'データ件数は0件です'; } $rows = mysql_num_rows($result); if ($flag == true){ //メイン出力部 while($row = mysql_fetch_array($result,MYSQL_ASSOC)) { $list[] = array(category =>$row["category"],area=>$row["area"]); } }else{ echo 'データベース接続エラー'; } echo "<b>", $rows, "</b>件HITしました<br />\n"; $params = array( 'mode' => 'sliding', 'perPage' => $limit, 'itemData' => $list, 'firstPagePre'=>'=', "firstPageText"=>"TOP", "firstPagePost"=>"=", "lastPagePre"=>"=", "lastPageText"=>"LAST", "lastPagePost"=>"=", ); $pager = & Pager::factory($params); $navi = $pager->getLinks(); print($pager->numItems()."件中<br/>"); $scope = $pager->getOffsetByPageId(); print($scope['0']."件目から".$scope['1']."件目を表示 <br/>"); $ary = $pager->getPageData(); foreach ($ary AS $key => $value) { echo "<br>□1<br>".$value["category"]."<br>"; echo "□2<br>".$value["area"]."<br>"; echo "<hr>"; } echo $navi['all']; //SQLの解放 mysql_free_result($result); mysql_close($link); ?>

    • 締切済み
    • PHP
  • PHP5 DB問い合わせ時のエラーについて

    PHP5について質問です。 よろしくお願いします!! 下記のソースでDBへ問い合わせするとエラーがでます。 $this->dbConn=DB::connect("mysql://root:@localhost/a_db"); $this->link=mysql_connect("localhost","root","") or die("MSQLの接続に失敗"); $this->mysql=mysql_select_db(a_db) or die("データベースとの接続に失敗"); $this->query= "select * from customer_table01"; var_dump($this->query); $this->result=mysql_query($this->query) or die("クエリーを実行できず"); $this->rows=mysql_num_rows($this->result); $this->if($rows == 0 ){ print ("該当するデータがなし"); }else{ } エラー内容 Parse error: syntax error, unexpected '{' in C:\xampp\htdocs\y\baseClass.php on line 56 56行目とは、$this->if($rows == 0 ){ の部分です

    • ベストアンサー
    • PHP
  • DBで検索結果に該当するデータがなかった場合

     GETで取得したナンバーを元にDBを検索し、該当するデータがなければその旨を表示したいのですが、以下のソースでは「該当する記事はありません。」が出力されません。  else以降(データがあった場合)の処理は正常に行われているようなので、if文の最初の条件指定が間違ってるのかと思うのですが、PHPマニュアルにも同じ風にしか書いてなかったので「?」状態です。試しに一度if(!isset($result))と書いてみたんですがやはりダメでした。  どこを直せばいいのか、アドバイスをお願いいたします。 /////////////////////////////////////////////////////////// $conn = my_pg_connect(); $num=$_GET['num']; if(!isset($num)){ $result_html="<p>不正なアクセスです。</p>"; }else{ $sql = "select * from testtable where num='{$num}'"; $result = pg_query($conn,$sql); if(!$result){ $result_html="<p>該当する記事はありません。</p>"; }else{ (データがあった場合はHTMLとして書き出し) } } (後略)

    • ベストアンサー
    • PHP
  • mysql sqlエラー

    先ほども質問したのですが再度質問させていただきます mysql limitページ分割を行っていてエラーは消せたのですが今度 SQLエラーになり出来ません 前の人が質問したのを参考にしてつくったのですがうまくいかず困っています 検索結果を10件ずつ表示して googleみたいに 1l 2l 3 みたいな感じやりたいです <body> <?php error_reporting(E_ALL ^ E_NOTICE); //データベースに接続 if (!$con = mysql_connect("localhost", "root", "admin")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("db_test", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select * from tbl_test where (氏名 LIKE '%{$_GET['name']}%') or (住所 LIKE '%{$_GET['name']}%')"; $sql = "limit" . $page * 10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border=1>" ; echo "<tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr>" ; while($row = mysql_fetch_array($res)){ $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td> </tr>"; //検索条件に該当する全データの件数取得 $sql = "select count(*) from tbl_test " ; $sql = "where (氏名 LIKE '%{$_POST['name']}%') or (住所 LIKE '%{$_POST['name']}%')"; if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } $row = mysql_fetch_array($res) ; $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) echo ceil($cnt / 10), "ページの中の", $page + 1, "ページ目を表示<br>" ; //前の10件 if ($page_num != 0) { echo "<a href = find.php?name=".$name. ". $page -1.>" ; echo "&lt 前の10件"; } //次の10件 if (($page_num + 1)*10 < $cnt) { echo "<a href = find.php?name=".$name. ". $page +1.>" ; echo " 次の10件 &g</a>t" ; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; } ?> </body> </html>

    • ベストアンサー
    • MySQL
  • mysql内データを降順件数指定表示

    タイトル通り、mysql内のデータを降順で件数指定して表示しようとしていますが、 どうしてもうまくいきません。 var_dumpでチェックしても問題ないように思われるのですが、うまくいかないということで見落としているミスの箇所があると思われるのですが、つまづいてしまいます。 以下にコードを載せますので、どなたかアドバイスをいただけないでしょうか。 <?php $debug = false; //DB 接続 $url = "localhost"; $user = "ユーザー名"; $pass = "パスワード"; $db = "DB名"; $link = mysql_connect($url,$user,$pass) or die("No Connected"); $sdb = mysql_select_db($db,$link) or die("No Connected"); if($debug) echo_r($_GET); mysql_set_charset('utf8'); //エラーチェック //リクエストメソッドチェック if($_SERVER["REQUEST_METHOD"] != "GET") { echo "Error: invalid method"; exit(); } //クエリ生成 $query = "SELECT * FROM shops ORDER BY id DESC limit 4"; $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); $num_rows = mysql_num_rows($result); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>新着情報</title> </head> <body> <p>場所:<?php echo $row['area']; ?></p> <p>店名:<?php echo $row['name']; ?></p> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう