MySQL

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

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

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

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

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

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

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

から。

 

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

〜/request.php?id=aaaaaaaaaaaaa

アヒルン
ん?どういうこと?
うちゅうじん
適当なURLパラメーターを入力すると、エラーを招くってこと

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

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

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

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

 

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

〜/request.php?id=1

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

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
次回はファイルごとに重複しているプログラムを統一する方法を紹介します!

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

>【MySQL】PHPでデータベースを表示したHTMLにリンクも埋め込む

>PHPでデータベースを取得して画面表示する方法



  • この記事を書いた人
  • 最新記事
oyakun

oyakun

30代半ば♂妻・子3人の5人で日々激戦中。Google app script&VBA初心者が自分の備忘録を兼ねて「スプレッドシート、Excel、WordPress、plugin」の設定等、主にブログやアフィリエイト周辺のtipsを背伸びしながらご紹介しています。

Copyright© OYAKUDACHI.XYZ , 2019 All Rights Reserved.