みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

MySQLからのデータをページに10件ずつ表示したい(訂正)

先ほど同じ質問をしたのですが、訂正箇所があったので改めて質問致します。管理人様、前回の質問を削除頂きますようお願い致します。

「名前のキーワード」と「年齢の幅」を入力するフォームから成る「form.html」とそのデータを受け取る「search.php」があります。
「search.php」は「名前」と「年齢」のデータが500件ほど格納されているデータベース名「database」からデータを取ってきて、10件ごとに表示を
したいのですが、うまく表示されません。私が書いた「form.html」と「search.php」は以下の通りです。

「form.html」----------------------------
<html>
<head>
<title>名前と年齢を検索するフォーム</title>
</head>
<body>
<form method="post" action="search.php">
<input type="text" name="name">
<input type="text" name="age_min"> 歳 ~ <input type="text" name="age_max" > 歳
<input type="submit" name="submit" value="検索">
</form>
</body>
</html>
----------------------------------------

「search.php」(SELECT文に名前には「あいまい検索」を、年齢には「BETWEEN」を使っています)---------------------------------

<?
if (isset($_GET['pos'])){
$offset = $_GET['pos'];
} else {
$offset = 0;
}
$ln = 10;

//DB接続
$conn = mysql_pconnect ("localhost", "username", "password")
or die ('接続できませんでした');
mysql_select_db ("database",$conn);

//クエリ生成
$sql = "select name,age from search where name like '%$name%' and age between '$age_min' and '$age_max' limit $offset,$ln";

$res = mysql_query($sql);
$num_rows = mysql_num_rows($res);

if($num_rows == 0) $message = "該当するデータはありません";
else $message = $num_rows . "件ヒットしました";

echo "検索結果<br>";
echo "$message";

//SELECTで取得したレコードを出力
while($row = mysql_fetch_array($res)){
echo "<table border='1' cellpadding='0' cellspacing='0'>";
echo "<tr>";
echo "<td>".$row[name]."</td>";
echo "<td>".$row[age]."</td>";
echo "</tr>";
echo "</table>";
}

//[前へ]リンクの設定
$next_pos = $offset-$ln;
if ($next_pos >= 0) {
echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[前へ]</a>");
}

//[次へ]リンクの設定
$next_pos =$offset+$ln;
$sql = "select name,age from search where name like '%$name%' and age between '$age_min' and '$age_max' limit $next_pos,$ln";
$res =mysql_query($sql);
if (mysql_num_rows($res) > 0) {
echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[次ヘ]</a><br>");
}
?>
-----------------------------------------------------------------------------------

うまく表示されないというのは具体的に言いますと、例えば 検索結果が何百件ある場合でも、いつも「10件ヒットしました」と表示され、その上[次ヘ]をクリック
しても「該当するデータはありません」と表示されてしまいます。ちなみにエラー等は出ません。私が書いた上のコードは私なりに色々な参考ページを
参照してのものなのですが。どなたか、上のコードでおかしい箇所などご指摘頂けましたら、幸いでございます。どうぞアドバイスの程よろしくお願い致します。

投稿日時 - 2008-07-06 10:23:09

QNo.4155006

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

19人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

それは申し訳ないことをしました。
emptyは値が0の場合、カラと判断してしまいます。
ちょっと工夫が必要でした。

if(!empty($age_min) and !empty($age_max))
の箇所を
if(is_numeric($age_min) and is_numeric($age_max))
としてみてはどうでしょうか?

投稿日時 - 2008-07-09 11:01:59

補足

yambejp様、返事が遅くなりまして申し訳ございません。私のやりたい事がバッチリ出来ました。ありがとうございます。そこで欲が出てしまって申し訳ないのですが、今度は入力エリアの未入力チェックと年齢を入れるエリアに数字以外の文字列を入れないようにチェックしたいのですが、以下をスクリプト文の最初に記述してみました。

if (empty($_REQUEST["name"])){
exit("名前を入力して下さい");
}
if (!is_numeric($_REQUEST["age_min"])){
exit("最低年齢を入力して下さい");
}
if (!is_numeric($_REQUEST["age_max"])){
exit("最高年齢を入力して下さい");
}

