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

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

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

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

1106閲覧

PHP ページング 値固定解除

GPE46232209

総合スコア14

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

1クリップ

投稿2021/08/01 14:51

前提・実現したいこと

作製しているのは送られてきたメッセージをsql分に5件づつ表示するように制限かけて
ボタンを押すと+1,-1されるような形にしています。ただ、ページングをするための
$page_flag = 2;
if( !empty($_POST['next_press']) ) {

$page_flag += 1;
}
if( !empty($_POST['next_back']) ) {

$page_flag -= 1;
}
というところでページの値が固定されてしまい。今のところ、1ページと3ページしか映らない掲示板というごみ板になっております。
今悩んでいることとしてはページングをすることを目的に、
$page_flagの値をグローバル値にするためにはどうすればいいかということです!

該当のソースコード

<!DOCTYPE html> <html lang="ja"> <head> <?php try { $db = new PDO('mysql:dbname=c-pro;host=127.0.0.1;charset=utf8', 'root', '' ); } catch (PDOException $e) { echo "データベース接続エラー :".$e->getMessage(); } $page_flag = 2; //if文の値がローカル関数であることがトラブっている。=>値をグローバル値にするか if( !empty($_POST['next_press']) ) { $page_flag += 1; } if( !empty($_POST['next_back']) ) { $page_flag -= 1; } $start = 5 * ($page_flag - 1 ); if ($page_flag == 2 ) { $records = $db->query('SELECT * FROM contact ORDER BY number DESC LIMIT 1, 5'); }elseif($page_flag !==0 ) { $records = $db->prepare('SELECT * FROM contact ORDER BY number DESC LIMIT ?, 5'); $records-> bindParam(1, $start, PDO::PARAM_INT); $records ->execute(); } ?> <meta charset="utf-8"> <title>お問い合わせ受信ページ</title> </head> <!--メニューバー追加--> <body> <h1>お問い合わせ受信ページ</h1><h2><?php echo $page_flag?>.ページ目</h2> <article> <hr> <?php while( $record = $records->fetch()): ?> <p>名前:<?php print($record['S_NAME']);?></p> <p>要件:<?php print($record['message']);?></p> <time>送信時間:<?php print($record['mes_time']);?></time> <hr> <?php endwhile;?> </article> <form action="" method="post" > <input type="submit" name="next_press" value="次のページへ"> </form><br> <?php if($page_flag !==1):?> <form action="" method="post" > <input type="submit" name="next_back" value="前のページへ"> <?php endif;?> </form> </body> </html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

前置き

今悩んでいることとしてはページングをすることを目的に、
$page_flagの値をグローバル値にするためにはどうすればいいかということです!

現在のコードは全て同じスコープで統一されていますのでこれは原因ではありません。

  • 勘でデバッグをするのは大変なのでまずはPHP デバッグ 方法php xdebug ブレークポイントあたりで検索して、デバッグ方法を学習されることを強くお勧めします。

回答

LIMITの基準となる$page_flagの初期値が常に2で固定されていることが原因です。

解決方法としては

  • セッションに現在のページを持たせて、$page_flagの初期値とする。フォームの値から次のページに行くか前のページいくか判断して、値を変更させる
  • フォームにhiddenで現在のページを持たせて、$page_flagの初期値とする。
  • フォームではなくGETでページ情報を持たせる(google検索のページングのリンクを確認してみてください)。受け取ったページを$page_flagの初期値とする。

あたりがあります。

まずはデータベース操作を伴わない形で、ページを前後させるだけの処理を書いてみて、ページの値を引っ張りまわす方法の理解をすることをお勧めします。

例えばこんな感じ

PHP

1 2<?php 3 4//$_GET['page']が数値の時だけ値を取得する 5$page = filter_input(INPUT_GET,"page",FILTER_VALIDATE_INT); 6 7//整数値でない場合や0の場合は1ページ目とする 8if(!$page){ 9 $page = 1; 10} 11 12//前のページと次のページを計算 13$prev = $page - 1; 14$next = $page + 1; 15 16//それぞれのリンクを生成 17echo "ひとつ前のページは<a href='?page=".$prev."' >".$prev."</a><br />"; 18echo "現在のページは".$page."<br />"; 19echo "次のページは<a href='?page=".$next."'>".$next."</a>"; 20

投稿2021/08/01 18:56

編集2021/08/01 19:13
tanat

総合スコア18727

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

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

GPE46232209

2021/08/02 15:42

解答が遅くなり申し訳ないです。ご指摘の通り、ページングの扱うについてもう一度考え直して ページング主体=>sql分の変動でうまくいきました。 デバックについてもう一度振り返ろうと思います。 あとページングについて簡略ではありますがまとめてみました。 ページングのメリットとは内容の冗長の防止、データの余分な読み取り防止、読みやすさを提要できる。 そのための方法として、ページング用の値を決めて、クライアントが次のページ、前のページのリスポンス要求したら値を経引こうしてhttps:~~~/page=?(?は値)という形dえ作成するものがページング!!
guest

0

PHP

1<?PHP 2$selected["perpage"]=["5"=>"","10"=>"","50"=>""]; 3$perpage=filter_input(INPUT_POST,"perpage",FILTER_VALIDATE_INT)?:5; 4$selected["perpage"][$perpage]=" selected"; 5$current=filter_input(INPUT_POST,"current",FILTER_VALIDATE_INT)?:1; 6$act=filter_input(INPUT_POST,"act"); 7if($act=="prev" and $current>1) $current--; 8if($act=="next") $current++; 9 10$sql=sprintf("select * from tbl limit %s,%s",($current-1)*$perpage,$perpage); 11print $sql."<br>\n"; 12?> 13<hr> 14page.<?=$current?> 15<form method="post"> 16<input type="hidden" name="current" value="<?=$current?>"> 17<select name="perpage"> 18<option value="5"<?=$selected["perpage"]["5"]?>>5</option> 19<option value="10"<?=$selected["perpage"]["10"]?>>10</option> 20<option value="50"<?=$selected["perpage"]["50"]?>>50</option> 21</select><br> 22<button type="submit" name="act" value="prev">&lt;prev</button> 23<button type="submit" >search</button> 24<button type="submit" name="act" value="next">next&gt;</button> 25</form>

投稿2021/08/02 02:26

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問