質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

5354閲覧

PHP 検索フォームを設置した場合のページ送りについて

yukihiro_

総合スコア30

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/02/04 19:07

編集2016/02/05 03:47

掲示板を作ろうと思い、レコード全件表示+指定件数区切り+ページリンクのロジックは理解していますが、これに検索フォームを付けた場合のページリンクの記述が分かりません。

他にもこのコードの問題点があったらお願いします。
php初心者です、宜しくお願いします。

<?php require_once("function.php"); //現在ページ if(isset($_GET["page"]) && preg_match("/^[1-9][0-9]*$/", $_GET["page"])){ $page = (int)$_GET["page"]; }else{ $page = 1; } //1ページ内表示記事数 $limit = 5; //各ページ表示位置 $offset = $limit * ($page - 1); //検索ワード下処理 $_POST = vari($_POST); $keyword = isset($_POST["keyword"]) ? trim($_POST["keyword"]) : ""; $word = explode(" ",mb_convert_kana($keyword, "s")); $word = array_filter($word, function ($str){ return $str != ""; }); sort($word); //全件表示クエリ if(empty($word)){ try{ $db = db_connect(); $stmt = $db->prepare(sprintf("SELECT sql_calc_found_rows * FROM test ORDER BY No DESC LIMIT %d, %d", $offset, $limit)); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); $ctmt = $db->query("SELECT FOUND_ROWS()"); $total = $ctmt->fetchColumn(); $last = ceil($total / $page); }catch(PDOException $e){ echo $e->getMessage(); exit; } //検索処理クエリ }else{ try{ $db = db_connect(); //条件構成 $where = ""; foreach($word as $key => $value){ $where .= sprintf(" AND comment like :comment%d", $key); } //prepare実行 $stmt = $db->prepare(sprintf("SELECT sql_calc_found_rows * FROM test WHERE 1 ".$where." ORDER BY No DESC LIMIT %d,%d", $offset, $limit)); //検索ワード数分ループ for($i = 0; $i < count($word); $i++){ //検索ワード内%,\エスケープ $like = preg_replace("/([_%\\\\])/u", "\\\\$1", $word[$i]); $stmt->bindValue(":comment".$i, "%".$like."%", PDO::PARAM_STR); } $stmt->execute(); $rows = $stmt->fetchAll(); $ctmt = $db->query("SELECT FOUND_ROWS()"); $total = $ctmt->fetchColumn(); $last = ceil($total / $page); }catch(PDOException $e){ echo $e->getMessage(); exit; } } ?> <!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <div id="text"> <h1>コメント一覧</h1> <FORM method="POST" action=""> <INPUT type="search" name="keyword" value="<?= $keyword; ?>"> <INPUT type="submit" value="検索"> <?php foreach($rows as $row): ?> <li> <?= htmlspecialchars($row["comment"]); ?> </li> <?php endforeach; ?> /////以下は検索フォーム無し全件表示の場合のコードです。 検索フォームを設置した場合はこれをどうしたらいいのでしょうか。////// <?php $prev_page = $current_page - 1; $next_page = $current_page + 1; $disp = 3; //先頭ボタン echo "<a href='?page=1'>First</a>|"; //前ボタン if($current_page == 1){ echo "Prev|"; }else{ echo "<a href='?page=".$prev_page."'>Prev</a>|"; } //各ページボタン for($i = $current_page - $disp; $i <= $current_page + $disp; $i++){ if($i > 0 && $i <= $last_page){ if($current_page == $i): echo $i; else: echo "<a href='?page=".$i."'>$i</a>"; endif; } } //次ボタン if($current_page == $last_page){ echo "Next|"; }else{ echo "<a href='?page=".$next_page."'>Next</a>"; } //最後尾ボタン echo "|<a href='?page=".$last_page."'>Last</a>"; ?> <a href="">全件表示</a> </div> </body>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ページリンクの記述に検索キーワードをURLエンコードして追加すれば良いと思います。
検索ワード下処理のPOSTの処理の前にGETの処理を同様に追加します。

個人的な意見ですが、文字列の存在判定にはisset()より!empty()の方がお勧めです。

PHP

1//検索ワード下処理 2$_POST = vari($_POST); 3$keyword = !empty($_GET["keyword"]) ? trim($_GET["keyword"]) : ""; 4if( !empty($_POST["keyword"]) ) $keyword = trim($_POST["keyword"]); 5 6//自身のファイル名を取得(GETパラメーターを取り除く) 7$uri = php5_basename( $_SERVER['REQUEST_URI'] ); 8$uri_body = explode( "?", $uri ); 9$self_uri = $uri_body[0]; 10 11//GET用に検索キーワードをURLエンコードする 12$add_param = "";//検索キーワードが無ければ空文字列 13if( !empty( $keyword ) )$add_param = "&keyword=" . urlencode($keyword); 14 15//各ページボタン のリンク 16echo "<a href='".$self_uri."?page=".$i.$add_param."'>$i</a>"; 17

投稿2016/02/04 20:09

編集2016/02/04 20:16
chinyato

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukihiro_

2016/02/04 23:52 編集

