広告

【PHP】URLパラメーターをチェックする方法

2019年10月12日

PHPにてURLパラメーターをチェックして、エラーだったらデータ1ページ目の値を返す方法を記してます。

すぐにサンプルコードを見る↓

補足
PHPのLIMIT句でデータを10件ずつ表示する方法を読んでおくと捗ります!

PHPでパラメーターをチェックするにはissetを使う

PHPでパラメーターをチェックするには、issetを使って変数がNULLでないことを確認します。

isset
変数がセットされていること、そして NULL でないことを検査する
参考:isset

issetを利用することで、GETPOSTで送られてくる変数の内容を確認することが可能です。

例えば「inde.php?page=1」というリクエスト(下記①)に対して、

  1. index.php?page=1
  2. isset($_REQUEST['page'])

isset」の処理(上記②)により、

" page "というパラメーターを受け取っているのか

といった確認をすることができます。

確認できれば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>

次にifissetを利用して、パラメーターをチェックする方法を記します。

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

URLパラメーターの?page=1を指定した結果

変更後

localhost:8888/Pagination/

URLパラメーターの?page=1を省略した結果

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

実行結果の画像

URLパラメーターに文字列を入れた結果

きちんと1ページ目が表示されていますね!

まとめ

PHPでURLパラメーターをチェックして、NGだったら1ページ目を返す方法を紹介しました。

issetで、変数の有無が簡単にチェックできるのはとてもベンリですね。

OYAKUN
OYAKUN
次回は次ページへのリンクを設定していきます!

関連記事:【PHP】データを10件ずつ表示するのにLIMIT句でやってみた
関連記事:PHPでrequireの使い方。他ファイルのプログラムを呼び出す方法
関連記事:PHPの$_REQUESTでMySQLから任意のデータを取得する方法