※ ChatGPTを利用し、要約された質問です(原文:検索結果の分割表示時のSQLエラー)
検索結果の分割表示時のSQLエラー
このQ&Aのポイント
PHP, MySQLで検索システムを作り、検索結果の分割表示にエラーが生じる問題の原因と対策を解説します。
検索条件のSQL文内のNUM_SHOPSという部分を数値に変えると1ページ目はきちんと分割表示されますが2ページ目以降が全件表示されてしまいます。そして、NUM_SHOPSの部分をそのままにすると、SQLがエラーを起こします。
この問題は、SQL文が二重に入ってしまっていることが原因です。解決策としては、クエリ生成の段階でNUM_SHOPSの部分を直接置き換えることでエラーを回避することができます。
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);
}
お礼
ご指摘ありがとうございます。 アドバイス頂いたとおり改善することで解決しました。 見落としやすいミスでした。 きっちりこのようなミスをしないよう気をつけていきます。 ありがとうございます。