一定件数ずつレコードを表示するスクリプトの書き方 - PHPプロ!Q&A掲示板

674

  • 0P

一定件数ずつレコードを表示するスクリプトの書き方

質問日時 / 2007年9月28日 04:30    回答数 / 26件

Questioner:  carjinal20  このエントリーをはてなブックマークに追加 

キーワード / MySQL   

参考書を何冊も見ながらHPを作成しています。データの追加・更新・削除と、参考書のサンプルスクリプト
を、こちらのサイトでご指導をいただきながら改造してだいぶ形にはなってきているのですが、知識不足で
あるがゆえに、一歩進むとまた新たな壁にぶち当たってしまいます。今回投稿させていただきますご質問が
私の中では一番やっかいで、わがままになってしまいそうなご質問なんですが、よろしくお願いします。
私が今、制作しているHPは登録したレコード全体を表示させる工程がありません。
最初からドロップダウンメニューや、いくつかのテキストボックスに入力をしてもらい検索します。
今までは、何冊か持っている違う参考書どうしのスクリプトを組み合わせて成功した例もあるのですが、
今回ご質問させていただきます「一定件数ずつレコードを表示する」スクリプトは簡単ではないようです。

参考書のサンプルスクリプトは短くて簡単なものから、親切に機能を充実させた長いスクリプトまで
いろいろあります。この「一定件数ずつレコードを表示する」スクリプトは結構長く、必要な部分を
自分のHP用に書き換え、不必要な部分を削除する。または今までに作成したスクリプトの中に組み込む
といった事をしても結果はエラーになるばかりで、一向に進みません。

今回、私が試行錯誤した内容(検索結果表示PHPファイルへの組み込み)

1. まずは「次ページ」・「前ページ」を表示させる事を考えず、とにかく10件だけを表示させる
  ようにしようと思い、変数$query に検索文字を識別させるスクリプトを検索項目の数だけ並べ、

2. $result = mysql_query("SELECT * FROM テーブル名 WHERE" . $query)となっている所を
  $result = mysql_query("SELECT * FROM テーブル名 WHERE . $query LIMIT 0,10")
    に書き換えましたが、クエリーを実行出来ませんでした。

このクエリーを実行出来るようにし、なおかつ「次ページ」・「前ページ」を表示させるというのは
比較的簡単なスクリプトでは出来ないのでしょうか?わがままなご質問だとは思いますが、
もしご存知の方がいらっしゃったら、ご指導の程よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01takeshi0913文字列部分のSQLと変数との連結がうまいこといってな
┃┣A01-1carjinal20一定件数が表示されました。正確で親切なご指導、あり
┃┗A01-2carjinal20前のご質問をした後に、頼ってばかりもいられないので
┃ ┗A01-2-1takeshi0913現在、PHPの実行環境が無いため実際に確認ができない
┃  ┗A01-2-1-1carjinal20この質問に対しては、takeshi0913さんの他におふた方
┣A02galluがると申します。 直接的な回答ではないので恐縮です
┃┣A02-1carjinal20私のスクリプトの間違いのご指摘、ありがとうございま
┃┗A02-2carjinal20少々時間はかかりましたが、この問題を解決する事が出
┗A03signal>>CODE <?php // 検索結果件数の取得 $result =
 ┣A03-1carjinal20signalさんには前回もMysqlの更新の質問でお世話にな
 ┗A03-2carjinal20頼ってばかりもいられないので、明日自分なりにもやっ
  ┗A03-2-1signal頑張ってくださいね! 先日、私の書いたスクリプト
   ┗A03-2-1-1carjinal20大変失礼を致しました。参考書のスクリプトをコピー&
    ┗A03-2-1-1-1signal// 前のページ/次のページへのリンク で作るリンク
     ┗A03-2-1-1-1-1carjinal20度重なる親切なご指導ありがとうございます。検索なの
      ┣A03-2-1-1-1-1-1takeshi0913こちらに意見がまとまってるみたいなので、こちらで意
      ┃┗A03-2-1-1-1-1-1-1carjinal20早速見ていただいてありがとうございます。おふた方の
      ┗A03-2-1-1-1-1-2signalとくに POST にこだわりがあるのでなければ GET でい
       ┣A03-2-1-1-1-1-2-1carjinal20詳細なご指導ありがとうございます。やってみました。
       ┃┗A03-2-1-1-1-1-2-1-1takeshi0913一連の流れを見てて思ったんですが、必要な動作を満た
       ┃ ┣A03-2-1-1-1-1-2-1-1-1carjinal20とても説得力のある貴重なご意見、ありがとうございま
       ┃ ┗A03-2-1-1-1-1-2-1-1-2carjinal20出来ました。ありがとうございます。最終的なスクリプ
       ┗A03-2-1-1-1-1-2-2carjinal20今日、takeshi0913さんから貴重なご意見をいただき、
        ┗A03-2-1-1-1-1-2-2-1signalセキュリティの話は置いておいて$_GET、$_POST を $_R
         ┣A03-2-1-1-1-1-2-2-1-1carjinal20本当に親切なご指導、ありがとうございます。やってみ
         ┗A03-2-1-1-1-1-2-2-1-2carjinal20出来ました!! いや本当にありがとうございます。

