電子書籍の厳選無料作品が豊富!

検索システムの検索結果を分割表示する仕組みを作っているのですが、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>

A 回答 (2件)

いろいろ突っ込みどころ満載過ぎるソースなんだけど


・非推奨のmysql関数を使っている。
現在はmysqliやPDOを使うことが推奨されている。
PHPの公式のリファレンスマニュアルすら読まない無能?

・今時プレースホルダを使わずにエスケープ処理を使っている

・変数の存在チェックすらしない?isset()すらせずにerror_reportingでごまかすという非常識ソース。
>error_reporting(E_ALL & ~E_NOTICE);
>if (preg_match('/^[1-9][0-9]*$/', $_GET['page'])) {
>$page = (int)$_GET['page'];
>} else {
>$page = 1;
>}
などなど
    • good
    • 0
この回答へのお礼

厳しいご指摘ありがとうございます。
指摘して頂いた点一つ一つ見なおしてみます。

お礼日時:2012/12/10 04:30

PHP自体は知らないので間違ってるかもしれないですが、次ページへのリンクにareaがセットされていない(URLパラメータに含まれていない)ために、「if (count($where) <> 0) { ... }」の部分の処理が飛ばされている(whereもlimitも追加されない)のではないでしょうか。

    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
参考にさせていただきます。

お礼日時:2012/12/10 04:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!