ここで、私がつまずいた箇所は、if文+「echo(名前を入力して下さい等)」だけですと、MySQLに接続されてしまうという事で、それを回避するために、「exit関数」を使ってみました。また前回教えていただいた「is_numeric」を使えば、年齢欄に未入力だけでなく数字以外の文字が入った場合もエラー文を出せるという事で使いました。この場合、記述の順番に処理されるので、警告文は段階的に表示されてしまうのですが、出来るものならば、例えば、名前と最高年齢が未入力だった場合、「名前を入力して下さい」「最高年齢を入力して下さい」という風に、同時に2つや3つの警告文を出したかったのですが。
yambejp様だったら、もっと素晴らしい方法がおありだと思いますが、何卒ご吟味も程よろしくお願い致します。

投稿日時 - 2008-07-10 20:44:28

ANo.5

以下をためしてください。

//form.htm
<html>
<head>
<title>名前と年齢を検索するフォーム</title>
</head>
<body>
<form method="get" action="search.php">
<input type="text" name="name">
<input type="text" name="age_min"> 歳 ~ <input type="text" name="age_max" > 歳
<input type="submit" name="submit" value="検索">
</form>
</body>
</html>

//search.php
<?
if (isset($_GET['pos'])) $offset = $_GET['pos'];
else $offset = 0;
$ln = 10;

$search="";
$name=$_REQUEST["name"];
if(!empty($name)) $search.=($search==""?"":"&")."name=".urlencode($name);
$age_min=$_REQUEST["age_min"];
$age_max=$_REQUEST["age_max"];
if(!empty($age_min) and !empty($age_max)) $search.=($search==""?"":"&")."age_min={$age_min}&age_max={$age_max}";

$sql_0 = "from search where name like '%{$name}%' and age between '$age_min' and '$age_max'";

$sql= "select count(*) as count {$sql_0}";
print $sql."<br>\n";

$sql= "select name,age {$sql_0} limit $offset,$ln";
print $sql."<br>\n";

$next_pos = $offset-$ln;
if ($next_pos >= 0) echo "<a href=\"{$_SERVER['PHP_SELF']}?pos={$next_pos}&{$search}\">[previous]</a>";

$next_pos =$offset+$ln;
echo "<a href= ".$_SERVER['PHP_SELF']."?pos={$next_pos}&{$search}>[next]</a><br>";

?>

投稿日時 - 2008-07-08 18:23:57

補足

yambejp様、本当にいつもありがとうございます。
yambejp様がご指摘して頂いたコードをそのまま組み合わせていた事を反省し、自分なりに、yambejp様のご回答をひとつひとつ、どういう意味があるのか調べて見ました。完全ではありませんが、勉強になりました。
そして色々と数値を当てはめて結果を確認していたのですが、なぜだめだったかがわかりました。それは「$age_min」の値に0(0歳)を入れて試していたためでした。「$age_min」の値を1以上にすれば、ばっちり「次へ」をクリックすると残りの件数が表示されます。「$age_min」の値が0の場合のみうまくいきません。これはMySQLのデータの型の方と関係があるのでしょうか?度々すみませんが、私も一生懸命調べてみますのでどうぞ、よろしくお願い致します。

投稿日時 - 2008-07-08 20:55:47

ANo.4

>ちなみに「method=post」で送信しています。

とありますが・・・

> echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[次ヘ]</a>");