回答一覧

並び替え:

A01 満足
answerertakeshi0913 [9月28日 07:34]

文字列部分のSQLと変数との連結がうまいこといってないのではないかと思います。
$result = mysql_query("SELECT * FROM テーブル名 WHERE . $query LIMIT 0,10")

$result = mysql_query("SELECT * FROM テーブル名 WHERE ". $query ." LIMIT 0,10")
でどうでしょうか?
次へ、前へは同時表示件数をもとにLIMIT部分の値を算出すればよいのではないかと思います。

この意見に回答する

ツリーへ TOPへ

A01-1
replyercarjinal20 [9月30日 00:48]

一定件数が表示されました。正確で親切なご指導、ありがとうございます。

一つご質問があるんですが、ご指導いただいた最後の部分に、「次へ」「前へ」は同時件数をもとに
LIMIT部分の値を算出すればよいのではとありますが、私はあまり頭が良くないのでスクリプトとして
形に出来ません。大変お手数なんですが、例でけっこうですので出来れば「次へ」「前へ」へのリンクと
リンク番号が表示されるスクリプトを、お手隙の時にでもご指導いただけたら幸いです。

大変勝手で申し訳ありませんが、よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-2
replyercarjinal20 [9月30日 04:06]

前のご質問をした後に、頼ってばかりもいられないので自分なりにやってみました。
試行錯誤してやってみたと言いたいところですが、参考書のスクリプトを組み込みました。

私のHPのデータベースを表示させる構造は、レコードの全体表示をする機能は無く、
ドロップダウンメニューとテキストボックスに入力をして必要なデータだけを検索する構造です。
何も検索項目に入力がない時だけ、empty関数を使って「検索項目に何も入力がありません」
というメッセージを表示させています。ご指導をいただいた事によって一定件数表示も実現しています。

そこで今回試してみたのは、上記のスクリプト

empty関数による定義

データベースに接続


に、参考書スクリプトですが、このようなものを加えてみました。

// データ数を取得する
$sql = "SELECT COUNT(*) AS cnt FROM table1;";
$res = mysql_query($sql, $conn) or die("データ抽出エラー");
$row = mysql_fetch_array($res, MYSQL_ASSOC);
$dtcnt = $row["cnt"];

// 取り出す最大レコード数
$lim = 10;

// 表示するページ位置を取得する
$p = intval(@$_GET["p"]);
if ($p < 1) {
    $p = 1;
}

// 表示するデータの位置を取得する
$st = ($p - 1) * $lim;

// 前のページ/次のページのページ番号を取得する
$prev = $p - 1;
if ($prev < 1) {
    $prev = 1;
}
$next = $p + 1;


※ここはご指導いただいた内容
// データを取り出す
$result = mysql_query=("SELECT * FROM テーブル名 WHERE " . $ruery . " LIMIT $st, $lim ")


そして、データを表示するテーブルのHTML その後に

// 前のページ/次のページへのリンク
if ($p > 1) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$prev\">
    前のページ</a>";
}
if (($next - 1) * $lim < $dtcnt) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$next\">
    次のページ</a>";
}

を加え、試してみました。が、「次ページ」のリンクは表示されるもの、「次ページ」をクリックすると
データの検索時に何も入力されていない場合のメッセージ、「検索項目に何も入力がありません」が出てしまうんです。

