• ベストアンサー

10件の表示がしたい

phpとMySQLでデータ検索システムを作っています それで、データの一覧表示画面で10件ずつ表示されようと思って、がんばっているのですが、どうやればいいか調べてもよくわかりません。 誰か教えてもらえないでしょうか 宜しくお願いします。

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

  • ベストアンサー
  • lesbrers
  • ベストアンサー率48% (23/47)
回答No.8

最後のページの判断は、少しアルゴリズム(そこまで大げさではないですが)の知識がいるので、知らないと出来ない類かも知れませんね。 もうソースを書いてもいいころだと思いますので、書きますが、どういう意味なのかよく吟味してください。 考え方に即したソースなので、「美しい」ソースではありませんが、理解はたやすいと思います。。 この前の思いつきが微妙に間違ってたところもあるので、訂正します。 あと、printの中は省略しました。 htmlの吐き出しで、間違ってる箇所がある気がするのですが、動けば問題ないです。 *************************************** //テーブルに保存されている全レコード数を、$record_amountに格納する。 //開始レコードを、$startatに格納する。 $endat = floor(($record_amount-1)/10)*10; /*↑この前間違ってた箇所。番号は0からで、レコードの数は自然数なので、これらの値は1ずれる。 レコード番号:01234567… レコードの数:12345678… 厳密には、$endatは 0($startatの初期値) + floor(($record_amount-1)/10)*10 $startat>=$endatのとき、エラー処理に抜けるようにすると安全 */ $next_view = $startat + 10; $priv_view = $startat - 10; if($startat == 0){   if($startat == $endat){     print "";    }else{     print "[next]";     } }else{   if($startat == $endat){     print "[priv]";   }else{     print "[priv][next]";   } } *************************************** コンピュータなんて、2つの値の大小比較、足し算、引き算、掛け算、余りを求める、これしかできません(うろ覚えですが)。これを高速で行ってるだけです。 よっぽど人間の頭の方がファジーで、高機能です。 だからこそ、プログラミングは「思い通り」にならないんですよ(笑)。 プログラミングは「頭が弱いくせに融通のきかない困った奴にさえ分かるように指示を出してやる」、くらい気楽に考えることをお勧めします。

KIKSD
質問者

お礼

ありがとうございます。おかげで無事完成させることができました。 また何かわからないところがあればお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (7)

  • lesbrers
  • ベストアンサー率48% (23/47)
回答No.7

ifの中の、論理式の演算子がおかしいですね。 比較演算子なので、「=」ではなく「==」です。 $amountと$lastが何を表しているかわからないので判断のしようがないのですが、インタープリタを通して(要はブラウザで実行する)ではなく、ソースを印刷して、紙の上で、変数に数字を与えながら、処理を追っていくと、どこで予期しない動きをするのかがわかります。 「$startatの初期値は"0"で、$amountはいくつだから、ここのifの中の処理を実行して、この状態で[次へ]がクリックされると、$startatと$amountの値がいくつになって…」 と、値を変えながら、何度も地道にやってみてください。 処理ロジックの設計スキルは、そのロジックのエラー除去を通してアップするといっても過言ではありません。 条件分岐の処理が苦手なようでしたら、簡単な論理学を学ばれることをお勧めします。 高校の教科書に載っているレベルで十分です。

KIKSD
質問者

お礼

また何度かif文を変えてやっているのですがどうしてもうまくいきません。(どうしても最後の部分では[次へ]が表示されてしまいます。) 最後の部分で[次へ]が表示されない、うまくいくif文の答えを教えてもらいたいのですが ぜひお願いします。

KIKSD
質問者

補足

あれから帰ってきていろいろif文をいじって どうにか最初のところでは、前が表示されなくなりました。 しかし、最後の部分では次へが表示されてしまいます。最後の部分はどうすればよいのでしょうか? したがif文です。 if($startat == 0){ $next_view = $startat+10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$next_view.".'>[次へ]</a>"."<br>"; }elseif($startat == $startat){ $priv_view = $startat-10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$priv_view.".'>[前へ]</a>"; $next_view = $startat+10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$next_view.".'>[次へ]</a>"."<br>"; }elseif($atartat == -0){ $priv_view = $startat-10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$priv_view.".'>[前へ]</a>"."<br>"; } よろしければ、参考になるif文を書いて教えてもらいたいのですが