早速の回答本当にありがとうございます。 アドバイスを元に以下のようにし、ナビも使用できるようになりましたが ・検索するとなぜかエンコードされていない(ブラウザアドレスバーに検索ワードがそ  のまま表示されます。 ・First,Lastボタンを押すと検索結果がリセットされ全件表示になる。 という問題がでました。 ページリンクの書き方に問題があるのでしょうか・・・ なんとかアドバイスいただけませんでしょうか。 <?php require_once("function.php"); //現在ページ $current_page = (isset($_GET["page"]) && preg_match("/^[1-9][0-9]*$/", $_GET["page"])) ? (int)$_GET["page"] : 1; //1ページ内表示記事数 $per_page = 5; //各ページ表示位置 $offset = $per_page * ($current_page - 1); //検索ワード下処理 $_POST = vari($_POST); $keyword = !empty($_GET["keyword"]) ? trim($_GET["keyword"]) : ""; if(!empty($_POST["keyword"])) $keyword = trim($_POST["keyword"]); $word = explode(" ",mb_convert_kana($keyword, "s")); $word = array_filter($word, function ($str){ return $str != ""; }); sort($word); //自身のファイル名取得 $uri = basename($_SERVER['REQUEST_URI']);  //**php5_basenameだとエラー表示されてしまいます。 $uri_body = explode( "?", $uri); $self_uri = $uri_body[0]; if(empty($word)){ //全レコード表示クエリ try{ $db = db_connect(); $stmt = $db->prepare(sprintf("SELECT sql_calc_found_rows * FROM test ORDER BY No DESC LIMIT %d, %d", $offset, $per_page)); $stmt->execute(); $rows = $stmt->fetchAll(); $ctmt = $db->query("SELECT FOUND_ROWS()"); $total = $ctmt->fetchColumn(); $last_page = ceil($total / $per_page); }catch(PDOException $e){ echo $e->getMessage(); exit; } }else{ //検索処理クエリ try{ $db = db_connect(); //条件構成 $where = ""; foreach($word as $key => $value){ $where .= sprintf(" OR comment LIKE :comment%d", $key); } //prepare実行 $stmt = $db->prepare(sprintf("SELECT sql_calc_found_rows * FROM test WHERE 0 ".$where." ORDER BY No DESC LIMIT %d,%d", $offset, $per_page)); //文字数分ループ for($i = 0; $i < count($word); $i++){ //_&,\エスケープ $like = preg_replace("/([_%\\\\])/u", "\\\\\$1", $word[$i]); $stmt->bindValue(":comment".$i, "%".$like."%", PDO::PARAM_STR); } $stmt->execute(); $rows = $stmt->fetchAll(); $ctmt = $db->query("SELECT FOUND_ROWS()"); $total = $ctmt->fetchColumn(); $last_page = ceil($total / $per_page); }catch(PDOException $e){ echo $e->getMessage(); exit; } } ?> <!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="page_skin.css" type="text/css"> <title></title> </head> <body> <div id="text"> <h1>コメント一覧</h1> <FORM method="POST" action=""> <INPUT type="search" name="keyword" value"<?= $keyword; ?>"> <INPUT type="submit" value="検索"> </FORM> <?php foreach($rows as $row): ?> <li> <?= htmlspecialchars($row["comment"]); ?> </li> <?php endforeach; ?> <?php //GET用に検索ワードをURLエンコード $add_param = ""; if(!empty($keyword)) $add_param = "&keyword=" . urlencode($keyword); $prev_page = $current_page - 1; $next_page = $current_page + 1; $disp = 3; //先頭ボタン echo "<a href='".$self_uri."?page=1'>First</a>|"; //前ボタン if($current_page == 1){ echo "Prev|"; }else{ echo "<a href='".$self_uri."?page=".$prev_page.$add_param."'>Prev</a>|"; } //各ページボタン for($i = $current_page - $disp; $i <= $current_page + $disp; $i++){ if($i > 0 && $i <= $last_page){ if($current_page == $i): echo $i; else: echo "<a href='".$self_uri."?page=".$i.$add_param."'>$i</a>"; endif; } } //次ボタン if($current_page == $last_page){ echo "|Next|"; }else{ echo "|<a href='".$self_uri."?page=".$next_page.$add_param."'>Next</a>|"; } //最後尾ボタン echo "<a href='".$self_uri."?page=".$last_page."'>Last</a>"; ?> <a href=''>全件表示</a> </div> </body> </html>
chinyato

2016/02/05 02:09 編集

先頭と最後尾ボタンに検索キーワードを追加し忘れていますね。 php5_basename()がエラーになるのはファイル名に日本語が含まれていませんか? ブラウザのURL欄にキーワードが日本語で表示されていても、URLをメモ帳などにコピーして見るとエンコードされていませんか?(firefox 44.0では日本語で表示されます) ソースコードの部分は選択してからエディタの</>ボタンで括ると見通しが良くなります。 開発環境も提示していただけますでしょうか? (OS,サーバーorローカルサーバー PHPバージョン等)
yukihiro_

2016/02/05 04:10

ご指摘ありがとうございます。 ブラウザはGoogleを使用しており、エンコード後文字列→日本語変換をブラウザが主導で行っていることを完全に忘れていました、申し訳ありません。 おっしゃる通り、先頭と最後尾ボタンに検索キーワードを追加し忘れていました、 重ね重ね申し訳ありません。。。 <開発環境> OS:Windows Vista サーバー:ローカル(xampp) php バージョン:5.6.3 ファイル名に日本語は使用していないのですが、php5_basename関数を使用した場合のエラーは Fatal error: Call to undefined function php5_basename() と表示されます。 basename関数について調べていますがまだ解決に至っていません。
chinyato

2016/02/05 04:38

すみません、調べてみたらphp5_basename()は自作の関数でした。 Unix系なら/で、Windowsのパスの場合にはセパレーターを/ではなくて\\で分割する関数でした。 なのでbasename()で正解です。混乱させてすみませんでした。
yukihiro_

2016/02/05 04:42

いいえ、気になさらないでください。 大変勉強になりましたし助かりました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問