という事は、検索項目への入力はその10件のためだけになってしまうという事になるのかなと思いました。

自分なりにもやってみたのですが、このような結果になってしまいました。
お時間の許す限りで、ご指導いただけたら幸いです。
よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-2-1
replyertakeshi0913 [9月30日 10:42]

現在、PHPの実行環境が無いため実際に確認ができないので想像になるのですが、
empty関数による定義の辺でうまいこといってないのかなと思いました。
定義部分に具体的な記述がないのでよくわかりませんが、
empty関数の引数判定でまちがってるのかも・・・

empty関数は
・変数に値がセットされてなかったら「false」
・変数の値が空だったら「true」
・変数の値が有ったら「false」
をそれぞれ返すので、そのあたりを見直してみたらどうでしょうか?
勝手な想像でしか答えてませんが的外れだったらすみません。

この意見に回答する

ツリーへ TOPへ

A01-2-1-1
replyercarjinal20 [10月2日 23:35]

この質問に対しては、takeshi0913さんの他におふた方のご指導をいただいていまして、お三方には大変感謝しております。私のスクリプトはsignalさんにいただいたご指導に返信しています。
もしお時間があったらご覧になってみて下さい。signalさんからご指導をいただいているスクリプト以外
はメチャクチャだと思いますが。よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A02 満足
answerergallu [9月28日 12:18]

がると申します。
直接的な回答ではないので恐縮ですが。

こういうときに、ちょっとひとつ知ってると便利な「おっちゃんの知恵」があります。

  1. $result = mysql_query("SELECT * FROM テーブル名 WHERE . $query LIMIT 0,10");
の部分を
  1. $sql = "SELECT * FROM テーブル名 WHERE . $query LIMIT 0,10";
  2. print "$sql <br />\n";
  3. $result = mysql_query($sql);
とします。するとブラウザにSQL文が出てきますよね?
あとは、そのSQL文とにらめっこするなり、MySQLサーバにコンソールで直接つないでSQL試すなり、phpMyAdminつかってSQL試すなり、割合に自由自在です。

以上なにかの参考にでもなれば幸いです。

追伸
ところで。
WHEREと$queryの間にはいっている . がちょっと気になります。
たぶん、もしかすると
  1. $sql = "SELECT * FROM テーブル名 WHERE . $query LIMIT 0,10";

  1. $sql = "SELECT * FROM テーブル名 WHERE " . $query . " LIMIT 0,10";
なのではないでしょうか?

この意見に回答する

ツリーへ TOPへ

A02-1
replyercarjinal20 [9月30日 01:02]

私のスクリプトの間違いのご指摘、ありがとうございます。

ご指導いただいたやり方、私はまだ知識不足の上に理解力もないので使わせていただくには
まだ時期そうしょうかと思われます。がるさんのご指導の内容は保存させていただきました。
使える力がついてきた時にぜひ使わせていただきます。

本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02-2
replyercarjinal20 [10月13日 00:37]

少々時間はかかりましたが、この問題を解決する事が出来ました。
最終的なスクリプトについては、signalさんに返信した最後の部分に記載しました。
部分的ですが、もしよかったらご覧になってみてください。

本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03 満足
answerersignal [9月28日 23:52]

  1. <?php
  2.  
  3. // 検索結果件数の取得
  4. $result = mysql_query("SELECT COUNT(*) AS total FROM テーブル名 WHERE $query");
  5. $row    = mysql_fetch_assoc( $result );
  6. $total  = $row['total'];
  7.  
  8. // 表示するページ番号
  9. $p = isset( $_GET['p'] ) ? intval( $_GET['p'] ) : 0;
  10.  
  11. // 1ページに表示する件数
  12. $perpage = 10;
  13.  
  14. // ページ位置に合わせてデータの取得
  15. $query = sprintf( 'SELECT * FROM テーブル名 WHERE %s LIMIT %d, %d'$query$p * $perpage$perpage );
  16. $result = mysql_query( $query );
  17.  
  18. ?>

この意見に回答する

ツリーへ TOPへ

A03-1
replyercarjinal20 [9月30日 01:23]

signalさんには前回もMysqlの更新の質問でお世話になりました。大変感謝しております。
結果は、出来ました。1ページに10件表示した時にはとても喜びました。