すると、全ての回答が全文表示されます。
  • lesbrers
  • ベストアンサー率48% (23/47)
回答No.6

コンピュータというのは、一つの命題について0か1かしかわかりません。 言い換えると、コンピュータは、ある事柄を聞いたとき、「はい」か「いいえ」しか答えられません。 プログラムを思い通りに動かすためには、自分の実現したいことを、「はい」「いいえ」の組み合わせで表しきれなければいけません。 今回の目標は「今のページがどの位置かを知る」ということで、具体的に「○ページ目」という情報までは必要ではありません。 さて、「最初」「途中」「最後」を、それぞれを別個に判断すると、 (1)「最初?」で「いいえ」のとき、現在は「途中」か「最後」 (2)「途中?」で「いいえ」のとき、現在は「最初」か「最後」 (3)「最後?」で「いいえ」のとき、現在は「最初」か「途中」 と、「どっちなんだよ」という状況にが生まれます。 「やりたいこと全てを網羅できてない」ということです。 (1)~(3)を見たところ、一つの判断の後にもう一度判断が必要なようですよね。 (1)(2)(3)どれを使ってもいいのですが、素直に最初に「最初?」を判断する(1)を使います。 判断の流れは、 【1】「最初?」の問に対し、「はい」「いいえ」 のパターンを用意 【2】上の「はい」「いいえ」それぞれのパターン内に、「最後?」の問を設け、「はい」「いいえ」のパターンを用意 上の流れを枝分かれ図(樹形図)にしてみてください。 書いた樹形図を、if文を入れ子にすることで表せば、プログラムは最初の目標通りに動いてくれます。

KIKSD
質問者

お礼

ありがとうございます。がんばってやってみます。

KIKSD
質問者

補足

このようなif文になったのですが、エラーばかりで、 動きません。どこを直せばいいのでしょうか?したがif文です。 if($startat = $amount){ $next_view = $startat+10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$next_view.".'>[次へ]</a>"; }elseif($startat = $startat){ $priv_view = $startat-10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$priv_view.".'>[前へ]</a>"; $next_view = $startat+10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$next_view.".'>[次へ]</a>"; }elseif($atartat = $last){ $priv_view = $startat-10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$priv_view.".'>[前へ]</a>"; }

すると、全ての回答が全文表示されます。
回答No.5

最初のページ/途中のページ/最後のページという形で考えればいいのではないでしょうか。 $page=$_REQUEST[page];//どのページ? $next=$_REQUEST[page]+1;//次のページ $mae=$_REQUEST[page]-1;//前のページ $max=10;//ページの表示件数 $amount //トータル件数 最後のページは、 $saigo=$amount/$max; $last=ceil($saigo); //最初のページ <a href=$_SERVER[PHP_SELF]"."?page=$next>次のページ</a> //途中のページ <a href=$_SERVER[PHP_SELF]"."?page=$next>次のページ</a> <a href=$_SERVER[PHP_SELF]"."?page=$mae>前のページ</a> //最後のページ($page=$lastの場合) <a href=$_SERVER[PHP_SELF]"."?page=$mae>前のページ</a> 条件分岐は、 最初のページ($max < $amountの場合とその逆)/途中のページ/最後のページ($page=$lastの場合) 実際、これで問題なく動いています。

すると、全ての回答が全文表示されます。
  • lesbrers
  • ベストアンサー率48% (23/47)
回答No.4

どういうロジックを考えられましたか? 私は、  floor($record_amount/10)*10)  ※$record_amountは総レコード数 を使うことを思いつきました。 プログラミングは、処理をまず自然言語(日本語)で考えることがコツです。 「このときはこうして…あれ? じゃあこのときはどうすればいいんだ?」 みたいに、3歩進んで2歩下がる感じですね。 あとは、ひたすら言い換え、発想の転換です。 いきなりソースを書こうとはせず、まずは日本語で処理フローを考えてみてください。

KIKSD
質問者

