PHPにてURLパラメーターをチェックして、エラーだったらデータ1ページ目の値を返す方法を記してます。
PHPでパラメーターをチェックするにはissetを使う
PHPでパラメーターをチェックするには、issetを使って変数がNULLでないことを確認します。
isset
変数がセットされていること、そして NULL でないことを検査する
参考:isset
issetを利用することで、GETやPOSTで送られてくる変数の内容を確認することが可能です。
例えば「inde.php?page=1」というリクエスト(下記①)に対して、
- index.php?page=1
- isset($_REQUEST['page'])
「isset」の処理(上記②)により、
といった確認をすることができます。
確認できればtreu、未確認であればfalseが返される仕様です。
実際に手順を2つに分けて、試してみました。
1. URLパラメーターをチェックする準備
例としてphpMyAdminへテーブル「部品登録」を作成し、
テーブルには以下データを挿入しました。
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'あいうえお', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'かきくけこ', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'さしすせそ', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'たちつてと', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'なにぬねの', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'はひふへほ', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'まみむめも', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'やゆよ', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'わをん', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'AAAAA', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'BBBBB', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'CCCCC', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'DDDDD', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'EEEEE', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'FFFFF', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'GGGGG', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'HHHHH', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'JJJJJ', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'KKKKK', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'LLLLL', NOW());
INSERT INTO `部品登録` (`id`, `部品名`, `登録日`) VALUES (NULL, 'MMMMM', NOW());
このデータをURLパラメーターから取得・表示する際に、パラメーターの指定が間違っていないかチェックしていきます。
URLパラメーターのチェックに利用したhtmlとphpファイル
次にAtomエディタに以下ファイル4つを準備します。
input.htmlファイル
<main>
<h2>部品名を入力してください。</h2>
<form action="index.php" method="post">
<textarea name="buhin" cols="40" rows="3" placeholder="登録する部品名を入力"></textarea><br>
<button type="submit" name="button">登録する</button>
</form>
</main>
index.phpファイル
<main>
<h2>登録した部品名一覧</h2>
<?php
require('connect.php');
$page = $_REQUEST['page'];
$start = 10 * ($page - 1);
// 部品登録テーブルの部品名の値を降順に取得して$entryに格納
$entry = $db->prepare('SELECT * FROM 部品登録 ORDER BY 部品名 DESC LIMIT ?, 10');
$entry->bindParam(1,$start, PDO::PARAM_INT);
$entry->execute();
?>
<article><!--?php while($resister = $entry->fetch()): ?--><!-- $entryの値をfetchで1件ずつ取得して$resistorへ格納 --><!--?php print(mb_substr($resister['部品名'],0,50)); ?--> <time><!--?php print($resister['登録日']); ?--></time>
<hr align="left" size="3" width="450" /><!--?php endwhile; ?--></article>
</main>
connect.phpファイル
<!--?php
try { // データーベースtestへ接続
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf8','root','root');
} catch (PDOException $e) {
// 接続できなかったらエラー表示
echo 'DB接続エラー!:' . $e->getMessage();
}
?-->
request.phpファイル
<main>
<h2>登録した部品名の詳細画面</h2>
<!--?php
require('connect.php');
$id=$_REQUEST['id'];
if(!is_numeric($id) || $id <= 0){
print('1以上の数字で指定してください');
exit();
}
//安全に処理するためにprepareとREQUEST変数で処理する
$data = $db->prepare('SELECT * FROM 部品登録 WHERE id=?');
$data->execute(array($_REQUEST['id']));
$hyouji = $data->fetch();
?-->
<article>
<pre> </pre>
<a href="index.php">一覧画面へ戻る</a></article>
</main>
次にifとissetを利用して、パラメーターをチェックする方法を記します。
2. PHPファイルにifとissetを設定する
index.phpにifとissetで、URLパラメーターを確認するコードを記入します。
//URLパラメーターが省略されたら1ページ目を返す
if(isset($_REQUEST['page'])){
$page = $_REQUEST['page'];
}else{
$page = 1;
}
index.phpファイル全体のソース
<main>
<h2>登録した部品名一覧</h2>
<?php
require('connect.php');
//URLパラメーターが省略されたら1ページ目を返す
if(isset($_REQUEST['page'])){
$page = $_REQUEST['page'];
}else{
$page = 1;
}
$start = 10 * ($page -1);
// 部品登録テーブルの部品名の値を降順に取得して$entryに格納
$entry = $db->prepare('SELECT * FROM 部品登録 ORDER BY 部品名 DESC LIMIT ?,10');
$entry->bindParam(1,$start,PDO::PARAM_INT);
$entry->execute();
?>
<article>
<?php while($resister = $entry->fetch()):?>
<p><a href="request.php?id=<?php print($resister['id']); ?>"><?php print(mb_substr($resister['部品名'],0,50)); ?></a></p>
<time><?php print($resister['登録日']); ?></time>
<hr size='3' color="#a9a9a9" width="450" align="left">
<?php endwhile; ?>
</article>
</main>
ちょっと実行してみました。
URLパラメーターの動作確認を行う
URLパラメーターの「?page=1」の部分を削除してみます。
変更前
localhost:8888/Pagination/?page=1
変更後
localhost:8888/Pagination/
URLパラメーターの「?page=1」の箇所を削除した後でも、同じ1ページ目が表示されていることが分かりますね!
URLパラメーターが数字であるかチェックする
次に入力されるURLパラメーターが、数字であるかチェックします。
URLパラメーターが数字であるかどうかを確認するには、is_numericを利用します。
is_numericを設定する
先程のindex.phpファイル「isset」の後に、is_numericを挿入します。
//URLパラメーターが省略されたら1ページ目を返す
//数字が指定されなかった場合も1ページ目を返す
if(isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {
$page = $_REQUEST['page'];
}else{
$page = 1;
}
index.phpファイル全体のソース
<main>
<h2>登録した部品名一覧</h2>
<?php
require('connect.php');
//URLパラメーターが省略されたら1ページ目を返す
//数字が指定されなかった場合も1ページ目を返す
if(isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) {
$page = $_REQUEST['page'];
}else{
$page = 1;
}
$start = 10 * ($page -1);
// 部品登録テーブルの部品名の値を降順に取得して$entryに格納
$entry = $db->prepare('SELECT * FROM 部品登録 ORDER BY 部品名 DESC LIMIT ?,10');
$entry->bindParam(1,$start,PDO::PARAM_INT);
$entry->execute();
?>
<article>
<?php while($resister = $entry->fetch()):?>
<p><a href="request.php?id=<?php print($resister['id']); ?>"><?php print(mb_substr($resister['部品名'],0,50)); ?></a></p>
<time><?php print($resister['登録日']); ?></time>
<hr size='3' color="#a9a9a9" width="450" align="left">
<?php endwhile; ?>
</article>
</main>
もし「?page=あいうえお」といったように、文字列が入ってたら1ページ目を返す処理になりました。
これでURLパラメーターを変更して、もう一度実行してみます。
URLパラメーターに文字列を入力してみる
URLパラメーターの「?page=」のあとに、文字列を入力してみます。
実行したURLパラメーター
localhost:8888/Pagination/?page=ergga
実行結果の画像
きちんと1ページ目が表示されていますね!
まとめ
PHPでURLパラメーターをチェックして、NGだったら1ページ目を返す方法を紹介しました。
issetで、変数の有無が簡単にチェックできるのはとてもベンリですね。
関連記事:【PHP】データを10件ずつ表示するのにLIMIT句でやってみた
関連記事:PHPでrequireの使い方。他ファイルのプログラムを呼び出す方法
関連記事:PHPの$_REQUESTでMySQLから任意のデータを取得する方法