それで一つご質問がありまして、これはやはりこの質問でご指導をいただいているtakeshi0913さん
にもご質問しているのですが、「次ページ」「前ページ」のリンクと、リンク番号が表示される
スクリプトをご指導いただけたら幸いです。大変勝手なのは分かっているのですが、お時間の許す時に
少しだけsignalさんの知識をお借りできないでしょうか。よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A03-2
replyercarjinal20 [9月30日 03:34]

頼ってばかりもいられないので、明日自分なりにもやってみます。

signalさんのご指導いただいたスクリプトに

// 前のページ/次のページへのリンク
if ($p > 1) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$prev\">
    前のページ</a>";
}
if (($next - 1) * $lim < $dtcnt) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$next\">
    次のページ</a>";
}

このスクリプトを加えてみようと思います。結果についてはまた後日ご連絡します。

この意見に回答する

ツリーへ TOPへ

A03-2-1
replyersignal [9月30日 16:54]

頑張ってくださいね!

先日、私の書いたスクリプトの $total が一度も使われてないことに
今気付きましたが、多分「前へ」「次へ」では使うことになるはずです。

ceil( $total / $perpage )

が最後のページ番号です。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1
replyercarjinal20 [10月2日 02:46]

大変失礼を致しました。参考書のスクリプトをコピー&ペーストしてしまいました。
申し訳ありません。それで、自分なりにやってみました。少々長いですが、私のスクリプトをご覧下さい。
参考書同士のスクリプトを組合せたものなので、メチャクチャだと思います。
少々恥ずかしいですが、よろしくお願いします。(PHPの部分のみ)
それと言い忘れましたが、まだ実際にHPは出してません。ローカル環境で試しながらやってます。


<?php

/* MySQL DB接続情報の設定 DB名/ユーザー名/パスワード */
define("DB_NAME", "データベース名");
define("DB_USER", "root");
define("DB_PASS", "パスワード");

/* リクエストデータの取得 */
$検索項目1 = htmlspecialchars($_POST["検索項目1 ドロップダウンメニュー"], ENT_QUOTES);
$検索項目2 = htmlspecialchars($_POST["検索項目2 テキストボックス"], ENT_QUOTES);
$検索項目3 = htmlspecialchars($_POST["検索項目3 テキストボックス"], ENT_QUOTES);
$検索項目4 = htmlspecialchars($_POST["検索項目4 テキストボックス"], ENT_QUOTES);

if(empty($検索項目1) && empty($検索項目2) && empty($検索項目3) && empty($検索項目4)){

  /* 何も入力がない場合 */
  print "検索項目に何も入力がありません。\n";

} else {

  /* MySQLに接続 */
  $link = mysql_connect("localhost", DB_USER, DB_PASS) 
    or die("MySQLとの接続に失敗しました。");

  /* 接続データベースを選択 */
  mysql_select_db(DB_NAME)
    or die("データベースとの接続に失敗しました。");

  /* クライアントのキャラクタセットをutf8に変更 */
  mysql_query("SET NAMES utf8")
    or die( "クエリーの実行に失敗しました" );

  /* 検索項目1、検索項目2、検索項目3、検索項目4での検索(部分一致検索) */
$query = " 検索項目1のフィールド名 LIKE '%" . $検索項目1 . "%' AND 検索項目2のフィールド名 LIKE '%" . $検索項目2 . "%' AND 検索項目3のフィールド名 LIKE '%" . $検索項目3 . "%' AND 検索項目4のフィールド名 LIKE '%" . $検索項目4 . "%'";

  /* クエリーを実行し、結果セットを取得 */
  // 検索結果件数の取得 
$result = mysql_query("SELECT COUNT(*) AS total FROM テーブル名 WHERE $query")
          or die("クエリーを実行できませんでした。");
$row    = mysql_fetch_assoc( $result ); 
$total  = $row['total']; 
  
// 表示するページ番号 
$p = isset( $_GET['p'] ) ? intval( $_GET['p'] ) : 0; 
  
// 1ページに表示する件数 
$perpage = 10; 

// 表示するデータの位置を取得する             ここから
$st = ($p - 1) * $perpage;

// 前のページ/次のページのページ番号を取得する        は、プラス参考書スクリプトを改造
$prev = $p - 1;
if ($prev < 1) {
    $prev = 1;
}
$next = $p + 1;                         ここまで
ceil( $total/$perpage );
  
// ページ位置に合わせてデータの取得 
$query = sprintf( 'SELECT * FROM テーブル名 WHERE %s LIMIT %d, %d', $query, $p * $perpage, $perpage ); 
$result = mysql_query( $query );

  /* 結果セットの行数を取得 */
  $rows = mysql_num_rows($result);

  if( $rows == 0 ) {

    /* 取り出すデータがない場合、エラーメッセージを表示 */
    print "該当するデータが見つかりません。\n";

  } else {

?>

検索結果一覧<br><br>
<TABLE border="0">
<TR>
<TH>表示データのそれぞれの題名</TH>
</TR>

<?php

    /* データの表示 */
    while( $row = mysql_fetch_array($result) ) {

      /* 0からはじまる番号もしくはカラム名を添え字としてデータを取得 */
?>

<TR>
<TD>テーブルから取り出すデータ $row[フィールド名]を使ったスクリプト</TD>
</TR>

<?php
    }
    print "</TABLE>\n";

// 前のページ/次のページへのリンク
if ($p > 1) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$prev\">
    前のページ</a>";
}
if (($next - 1) * $perpage < $total) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$next\">
    次のページ</a>";
}

  }


  /* MySQLより切断 */
  mysql_close($link);

}