って明らかにGETでデータを渡していますよね?
もしかしてそのあたりを無自覚でなさっているのでしょうか・・・
なので、GETで繋ぐか、セッションをつかうかのどちらかです。
(これも#2にかいたままなのですが)
セッションについてはPHPマニュアルのセッションの項を一度熟読ください。

http://www.php.net/manual/ja/refs.basic.session.php

GETでつなぐなら#3で拾った$searchの値を次へのurlに繋げるだけです。
echo("<a href='{$_SERVER['PHP_SELF']}?pos={$next_pos}&{$search}'>[次ヘ]</a>");

回答を一度よく噛み砕いてご自身なりに理解なさることをオススメします。

投稿日時 - 2008-07-07 00:53:39

補足

yambejp様、本当にお世話かけまして申し訳ございません。勉強不足を自覚しつつ、ご指摘通り、以下のように書き換えて見ました。
しかし、例えば、100件ヒットするはずのデータが10件表示されるまではOKなのですが、[次へ]をクリックするとやはり、「該当するデータはありません」と表示されて、残りの90件が表示されません。
ご指摘通りにやったつもりなのですが。どんなお叱りでも受けます。どうぞ、これに懲りずにご助言頂きますようお願い致します。
「form.html」----------------------------
<html>
<head>
<title>名前と年齢を検索するフォーム</title>
</head>
<body>
<form method="get" action="search.php">//ここを"get"に変更
<input type="text" name="name">
<input type="text" name="age_min"> 歳 ~ <input type="text" name="age_max" > 歳
<input type="submit" name="submit" value="検索">
</form>
</body>
</html>
----------------------------------------

「search.php」(SELECT文に名前には「あいまい検索」を、年齢には「BETWEEN」を使っています)---------------------------------

<?
if (isset($_GET['pos'])){
$offset = $_GET['pos'];
} else {
$offset = 0;
}
$ln = 10;

//DB接続
$conn = mysql_pconnect ("localhost", "username", "password")
or die ('接続できませんでした');
mysql_select_db ("database",$conn);

//クエリ生成
$sql = "select name,age from search where name like '%$name%' and age between '$age_min' and '$age_max' limit $offset,$ln";

$res = mysql_query($sql);
$num_rows = mysql_num_rows($res);

if($num_rows == 0) $message = "該当するデータはありません";
else $message = $num_rows . "件ヒットしました";

echo "検索結果<br>";
echo "$message";

//SELECTで取得したレコードを出力
while($row = mysql_fetch_array($res)){
echo "<table border='1' cellpadding='0' cellspacing='0'>";
echo "<tr>";
echo "<td>".$row[name]."</td>";
echo "<td>".$row[age]."</td>";
echo "</tr>";
echo "</table>";
}

$search="";//追加部分ここから
$name=$_REQUEST["name"];
if(!empty($name)) $search.=($search==""?"":"&")."name=".urlencode($name);
$age_min=$_REQUEST["age_min"];
$age_max=$_REQUEST["age_max"];
if(!empty($age_min) and !empty($age_max)) $search.=($search==""?"":"&")."age_min={$age_min}&age_max={$age_max}";//追加部分ここまで

//[前へ]リンクの設定
$next_pos = $offset-$ln;
if ($next_pos >= 0) {
echo("<a href='{$_SERVER['PHP_SELF']}?pos={$next_pos}&{$search}'>[前ヘ]</a>");//$searchの値をGETでつなぐ
}

//[次へ]リンクの設定
$next_pos =$offset+$ln;
$sql = "select name,age from search where name like '%$name%' and age between '$age_min' and '$age_max' limit $next_pos,$ln";
$res =mysql_query($sql);
if (mysql_num_rows($res) > 0) {
echo("<a href='{$_SERVER['PHP_SELF']}?pos={$next_pos}&{$search}'>[次ヘ]</a>");//$searchの値をGETでつなぐ
}
?>

投稿日時 - 2008-07-07 18:19:26

ANo.3

いや、だからgetで渡すなら、nameやage_min、age_maxの値を渡す・・・
って前回かいたままです

<?
$search="";
$name=$_REQUEST["name"];
if(!empty($name)) $search.=($search==""?"":"&")."name=".urlencode($name);
$age_min=$_REQUEST["age_min"];
$age_max=$_REQUEST["age_max"];
if(!empty($age_min) and !empty($age_max)) $search.=($search==""?"":"&")."age_min={$age_min}&age_max={$age_max}";
print $search;
?>
}

実際にご自身の$sqlのデータを「print $sql;」として表示すれば
渡ってないがわかるとおもいますよ

投稿日時 - 2008-07-06 23:49:35

補足

yambejp様、夜遅くまでありがとうございます。
>実際にご自身の$sqlのデータを「print $sql;」として表示すれば
渡ってないがわかるとおもいますよ
ご指摘通り、渡っていないのが解りました。

[次ヘ]リンクをクリックしただけでは「form.html」の値が引き継がれていないという意味ですよね。「form.html」の値を引き継ぐ為には、どういう記述をすれば良いのでしょうか?それが過去の質問を含めて書いてなかったもので、申し訳ございません。
ちなみに「method=post」で送信しています。
何卒よろしくお願いします。

投稿日時 - 2008-07-07 00:11:08

ANo.2

「次へ」の件は、前回のものとはまったく次元の違う問題点です。
name,age_min,age_maxなどの値が引き継がれていないからでしょうね。
そもそもform.htmlから受け渡しはなんのパース処理もいれてないのでしょうか?

セキュリティ対策は別途いれるとして最低限
$name=$_REQUEST["name"];
$age_min=$_REQUEST["age_min"];
$age_max=$_REQUEST["age_max"];
のような処理はいれてデータをとっておき、
次へのurlにパラメータを渡してやらないと、次のページに渡りません。

もしくはセッションをつかったデータの継承を行うのも現実的です。

投稿日時 - 2008-07-06 14:30:47

補足

yambejp様、ご返答ありがとうございます。
>「次へ」の件は、前回のものとはまったく次元の違う問題点です。

