• 締切済み
  • すぐに回答を!

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件ヒットしました」と表示され、その上[次ヘ]をクリック しても「該当するデータはありません」と表示されてしまいます。ちなみにエラー等は出ません。私が書いた上のコードは私なりに色々な参考ページを 参照してのものなのですが。どなたか、上のコードでおかしい箇所などご指摘頂けましたら、幸いでございます。どうぞアドバイスの程よろしくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数1498
  • ありがとう数19

みんなの回答

  • 回答No.6
  • yambejp
  • ベストアンサー率51% (3827/7415)

それは申し訳ないことをしました。 emptyは値が0の場合、カラと判断してしまいます。 ちょっと工夫が必要でした。 if(!empty($age_min) and !empty($age_max)) の箇所を if(is_numeric($age_min) and is_numeric($age_max)) としてみてはどうでしょうか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

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様だったら、もっと素晴らしい方法がおありだと思いますが、何卒ご吟味も程よろしくお願い致します。

関連する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 * from search where name like '%$name%' and price between '$price_min' and '$price_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件ヒットしました」と表示され、その上[次ヘ]をクリックしても「該当するデータはありません」と表示されてしまいます。ちなみにエラー等は出ません。私が書いた上のコードは私なりに色々な参考ページを参照してのものなのですが。 どなたか、上のコードでおかしい箇所などご指摘頂けましたら、幸いでございます。どうぞアドバイスの程よろしくお願い致します。

  • mysql>PHPにデータ表示、10件ごとにページ分割

    はじめまして、PHP勉強中の初心者です。。 MYSQLから取り出したデータを件数でページ分割したいのですが、 うまくきません。。 環境:eclipse3.5、mysql5.0、php5.0、xampp (phpで、sql接続、select * from でデータは表示は確認できてます)。。 ソースは↓です。。(初心者なもので不備がればすみません)。。 eclipse上では if (($page_num+1)*10<$cnt) {}でエラーで表示されます。。 どなたかご存知の方いましたら、教えていただけないでしょうか? <!--kensaku.html--> <html> <body> <form action ="kensaku.php" method="post">    名前:<input type="text" name="nm">    年齢:<input type="hidden" name="page_num" value="0">    <input type="submit" name="exec" value="検索"> </form> </body> </html> //kensaku.php ソース <html> <body> <? $nm=$_POST['nm']; $page_num=$_POST['page_num']; //データベースに接続 if (!$conn =mysql_connect("","user","PASS")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("table", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select id,name from table " ; $sql.= "where name like '%$nm% ' order by id " ; $sql.="limit" . $page_num * 10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border=1>" ; echo "<tr><td>id</td><td>name</td></tr>" ; while($row = mysql_fetch_array($res)){ echo "<tr>" ; echo "<td>" . $row["id"] . "</td>" ; echo "<td>" . $row["name"] . "</td>" ; echo "</tr>" ; } echo "</table>" ; //検索条件に該当する全データの件数取得 $sql = "select count(*) from member " ; $sql.="where name like '% $nm % ' order by id " ; 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_num + 1, "ページ目を表示<br>"; //前の10件 if ($page_num !=0) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num -1..">"; echo "&lt 前の10件"; } //次の10件.--ここからエラー行ですが、、解決策がわかりません。。 if (($page_num+1)*10<$cnt) { echo "<a href = kensaku.php?nm=".$nm.",".$page_num +1..">"; echo " 次の10件 &g</a>t"; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </body> </html> すみませんが、ご存知の方いましたら、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPとMysqlのページ分割表示について

    以前こちらで質問させて頂きまして htmlの検索フォームから入力した情報をデータベースから引っ張ってきて 表示するまでは出来たのですが、表示制限を10個にして、次のページ、前のページと移動させるようなシステムにしたいのですが、うまくいきません(エラーが出てしまいます) どうか、お力をお貸し願えないでしょうか。 search.html <html> <head><title>検索</title></head> <body> <form action="/search/"method="post"> /*page_numを入れた*/ <input type="hidden" name="page_num" value="0"> <li>会社名</li> <li><input type="text"name="name"></li> <li>電話番号</li> <input type="text"name="phone" maxlength="11"> <input type="submit" name="submit" value="検索"> </body> </html> index.php(データベースから情報を引っ張り出す) <?php $host="localhost"; if(!$conn=mysql_connect($host,"usr","passwd")){ die("データベース認証エラー.<br />"); } mysql_select_db("usr",$conn); $condition=""; if(isset($_POST["name"])&&($_POST["name"]!="")){ $name=mysql_real_escape_string($_POST["name"]); $name=str_replace("%","\%",$name); $condition="WHERE name LIKE \"%".$name."%\""; } if(isset($_POST["phone"])&&($_POST['phone']!="")){ $phone=mysql_real_escape_string($_POST["phone"]); $phone=str_replace("%","\%",$phone); if($condition==""){ $condition="WHERE phone LIKE \"%".$phone."%\""; }else{ $condition.="AND phone LIKE \"%".$phone."%\""; } } $tmp=$page_num*10; $sql="SELECT * FROM table".$condition."ORDER BY id limit".$tmp.",10"; while($row=mysql_fetch_array($res)){ print("<table border=\"1\">"); print("<tr><td>会社名</td><td>電話番号</td></tr>"); print("<tr>"); print("<td>".$row['name']."</td>"); print("<td>".$row['phone']."</td>"); print("</tr>"); print("</table>"); } $cnt=$row[0]; //ページ表示 if(!$cnt>10){ echo ceil($cnt/10), "ページの中の",$page_num+1,"ページ目を表示<br>"; } //前の10件 if ($page_num!=0){ echo "<a href=index.php?name=",$name,".$page_num -1.">"; echo "&lt</a>; echo "前の10件"; } //次の10件 if (($page_num+1)*10<$cnt){ echo "<a href=index.php?name=",$name,".$page_num +1.">"; echo "次の10件"; echo "&g</a>t"; } mysql_free_result($res); //データベースから切断 mysql_close($conn); ?> ちなみにエラーが出ている行はここの //前の10件 if ($page_num!=0){ echo "<a href=index.php?name=",$name,".$page_num -1.">"; echo "&lt</a>; echo "前の10件"; } >>echo "&lt</a>; この部分がエラーになっています。

    • ベストアンサー
    • PHP
  • 回答No.5
  • yambejp
  • ベストアンサー率51% (3827/7415)