補足

最初のページ/途中のページ/最後のページというふうにif文を作っているのですが、if文が悪いのかうまく動きません。うまく動くif文が思いつかずこまっております。 どのようなif文がいいのでしょうか

すると、全ての回答が全文表示されます。
  • lesbrers
  • ベストアンサー率48% (23/47)
回答No.3

php.iniのerror_reportingが、NOTICEも表示させるようになってるみたいですね。 エラーの内容は、 「その連想配列には、"startat"というキーはないよ」 という意味です。 最初に実行したときは、GET値を渡していません。 ので、$_REQUEST["startat"] という変数は定義されていません。 「$_REQUEST["startat"]という変数があると思ってプログラムを書くと、バグが出るよ」というお知らせをPHPが出してくれたわけです。 回避方法としては、 $startat = @is_null(... と、is_null関数の前に、エラー出力制御の@を付ける方法があります。

KIKSD
質問者

お礼

ありがとうございます、エラーがとれました 後ひとつ質問なのですが、[前へ][次へ]の条件分岐がうまくいきません。 できればいいサンプルというか条件分岐のやり方を教えてくれないでしょうか お願いします。

すると、全ての回答が全文表示されます。
  • lesbrers
  • ベストアンサー率48% (23/47)
回答No.2

#1で「クエリ」って書いたのは混乱のもとでしたね。すみません。 limit句は、select文にくっつけて使います。 「次へ」「前へ」機能をつけると仮定します。 ********************************************* $ln = 10; //↑一度に表示させるレコード数 $startat = is_null($_REQUEST["startat"])? 0 : $_REQUEST["startat"]; //↑どのレコードから始めるか、GET値で得る。 //GET値がなければ0から始める。 $SQL = "select * from kokyaku limit ".$startat.",".$ln; //↑limitはこのように使います。 $Res = mysql_query($SQL,$MyLink);  : (中略)  : print("</table>"); /* 移動ボタン このままだと、最初の10件のときでも[前へ]が表示され、最後の10件のときでも[次へ]が表示されていしまいます。 条件分岐で逃げてください。 */ $priv_view = $startat-10; $next_view = $startat+10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$priv_view.".'>[前へ]</a>"; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$next_view.".'>[次へ]</a>"; こまごました記述ミスが出るかもしれませんが、基本的にこの流れです。 かなりツブシが利く手法なので、これを機にマスターしてください。 ちなみに、 mysql_free_result mysql_close は、エラー発生時に逃げるときや、メモリー解放のために使うので、通常は記述する必要はありません。 (mysql_connectは、プログラム終了時、自動的に接続を切り、結果のメモリ領域を開放します)

KIKSD
質問者

お礼

ちなみに27行目のプログラムは$startat = is_null($_REQUEST["startat"])?です。

KIKSD
質問者

補足

申し訳ありません。 教えてもらったとうりやってみて if(!$MyLink = mysql_connect($Host,$User,$Pass)){ die("1:MySQL接続エラー!<br>"); } print("1:MySQLに接続できました<BR>"); if(!$selRes = mysql_select_db($Db,$MyLink)){ die("2:MySQLDB接続エラー!<br>"); } print("2:DBの選択に成功しました<BR><BR>"); ?> <html> <head> <meta http-equiv="Content-Type" Content="text/html;charset=Shift_JIS"> <title></title> </head> <body> <h4>顧客一覧表示画面</h4> <?php $ln=10; $startat = is_null($_REQUEST["startat"])? 0 : $_REQUEST["startat"]; $SQL = "select * from kokyaku limit ".$startat.",".$ln; $Res = mysql_query($SQL,$MyLink); print("<table border = \"1\">"); print("<tr>"); print("<td>"); print("NO"); print("</td>"); print("<td>"); print("名前"); print("</td>"); print("<td>"); print("郵便番号"); print("</td>"); print("<td>"); print("住所"); print("</td>"); print("<td>"); print("電話番号"); print("</td>"); print("<td>"); print("時刻"); print("</td>"); print("</tr>"); /***********/ while($Row = mysql_fetch_array($Res)){ print("<tr>"); print("<td>"); print($Row["kno"]."<BR>"); print("</td>"); print("<td>"); print($Row["kksei"]."<BR>"); print("</td>"); print("<td>"); print($Row["kyno"]."<BR>"); print("</td>"); print("<td>"); print($Row["kadd1"]."<BR>"); print("</td>"); print("<td>"); print($Row["ktel1"]."<BR>"); print("</td>"); print("<td>"); $year = substr($Row["kupd"],0,4); $month = substr($Row["kupd"],4,2); $day = substr($Row["kupd"],6,2); $hour = substr($Row["kupd"],8,2); $hun = substr($Row["kupd"],10,2); $byou = substr($Row["kupd"],12,2); print($year."/".$month."/".$day." ".$hour.":".$hun.":".$byou."<BR>"); print("</td>"); print("</tr>"); } print("</table>"); $priv_view = $startat-10; $next_view = $startat+10; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$priv_view.".'>[前へ]</a>"; print "<a href='".$_SERVER["PHP_SELF"]."?startat=".$next_view.".'>[次へ]</a>"; mysql_free_result($Res); mysql_close($MyLink); ?> </body> </html> このように打ち込んだところ10件表示ができるようになりましたが同時に Notice: Undefined index: startat in C:\phpdocs\mu21\k27\k21disp.php on line 27というエラーも出てしまいます。 対処の仕方がわからず考えておりますが、わかりません。 教えていただけないでしょうか

すると、全ての回答が全文表示されます。
  • lesbrers
  • ベストアンサー率48% (23/47)
回答No.1

得られるレコードの数を限定するクエリは、 LIMIT [startpoint], [lines] です。 [startpoint]は、取得開始位置で、最初のレコードを0行目と扱います。 [lines]は、何行取得するかで、今回の場合は、10です。 よくある「次へ」「前へ」は、[startpoint]を操作すれば実現できます。

KIKSD
質問者

補足

ご説明ありがとうございます、しかし、 いまいちどこをどうすればいいのかよくわかりません。 プログラムはこのようなものなのですが、 if(!$MyLink = mysql_connect($Host,$User,$Pass)){ die("1:MySQL接続エラー!<br>"); } print("1:MySQLに接続できました<BR>"); if(!$selRes = mysql_select_db($Db,$MyLink)){ die("2:MySQLDB接続エラー!<br>"); } print("2:DBの選択に成功しました<BR><BR>"); ?> <html> <head> <meta http-equiv="Content-Type" Content="text/html;charset=Shift_JIS"> <title></title> </head> <body> <h4>顧客一覧表示画面</h4> <?php /***********/ $SQL = "select * from kokyaku"; $Res = mysql_query($SQL,$MyLink); /***********/ print("<table border = \"1\">"); print("<tr>"); print("<td>"); print("NO"); print("</td>"); print("<td>"); print("名前"); print("</td>"); print("<td>"); print("郵便番号"); print("</td>"); print("<td>"); print("住所"); print("</td>"); print("<td>"); print("電話番号"); print("</td>"); print("<td>"); print("時刻"); print("</td>"); print("</tr>"); /***********/ while($Row = mysql_fetch_array($Res)){ print("<tr>"); print("<td>"); print($Row["kno"]."<BR>"); print("</td>"); print("<td>"); print($Row["kksei"]."<BR>"); print("</td>"); print("<td>"); print($Row["kyno"]."<BR>"); print("</td>"); print("<td>"); print($Row["kadd1"]."<BR>"); print("</td>"); print("<td>"); print($Row["ktel1"]."<BR>"); print("</td>"); print("<td>"); $year = substr($Row["kupd"],0,4); $month = substr($Row["kupd"],4,2); $day = substr($Row["kupd"],6,2); $hour = substr($Row["kupd"],8,2); $hun = substr($Row["kupd"],10,2); $byou = substr($Row["kupd"],12,2); print($year."/".$month."/".$day." ".$hour.":".$hun.":".$byou."<BR>"); print("</td>"); print("</tr>"); } print("</table>"); /***********/ mysql_free_result($Res); mysql_close($MyLink); ?> </body> </html> このプログラムをどう改造すればいいのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A