?>


signalさんのご指導いただいたスクリプトによって、10件ずつ表示が可能になりました。
しかし私のスクリプトがメチャクチャなばかりに、「次ページ」をクリックすると
empty関数で定義している、「検索項目に何も入力がありません」のメッセージが出てしまいます。
最初に表示される10件はちゃんと検索どおりに表示されるのですが、「次ページ」をクリックすると
そうなってしまいます。じゃあ、empty関数の定義を全て削除してみようと思い、やってみると
「次ページ」のデータは表示されるものの、登録データ全部に対してになってしまいます。
せっかく丁寧にご指導いただいたのに、大変申し訳なく思います。
赤を入れる部分がたくさんあるとは思いますが、何卒よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1
replyersignal [10月3日 00:08]

// 前のページ/次のページへのリンク
で作るリンク先に

$検索項目1 = htmlspecialchars($_POST["検索項目1 ドロップダウンメニュー"], ENT_QUOTES);
$検索項目2 = htmlspecialchars($_POST["検索項目2 テキストボックス"], ENT_QUOTES);
$検索項目3 = htmlspecialchars($_POST["検索項目3 テキストボックス"], ENT_QUOTES);
$検索項目4 = htmlspecialchars($_POST["検索項目4 テキストボックス"], ENT_QUOTES);

で取得した値を設定してあげましょう。

./search.php?p=1&q1=abc&q2=def&q3=111&q4=222

こんな感じでリンクが作られるようにしてあげればいいと思います。

あ、そうなると $_POST で取得できなくなるので $_REQUEST を使うか
$_SERVER['REQUEST_METHOD'] を見て $_POST と $_GET を使い分けるかですね。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1
replyercarjinal20 [10月3日 03:20]

度重なる親切なご指導ありがとうございます。検索なので、rawurlencode関数を使って$_GETに
変更してしまってもいいのかな? と思うのですが申し訳ありません。もしかしたら失礼なご質問に
なるかもしれないのですが、何せ知識がありませんのでご指導いただけたら幸いです。

前回ご指導をいただきました
$query = sprintf( 'SELECT * FROM テーブル名 WHERE %s LIMIT %d, %d', $query, $p * $perpage, $perpage ); 

の表記の中の、%s %dと、

今回ご指導をいただきました
./search.php?p=1&q1=abc&q2=def&q3=111&q4=222

の表記の中のイコールで繋がれている表記、p=1 q1=abc q2=def q3=111 q4=222は
私のスクリプトにそのまま使える表記という事になるでしょうか?
前回の%sと、%dに関しては問題なく動作しているのでお聞きするまでもないのですが。
大変失礼で初歩的なご質問で申し訳ないのですが、よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-1
replyertakeshi0913 [10月3日 07:30]

こちらに意見がまとまってるみたいなので、こちらで意見してみます。
$_GETで値を取得することに問題があるようでしたら、
必要な値を全て隠し項目に持ってて、ページ切替のリンクにonclickイベント仕込んでサブミット
させるとかどうでしょうか?