以下をためしてください。 //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>"; ?>

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

  • 回答No.4
  • yambejp
  • ベストアンサー率51% (3827/7415)

>ちなみに「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>"); 回答を一度よく噛み砕いてご自身なりに理解なさることをオススメします。

共感・感謝の気持ちを伝えよう!

質問者からの補足

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でつなぐ } ?>

  • 回答No.3
  • yambejp
  • ベストアンサー率51% (3827/7415)

いや、だから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;」として表示すれば 渡ってないがわかるとおもいますよ

共感・感謝の気持ちを伝えよう!

質問者からの補足

yambejp様、夜遅くまでありがとうございます。 >実際にご自身の$sqlのデータを「print $sql;」として表示すれば 渡ってないがわかるとおもいますよ ご指摘通り、渡っていないのが解りました。 [次ヘ]リンクをクリックしただけでは「form.html」の値が引き継がれていないという意味ですよね。「form.html」の値を引き継ぐ為には、どういう記述をすれば良いのでしょうか?それが過去の質問を含めて書いてなかったもので、申し訳ございません。 ちなみに「method=post」で送信しています。 何卒よろしくお願いします。

  • 回答No.2
  • yambejp
  • ベストアンサー率51% (3827/7415)

「次へ」の件は、前回のものとはまったく次元の違う問題点です。 name,age_min,age_maxなどの値が引き継がれていないからでしょうね。 そもそもform.htmlから受け渡しはなんのパース処理もいれてないのでしょうか? セキュリティ対策は別途いれるとして最低限 $name=$_REQUEST["name"]; $age_min=$_REQUEST["age_min"]; $age_max=$_REQUEST["age_max"]; のような処理はいれてデータをとっておき、 次へのurlにパラメータを渡してやらないと、次のページに渡りません。 もしくはセッションをつかったデータの継承を行うのも現実的です。

共感・感謝の気持ちを伝えよう!

質問者からの補足

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>"); }

  • 回答No.1
  • yambejp
  • ベストアンサー率51% (3827/7415)

前回の質問を削除依頼しているということですので、こちらに書きます。 なぜ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)){ ・・・ }

共感・感謝の気持ちを伝えよう!

質問者からの補足

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>"); } ?>

