広告

PHPでURLパラメーターを指定して利便性をあげる方法

2019年9月30日

PHPでURLパラメーターに入力される値を指定する方法を記してます。

入力した値が正数でなければエラーを返すGIF

 補足
$_REQUESTでMySQLからデータを取得する方法を読んでおくとこの記事の理解も深まります!
データ取得
php-request-data
PHPの$_REQUESTでMySQLから任意のデータを取得する方法

PHPの$_REQUESTを使って任意のデータを取得する方法を記してます。 補足 PHPで取得データを表示&詳細画面へ ...

続きを見る

PHPでURLパラメータの入力値を制限する理由

URLパラメータの入力値を制限する理由は、

  • 入力フォームに入力される値が読めない
  • ユーザーによって何を入力するか分からない

といった理由からです。

URLパラメーターの値を指定する上で、意図とはまったく違う値を入力されてしまうことがあるからです。

〜/request.php?id=aaaaaaaaaaaaa

あひる
あひる
ん?どういうこと?
ううこ
ううこ
適当なURLパラメーターを入力すると、エラーを招くってこと

もうちょっと具体的に話します↓

URパラメーターが意図しない値で指定される例

たとえばテーブルに登録された値が、すでに3つあるとします。

テーブルに登録された値(レコード)3つ

任意のレコードを取得・表示するには、詳細画面のURLパラメーターに「?id=1」と入力することで、

〜/request.php?id=1

「id=1のレコードが表示される」といった仕様を前回記事で作成しました。

データ取得
php-request-data
PHPの$_REQUESTでMySQLから任意のデータを取得する方法

PHPの$_REQUESTを使って任意のデータを取得する方法を記してます。 補足 PHPで取得データを表示&詳細画面へ ...

続きを見る

URLパラメーターに?id=1を設定して表示された詳細画面

また、テーブルのレコード2つ目を表示するときは、「?id=2」と指定すればOKでした。

〜/request.php?id=2

URLパラメーターに?id=2を設定して表示された詳細画面

ユーザーによってURLパラメーターの指定値が変わる

しかしユーザーによっては、

あひる
あひる
?id=のところに「abc」とか入れたらどうなるんだろう...

〜/request.php?id=abc

といった想定で、レコードに該当しない値を入力してしまうかもしれません。

はたまた、

あひる
あひる
マイナスで登録された値とかあったりして...

〜/request.php?id=-10000

といったように、全く想定外の入力をすることも考えられます。

結果、テーブルのレコードに該当するものがないため、何も表示されない詳細画面面となってしまうんですよね。

テーブルの値がなくて何も表示されてない状態

対策としてPHPでURLパラメーターを指定・先に制限を設けることで、既定された値以外をエラーとして返す必要があります。

PHPでURLパラメーターを指定するには

今回は入力された値が数値であるかの判断を下すために、画面表示処理の前にif文を入れた is_numeric の処理を書いていきます。

$id = $_REQUEST['id'];
if(!is_numeric($id)){
}

is_numeric

is_numeric — 変数が数字または数値形式の文字列であるか、指定した変数が数値であるかどうかを調べます。

is_numeric ( mixed $var ) : bool

【引用】PHP -is_numeric

上記の処理を、詳細画面を表示するPHPファイル側に書きます!

今回は例として「numericフォルダ」の中に

  1. 入力フォームファイル(input.html)
  2. データベースと接続するファイル(index.php)
  3. 詳細画面を表示するファイル(request.php)

以上3つのファイルを作成しました。

numericフォルダに作成した3つのファイル

is_numericの処理を書いたのは「request.php」です。

PHPでURLパラメーターを指定するサンプル

input.html、index.phpのソースは前回記事と全く同じなので、is_numericの処理を入れたファイルのみ以下に記します

<main>
<h2>登録した部品名の詳細画面</h2>
<?php
// データーベースtestへ接続
try {
$db = new PDO('mysql:dbname=test;host=localhost;charset=utf8','root','root');
// 入力した値をデータベースへ登録
$count = $db->exec('INSERT INTO 部品登録 SET 部品名="'. $_POST['buhin'] .'",登録日 = NOW()');
// 登録した件数を表示
} catch (PDOException $e) {
// 接続できなかったらエラー表示
echo 'DB接続エラー!: ' . $e->getMessage();
}
//is_numericで入力値が数値以外だったらエラー処理
$id = $_REQUEST['id'];
if(!is_numeric($id) || $id <= 0) {
print('入力する値を数字にしてね!');
exit();
}
//安全に処理するためにprepareとREQUEST変数で処理する
$Data = $db->prepare('SELECT * FROM 部品登録 WHERE id=?');
$Data->execute(array($id));
$hyouji = $Data->fetch();
?>
<article>
<pre><?php print($hyouji['部品名']);?></pre>
<a href="index.php">一覧画面へ戻る</a>
</article>
</main>

これで詳細画面のURLパラメーターに、間違った値が入力されていてもきちんとエラー画面が表示されるはず↓

URLパラメーターに値を入力して動作確認

ちょっとやってみます。

URLパラメーターを「?id=1」と設定すると

http://localhost:8888/numeric/request.php?id=1

id=1のレコード値が表示されます。

URLパラメーターに?id=1を入力した結果

もちろんURLパラメーターを「?id=2」と設定することで

http://localhost:8888/numeric/request.php?id=2

id=2のレコード値が表示されます。

URLパラメーターに?id=2を入力した結果

では数値以外の値を入力してみるとどうでしょうか?

http://localhost:8888/numeric/request.php?id=abc

エラーの処理が返されてますね!

URLパラメーターに?id=abcを入力した結果

最後にマイナスの数値を入力してみると...

http://localhost:8888/numeric/request.php?id=-10

こちらもエラーの際の処理が返されてることが確認できました!

URLパラメーターに?id=-10を入力した結果

あひる
あひる
これならフォームに入力される値が想定外でも大丈夫だね!

まとめ

PHPでURLパラメーターに入力される値を指定する方法でした。

指定というよりは、あらかじめis_numericで入力値が数値か確認する処理でしたね。

OYAKUN
OYAKUN
次回はファイルごとに重複しているプログラムを統一する方法を紹介します!

次回記事: PHPでrequireの使い方。他ファイルのプログラムを呼び出す方法

php-require
PHPでrequireの使い方。他ファイルのプログラムを呼び出す方法

PHPで「require」を使って他ファイルからプログラムを呼び出す方法を記してます。 補足 PHPのis_numer ...

続きを見る

関連記事:PHPの$_REQUESTでMySQLから任意のデータを取得する方法
関連記事:【MySQL】PHPでデータベースを表示したHTMLにリンクも埋め込む
関連記事:PHPでデータベースを取得して画面表示する方法