<form name="search" ~>
     |
     |
<script>
  function DoSubmit(p_num){
    frm = document.search;
    frm.hid_page_num.value = p_num;
    frm.action = "search.php";  
    frm.submit();
  }
</script>
     |
     |
<a href="#" onclick="DoSubmit(<?=$prev?>);">前のページへ</a>
<a href="#" onclick="DoSubmit(<?=$next?>);">次のページへ</a>
     |
     |
<input type="hidden" name="hid_page_num" value=""></input>
     |
     |
</form>

例えば、こんなのはいかがでしょうか?
後、これに検索項目の値を隠し項目として追加みたいな感じで。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-1-1
replyercarjinal20 [10月4日 01:17]

早速見ていただいてありがとうございます。おふた方のご指導、大変助かっております。
明日、試してみます。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2 満足
replyersignal [10月4日 00:05]

とくに POST にこだわりがあるのでなければ GET でいいと思いますよ^^

ただ $_GET にしてしまうと POST のときデータが取得できなくなってしまうので
$_REQUEST かフォームのメソッド自体を GET に変えてあげる必要がありますね

  1. $検索項目1 = htmlspecialchars($_POST["検索項目1 ドロップダウンメニュー"], ENT_QUOTES);
  2. $検索項目2 = htmlspecialchars($_POST["検索項目2 テキストボックス"], ENT_QUOTES);
  3. $検索項目3 = htmlspecialchars($_POST["検索項目3 テキストボックス"], ENT_QUOTES);
  4. $検索項目4 = htmlspecialchars($_POST["検索項目4 テキストボックス"], ENT_QUOTES);

今現在これで動作しているのであれば

$_SERVER['PHP_SELF']?検索項目1 ドロップダウンメニュー=$検索項目1&検索項目2 テキストボックス=$検索項目2&検索項目3 テキストボックス=$検索項目3&検索項目4 テキストボックス=$検索項目4

となるのかな?もちろん rawurlencode() してあげないとだけど。
でも、これだと見にくいだろうなと思って

./search.php?p=1&q1=abc&q2=def&q3=111&q4=222

というサンプルをあげておきました。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-1
replyercarjinal20 [10月4日 01:49]

詳細なご指導ありがとうございます。やってみました。

入力フォームのmethodはPOSTのまま、

$検索項目1 = htmlspecialchars($_REQUEST["検索項目1 ドロップダウンメニュー"], ENT_QUOTES); 
$検索項目2 = htmlspecialchars($_REQUEST["検索項目2 テキストボックス"], ENT_QUOTES); 
$検索項目3 = htmlspecialchars($_REQUEST["検索項目3 テキストボックス"], ENT_QUOTES); 
$検索項目4 = htmlspecialchars($_REQUEST["検索項目4 テキストボックス"], ENT_QUOTES);

の$_POSTを$_REQUESTに変更。

// 前のページ/次のページへのリンク
if ($p > 1) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$prev\">
    前のページ</a>";
}
if (($next - 1) * $perpage < $total) {
    echo " <a href=\"".$_SERVER["PHP_SELF"]."?p=$next\">
    次のページ</a>";
}

「次ページ」スクリプトの p=$nextのすぐ後に&を付けてご指導をいただいた表記を並べました。
すると今度は「検索項目に何も入力がありません」のメッセージではなく、
「該当するデータがありません」と出てしまいました。

それから昨日、入力フォーム(HTML)の方のmethodをGETにし、今$_REQUESTに変更している
箇所を$_GETにしてやってみたのですが、最初の10件も表示する事なく、
「検索項目に何も入力がありません」のメッセージが出てしまいました。
htmlspecialcharsと後ろのENT_QUOTESを削除してもやったのですが、結果は同じでした。

せっかく親切なご指導をいただいているのに申し訳ありません。
私が何か違った事をしているのだと思いますが、ご指導どおりにやっていないところ等
ご指摘していただけたら幸いです。よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-1-1 満足
replyertakeshi0913 [10月4日 07:13]