関連するQ&A

  • MySQLからのデータを「Pager」を使って分割表示する

    はじめまして。PHPとMySQLとPEARのPagerを使った質問なのですが、過去レス等を参考にしながらやってみました。 「form.html」から社員の年齢の最低と最高を入力し、それを「search.php」にgetで渡し、ヒットしたデータの名前と年齢を表示したいのです。 データが多いのでページを1ページに何件かずつ分けて表示したいのですが、「Pager」を使ったやりかたを以下のように書いてみました。 どうしても「Pager」を使ってやってみたいのですが、うまくいきません。 MySQL には(id ,name ,age の3カラムのデータが格納されています) form.html---------------------------------- <html> <head> <title>社員の名前と年齢について</title> </head> <body> <form method="get" action="search.php"> <input type="text" name="age_min"> 歳 ~ <input type="text" name="age_max" > 歳 <input type="submit" name="submit" value="検索"> </form> </body> </html> ---------------------------------------------- search.php--------------------------------------- <html> <head> <title>社員の名前と年齢について</title> </head> <body> <? //ここから http://oshiete1.goo.ne.jp/qa4155006.htmlを参考 $search=""; $age_min=$_REQUEST["age_min"]; $age_max=$_REQUEST["age_max"]; if(is_numeric($age_min) and is_numeric($age_max)) $search.=($search==""?"":"&")."age_min={$age_min}&age_max={$age_max}"; //ここまで http://oshiete1.goo.ne.jp/qa4155006.htmlを参考 //DB接続 require_once ('Pager/Pager.php'); $conn = mysql_connect ("サーバー名", "ユーザー名", "パスワード") or die ('接続できませんでした'); mysql_select_db ("search",$conn); //MySQLのクライアントの文字コードをsjisに設定 mysql_query("SET NAMES sjis") or die("can not SET NAMES sjis"); $sql_1= mysql_query("select count(*) as max from search where age between '$age_min' and '$age_max'"); $row1 = mysql_fetch_array($sql_1); if($row1[max] == 0) $message = "該当者なし"; else $message = $row1["max"] . "人ヒット"; $row1_max = $row1["max"]; echo "検索結果<br>"; echo "$message"; $sql_2= mysql_query("select name,age from search where age between '$age_min' and '$age_max'"); $row2 = mysql_fetch_array($sql_2); //Pagerの導入 $params = array( 'itemData' => $row2, 'mode' => 'Jumping', 'perPage' => 10, 'delta' => 6, 'totalItems' => $row1_max ); //Pagerのインスタンスを生成 $pager = & Pager::factory($params); $links = $pager->getLinks(); $data = $pager->getPageData(); $c_pager = $pager->getCurrentPageID(); $e_pager= $pager->numPages(); print $data["all"]; print $links["all"]; ?> </body> </html> ------------------------------------------------------------------- ページ分割しなければ、「Pager」を使わずに、上のデータ表示箇所を while($row2 = mysql_fetch_array($sql_2)){ echo "<table border='1' cellpadding='0' cellspacing='0'>"; echo "<tr>"; echo "<td>".$row2["name"]."</td>"; echo "<td>".$row2['age']."</td>"; echo "</tr>"; echo "</table>"; } みたいな感じで書き換えればうまく表示されるのですが、「Pager」を使う場合は $data = $pager->getPageData(); でページのデータを返してくれると書いてあったもので、使ってみました。おそらく、 (1)'itemData' => $row2, (2)$data = $pager->getPageData(); (3)print $data["all"]; の3箇所あたりがおかしいかと思っております。どうかよろしくお願いします。

    • 締切済み
    • PHP
  • MYSQL→PHP→10件表示

    現在phpを勉強しているのですがどうしても分からないことがあり、 質問をさせて頂きました。 PHPとMYSQLを使い、プルダウンメニューから検索した結果を 10件表示をしていきたいのですが、どうしてもうまくいかず混乱しております。 どのなたかご存知の方、お伺いしても宜しいでしょうか? $PAGESIZE = 10; //ここにmysqlに接続するスクリプト extract($_REQUEST); if (!isset($page)) { $page = 1; } if(!empty($fld)) { //$fldに検索したい住所が入ってます。 $local = addslashes($fld); $where .= "add1 = '$fld' && "; } if(!empty($where)) { $where = substr($where, 0, -3); $where = "WHERE " . $where; } $sql = "select count(*) as cnt from ○○ ". $where; $rst = mysql_query($sql); $row = mysql_fetch_array($rst); $tcnt = $row["cnt"]; mysql_free_result($rst); $totalpage = ceil($tcnt / $PAGESIZE); $pagehead = "<B>$tcnt 件みつかりました。 " . "[" . ($PAGESIZE * ($page - 1) + 1) . "-"; if ($page < $totalpage) { $pagehead .= ($PAGESIZE * $page) . "] を表示</B>"; } else { $pagehead .= "$tcnt] を表示</B>"; } $sql = "select * from ○○ ". $where. " order by renban desc limit " . $PAGESIZE * ($page - 1) . ", $PAGESIZE"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>登録データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo " "; echo $row["tourokubi"]; echo "<br />"; echo $row["people"]; echo " "; echo $row["add1"]; echo $row["add2"]; echo "-"; echo $row["sta"]; echo " "; echo $row["tel"]; echo $row["url"]; echo $row["sejitu"]; echo $row["pr"]; echo "</p><hr />"; } } ?> <?= $pagehead ?> <?php mysql_free_result($result); mysql_close; $param_local = rawurlencode($local); if ($page > 1) { $body .= "<A href = '$PHP_SELF?page=" . ($page - 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "前の $PAGESIZE 件</A>"; } if ($totalpage > 1 and $page < $totalpage) { $body .= "<A href = '$PHP_SELF?page=" . ($page + 1) . "&tcnt=$tcnt&local=". $param_local. $param_category. "'>" . "次の $PAGESIZE 件</A>"; } ?> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • MySQLでデータ表示

    MySQLでデータの表示を行っています 10件ずつ表示し、11件からは2ページ目に表示したいです サイトや本を見ながらデータ表示と次の10件のリンクは表示されるよう自力で頑張ったのですが 次の10件を押してもデータが変わらず1件目から10件目のままです どこが違うか教えてもらえますか。 どうコードを入力するか教えてくれたらありがたいです 一覧 ta2.phpです <html> <body> <form action = "ta2.php" method="GET"> <input type="hidden" name="page" value="0"> </form> <?php //データベースに接続 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" ; $sql.= " limit " . $page*10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border='1'> <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>"; header('content-type: text/html; charset="utf-8"'); if ($_GET) { // データがGETされていたら $page = isset($_GET['page']) ? $_GET['page'] : ''; // 取得 } } $sql = "select count(*) from tbl_test " ; 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 != 0) { echo "<a href = ta2.php?page= $page>" ; echo "&lt 前の10件" ; } //次の10件 if (($page + 1)*10 < $cnt) { echo "<a href = ta2.php?page= $page>" ; echo " 次の10件 " ; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </table> </body> </html>

    • ベストアンサー
    • MySQL
  • mysql limitページ分割

    前の人が質問したのを参考にしてつくったのですがうまくいかず困っています 検索結果を10件ずつ表示して googleみたいに 1l 2l 3 みたいな感じやりたいです <html> <body> <?php //データベースに接続 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 '%{$_POST['name']}%') or (住所 LIKE '%{$_POST['name']}%')"; $sql = "limit" . $page_num*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_num + 1, "ページ目を表示<br>" ; //前の10件 if ($page_num != 0) { echo "<a href = find.php?name=",$name, ", $page_num -1.">" ; echo "&lt 前の10件"; } //次の10件 if (($page_num + 1)*10 < $cnt) { echo "<a href = find.php?name=",$name, ", $page_num +1.">" ; echo " 次の10件 &g</a>t" ; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </body> </html> Parse error: syntax error, unexpected '前の10件' (T_STRING), expecting ',' or ';' というエラーが出て自分なりにバグを消しているのですがまだエラーが消えずに困っています

    • ベストアンサー
    • MySQL
  • MYSQL、PHPを使ってのデータとそのデータ数表示について

    よろしくお願いいたします。 このようなテーブルを組んでいます。  game        maker  マリオ      任天堂  カービィ     任天堂  FF        スクエニ   ドラクエ     スクエニ  ソニック     セガ このテーブルを使って、  任天堂(2)  スクエニ(3)  セガ(1) というように、メーカーが作ったゲームの数がカッコ内ででるように、makerを並べたいと思っています。 これはどのように組んだらよいのでしょうか? ちなみに、今はこのように組んで、(もちろんですが)失敗しています。。 ---------------------------------------------------------------- <?php mysql_connect('***','***','***'); mysql_select_db('***'); $sql = "select * from test"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo $row["maker"]; echo "<br />"; } } ?> ---------------------------------------------------------------- 初歩的な質問で大変恐縮ですが、よろしくお願いいたします!

    • ベストアンサー
    • PHP
  • PHP&MySQLデータ削除のスクリプトについて

    はじめまして。 PHP、MySQL始めたばかりの初心者です。 この度、自力で解決出来なく、質問させて頂く事にしました。 現在、MySQL入門以前という参考書を見ながらデータベースを作っていました。削除スクリプトで、どうしても躓いておりまして何が原因が分からずじまいです。下記が呼び出しスクリプトです --------------------------ここから--------------------------- <?php extract($_GET); mysql_connect('localhost','root','xxxxx'); mysql_select_db('xxxxx'); $sql = "select * from xxxxx where id = '{$id}'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "検索データが見つかりませんでした。"; exit; } else { while($row = mysql_fetch_array($result)){ echo "<h2> " , $row["title"] , "</h2>"; echo "<p><font size=\"-2\">#", $row["id"] ," ●",$row["tourokubi"] ,"</font></p>\n"; echo "<p><div class=\"hon\">", nl2br($row["honbun"]), "</div></p>"; echo "<div class=\"key\">keywords: ", nl2br($row["keyword"]), "</div>"; $ukid=$row["id"]; echo "<center> <a href=\"j_sakujo1.php?i=$ukid\"><img src=\"sakujobutton.gif\" alt=\"削除ボタン\" border=0></a>  <a href=\"correct.php?i=$ukid\"><img src=\"shuseibutton.gif\" alt=\"修正ボタン\" border=0></a>  </center>"; } } ?> --------------------------ここまで--------------------------- そして削除スクリプトです --------------------------ここから--------------------------- <?php extract($_POST); extract($_GET); mysql_connect('localhost','root','xxxxx'); mysql_select_db('xxxxx'); //MySQLレコード削除 if($kakunin=="確認"){ $sql = "delete from xxxxx where id = '{$id}'"; mysql_query($sql); echo "レコードの削除が完了しました"; exit; } //削除確認のためのフォーム $sql = "select * from xxxxx where id = '{$id}'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else{ while($row = mysql_fetch_array($result)){ echo "<p>このレコードを削除します。</p>"; echo "<form action = \"j_sakujo1.php\" method = \"post\">"; echo "<p>登録日:"; echo $row["tourokubi"]; echo "</p>"; echo "<p>タイトル:"; echo $row["title"]; echo "</p>"; echo "<p>本文:"; echo $row["honbun"]; echo "</p>"; echo "<p>キーワード:"; echo $row["keyword"]; echo "</p>"; echo "<input type = \"hidden\" name = \"ren\" value =\""; echo $row["renban"]; echo "\">"; echo "<p><input type=\"submit\" name=\"kakunin\" value=\"確認\">"; echo "<input type=\"reset\" value=\"リセット\"></p>"; echo "</form>"; } } ?> --------------------------ここまで--------------------------- これで削除ボタンを押すと「該当データがありません。」だけ表示され 登録してあるデータがまったく表示されません。 どこで間違ったのか、どうかご指南お願い致します。

  • mysql_query()の結果のメモリ開放について質問です。

    mysql_query()の結果のメモリ開放について質問です。 $res = mysql_query($qer); $num = mysql_num_rows($res); //メモリ開放 mysql_free_result($res); ↑を↓のようにした場合、メモリ開放は不可能なのでしょうか? $num = mysql_num_rows( mysql_query($qer) ); //メモリ開放 ??どうすれば?? ご回答宜しくお願い致します。

    • ベストアンサー
    • PHP
  • mysqlのスマートな書き方

    MySQL5.1とPHP5を使っています。 phpからmysqlのtestテーブルにアクセスして点数順に生徒名一覧を作成したいと思っています。 イメージとしてはこのような感じです。○○○は名前になります。 90点以上 ○○○ ○○○ 80点以上 ○○○ ○○○ ○○○ 70点以上 ○○○ ○○○ ○○○ ○○○ このような一覧を表示するため、下記のように作成したところ上記のような表示をしてくれました。 しかしながら、同じmysql_queryを何度も使っていますし、DBに負担が掛かりそうな気がします(本当に負荷があるのかは分かりませんが・・・) もっとスマートな書き方はないものでしょうか。 よろしくお願い致します。 echo "90点以上"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if ($res['tensu'] >= 90){ echo $res['name']; echo "<br>" ; } } echo "80点以上~90点未満"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if($res['tensu'] >= 80 and $res['tensu'] < 90 ){ echo $res['name']; echo "<br>" ; } } echo "70点以上~80点未満"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if($res['tensu'] >= 70 and $res['tensu'] < 80 ){ echo $res['name']; echo "<br>" ; } }

    • ベストアンサー
    • MySQL
  • PHPで同じページに似た内容のデータベースを表示

    PHPで同じページに同じデータベース(table)から別の条件でリストを表示させています。 もっと簡単でスマートな方法はないか、ご質問させていただきます。 【表示例】 <鈴木さん> 鈴木たろう 090-0000-0000 鈴木まさゆき 080-0000-0000 鈴木あきこ 03-0000-0000 <佐藤さん> 佐藤まさる 090-0000-0000 佐藤ともみ 080-0000-0000 佐藤けいこ 03-0000-0000 【PHP】 <?PHP $sql = "SELECT name, tel FROM table"; $sql .= " WHERE name LIKE '%鈴木%'"; $recordSet = mysql_query($sql); $rows = mysql_num_rows($recordSet); if($rows){ while($row = mysql_fetch_array($recordSet)) { $table .= "".$row['name'].""; $table .= " ".$row['tel']."<br>"; $table .= "\n"; } } echo "<鈴木さん><br>"; echo $table; mysql_free_result($recordSet); ?> <?PHP $sato_sql = "SELECT name, tel FROM table"; $sato_sql .= " WHERE name LIKE '%佐藤%'"; $sato_recordSet = mysql_query($sato_sql); $sato_rows = mysql_num_rows($sato_recordSet); if($sato_rows){ while($sato_row = mysql_fetch_array($sato_recordSet)) { $sato_table .= "".$sato_row['name'].""; $sato_table .= " ".$sato_row['tel']."<br>"; $sato_table .= "\n"; } } echo "<佐藤さん><br>"; echo $sato_table; mysql_free_result($sato_recordSet); ?> 上記のように、同じデータベース(table)から、 「鈴木さん」「佐藤さん」それぞれ条件を設定して表示していますが、 もっと簡単に短いコードで表示させることは可能でしょうか。 また、可能であれば、それを何と呼べば(検索すれば)宜しいのでしょうか。 お願い致します。

    • ベストアンサー
    • PHP
  • MysqlデータをJpgraphで表示できません

    Mysqlからデータを取り出してphpにてjpgraph画像を作りたい思っているのですが、 どうもできません。 phpコードはこちらになります。-------------------- <?php // データベースに接続 if(!$con=mysql_connect("127.0.0.1","root","xxxxx")){ echo"接続失敗"; exit; } // データベースを選択 if(!mysql_select_db("stock",$con)){ echo"database select error"; exit; } // SELECT文を実行 $sql="SELECT * FROM `tstock`" ; if(!$res=mysql_query($sql)){ echo "SQL error cannot connect mysql table<BR>"; exit; } // 全人数を格納 $all_num=0; while($row=mysql_fetch_array($res)){ $all_num+=$row["KO"]; } // データ取得位置を先頭に戻す if (!mysql_data_seek ($res, 0)){ echo "データ取得位置の移動失敗<BR>"; exit; } //折れ線グラフの表示 ------------------------- require_once("jpGraph/jpgraph.php"); require_once("jpGraph/jpgraph_line.php"); require_once("jpGraph/jpgraph_canvas.php"); // データ $xdata = array(); while($row=mysql_fetch_array($res)){ $ydata = array($row['KO']); } //グラフ作成 $graph = new Graph(600,500,"auto"); $graph->img->SetImgFormat("png"); $graph->SetScale("textlin"); $graph->title->Set("Line Plot Example"); $graph->xaxis->SetTickLabels($xdata); $graph->xaxis->title->Set("Month"); $graph->yaxis->title->Set("y-title"); $lp1 = new LinePlot($ydata); $lp1->SetLegend("Temperature"); $graph->Add($lp1); $graph->Stroke(); // 結果セットの解放 mysql_free_result($res); // データベースから切断 mysql_close($con); ?> --------------------------------------------------- グラフ用データを手入力 $ydata1 = array(83,19,20,40,50); とするとグラフが描けるのですが、 以下からMYSQLデータを引っ張るとエラーがでてグラフを 作ることができません。 $xdata = array(); while($row=mysql_fetch_array($res)){ $ydata = array($row['KO']); } ------------------------------------------------------- mysql接続確認は別のファイルにて試したところ ちゃんとHTML上で接続と、mysqlのデータを表示 することができます。 どうすれば折れ線グラフを描くことができるのでしょうか?

    • ベストアンサー
    • PHP