MySQLからのデータを分割表示する質問は過去の質問にかなりの件数があったのですが、この「1ページに○件ずつ表示する」事への具体的な回答がなく、ここ何週間か悩んでおります。

>$name=$_REQUEST["name"];
$age_min=$_REQUEST["age_min"];
$age_max=$_REQUEST["age_max"];
のような処理はいれてデータをとっておき、
次へのurlにパラメータを渡してやらないと、次のページに渡りません。

つまり、私が書いた以下のリンク設定の箇所に何らかの記述を追加すれば良いという事でしょうか?丸投げにするつもりはありませんが、よろしければ、具体的なコードを書いて頂けませんでしょうか?ヒントでも結構です。お忙しい中すみませんがよろしくお願いします。

//[前へ]リンクの設定
$next_pos = $offset-$ln;
if ($next_pos >= 0) {
echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[前へ]</a>");
}

//[次へ]リンクの設定
$next_pos =$offset+$ln;
$sql = "select name,age from search where name like '%$name%' and age between '$age_min' and '$age_max' limit $next_pos,$ln";
$res =mysql_query($sql);
if (mysql_num_rows($res) > 0) {
echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[次ヘ]</a><br>");
}

投稿日時 - 2008-07-06 16:32:35

ANo.1

前回の質問を削除依頼しているということですので、こちらに書きます。
なぜ10件しかヒットしないかは、limitで10件にしぼっているSQLで
行数を数えたら何件?という命題ですから10件になります。

やり方は2つ。
一つはlimitをつかわないで、mysql_num_rowで行数をひっぱれば
ただしい行数がえられ、whileで必要な部分だけ抜き出せばよいでしょう。
しかし使用しないデータを抽出するのは無駄がおおいためお勧めはできません。

もう一つは以下のように、limitをしないカウントでSQLを発行して、
実際のデータ抽出はlimitをつけてやるという2段形式
前回の回答者さんがやった方式ですね

$sql_0 = "from search where name like '%{$name}%' and age between '$age_min' and '$age_max'";

$sql= "select count(*) as count {$sql_0}";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$num_rows = $row["count"];

$sql= "select name,age {$sql_0} limit $offset,$ln";
$res = mysql_query($sql);
while($row = mysql_fetch_array($res)){
・・・
}

投稿日時 - 2008-07-06 13:18:21

補足

yambejp様、ご返答ありがとうございます。ご指摘通り、以下の通りに書き換えてみました。例えば、検索結果で100件あると想定される場合に、「100件ヒットしました」と表示され、表示数も1ページ目に10件しか表示されないので、その部分はOKなのですが、[次へ]をクリックすると、残りの90件が表示されず、「該当するデータはありません」と出てしまいます。やはり、リンク関連箇所の記述に問題があるのでしょうか?色々とお世話かけますが、何卒よろしくお願いします。

<?
if (isset($_GET['pos'])){
$offset = $_GET['pos'];
} else {
$offset = 0;
}
$ln = 10;

//DB接続
$conn = mysql_pconnect ("localhost", "username", "password")
or die ('接続できませんでした');
mysql_select_db ("database",$conn);

//クエリ生成
$sql_0 = "from search where name like '%{$name}%' and age between '$age_min' and '$age_max'";

$sql= "select count(*) as count {$sql_0}";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$num_rows = $row["count"];

if($num_rows == 0) $message = "該当するデータはありません";
else $message = $num_rows . "件ヒットしました";

echo "検索結果<br>";
echo "$message";

//SELECTで取得したレコードを出力
$sql= "select name,age {$sql_0} limit $offset,$ln";
$res = mysql_query($sql);

while($row = mysql_fetch_array($res)){
echo "<table border='1' cellpadding='0' cellspacing='0'>";
echo "<tr>";
echo "<td>".$row[name]."</td>";
echo "<td>".$row[age]."</td>";
echo "</tr>";
echo "</table>";
}

//[前へ]リンクの設定
$next_pos = $offset-$ln;
if ($next_pos >= 0) {
echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[前へ]</a>");
}

//[次へ]リンクの設定
$next_pos =$offset+$ln;
$sql = "select name,age from search where name like '%$name%' and age between '$age_min' and '$age_max' limit $next_pos,$ln";
$res =mysql_query($sql);
if (mysql_num_rows($res) > 0) {
echo("<a href= ".$_SERVER['PHP_SELF']."?pos=$next_pos>[次ヘ]</a><br>");
}
?>

投稿日時 - 2008-07-06 13:58:09

あなたにオススメの質問