一連の流れを見てて思ったんですが、必要な動作を満たすであろう
方法はある程度出てるわけですから、後は、思惑と違う動きをする部分で
例えば、emptyの判定処理箇所で各検索項目をvar_dump()で出力して中身を
確認するだとか、SQL文の作成箇所でvar_dump()で作成したSQL文を出力して確認
してみるだとか、といった基本的なデバックでおかしい所を一つ一つ潰していくべきなのでは
ないかなと思います。
「これが駄目だから次の方法を提示」という流れではなく、なぜ駄目なのかを考えないと
このやり取りはキリが無いと思うんですが・・・?
ですから、一つ自分にあう方法を選んでそれをどうにか動かすまで色々やってみては?
余計なことだったり、既にやってることだったら無視してください。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-1-1-1
replyercarjinal20 [10月4日 22:36]

とても説得力のある貴重なご意見、ありがとうございます。反省させられました。これまでに
ご指導をいただいた事をもとに、ひとつずつ問題を潰していこうと思います。
ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-1-1-2
replyercarjinal20 [10月13日 00:33]

出来ました。ありがとうございます。最終的なスクリプトについては、signalさんに返信した
最後の部分に記載しました。もしお時間があればご覧になってみて下さい。

takeshi0913さんに貴重なご指摘、ご指導をいただいた事によって問題が乗り越えられた
と思います。本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-2
replyercarjinal20 [10月4日 22:49]

今日、takeshi0913さんから貴重なご意見をいただき、自分の質問の仕方があまりにも自分で解決しよう
という動きが見えなすぎる事から、signalさんにも大変ご迷惑をおかけしてきてしまいました。
今までご指導をいただいてきた内容をもとに、少し自分でやってみます。
この質問の期限が切れるまでには、なんとかいいご報告をおふた方にしたいと思います。
本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-2-1 満足
replyersignal [10月6日 02:21]

セキュリティの話は置いておいて$_GET、$_POST を $_REQUEST にしてみましょう。

あと、ファイルの先頭に
  1. <?php print_r( array( 'GET' => $_GET'POST' => $_POST'REQUEST' => $_REQUEST ) )?>
入れてみましょう。

ちゃんと動くときと動かないとき何が違うのか簡単にわかります。

がんばってくださいね。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-2-1-1
replyercarjinal20 [10月11日 04:59]

本当に親切なご指導、ありがとうございます。やってみます。

この意見に回答する

ツリーへ TOPへ

A03-2-1-1-1-1-2-2-1-2
replyercarjinal20 [10月13日 00:27]

出来ました!! いや本当にありがとうございます。
実は申し訳ありません。自分から一度は言っておきながら、rawurlencode
今まで入れてなかったんです。

signalさんからご指導いただいた

<?php print_rarray( 'GET' => $_GET, 'POST' => $_POST, 'REQUEST' => $_REQUEST ) ); ?>

をファイルの先頭に入れて「次ページ」をクリックしたら、$_REQUESTの検索項目部分が文字化けを
起こしていて、いろいろ試行錯誤して  rawurlencodeを入れて見るか! と思って入れてみたら
出来たんです。この質問に貴重なお時間をさいていただいたので、感謝の気持ちを込めて
最終的なスクリプトを記載しておきます。

$検索項目1 = htmlspecialchars($_REQUEST["検索項目1"], ENT_QUOTES); 
$検索項目2 = htmlspecialchars($_REQUEST["検索項目2"], ENT_QUOTES); 
$検索項目3 = htmlspecialchars($_REQUEST["検索項目3"], ENT_QUOTES); 
$検索項目4 = htmlspecialchars($_REQUEST["検索項目4"], ENT_QUOTES);

検索ページからの値の受け取り方を$_REQUESTにし、

$encode1 = rawurlencode("$検索項目1");
$encode2 = rawurlencode("$検索項目2");
$encode3 = rawurlencode("$検索項目3");
$encode4 = rawurlencode("$検索項目4");

という変数を途中に入れ、「次ページ」「前ページ」のリンク部分に

<a href=\"".$_SERVER["PHP_SELF"]?検索項目1=$encode1&検索項目2=$encode2
 &検索項目3=$encode3&検索項目4=$encode4">

としました。いつも親切なご指導をいただいていたので、頑張る気が起きました。
本当にありがとうございます。HP開設までには、まだまだ解決していない問題がたくさん
ありますので、また投稿するかもしれませんが、もしまた目についたら
ご指導よろしくお願いします。

そして、この場を借りて takeshi0913さん galluさん にも心からお礼を言いたいと思います。
本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)