PHP

【PHP入門】GETやPOSTメソッドでリクエストを受け取るときにはパラメータの扱いに気をつけよう

PHPでサーバーサイドのプログラミングをしているとき、

特にAPIを実装しているときなんかはHTTPリクエストの処理を必ずと言っていいほどすると思います。

GETやPOSTメソッドで送られてきたパラメータをisset()でチェックするだけで済ませていませんか?

今回はそんなHTTPリクエストについてのお話をしたいと思います。

普通にGET、POSTパラメータを受け取ってみる

単純にGETやPOSTメソッドでパラメータを受け取るとどうなるのでしょうか?

以下のコードで実際にみてみましょう。

1.GETメソッドの場合

2.POSTメソッドの場合

 

上の2つのコードはGETかPOSTかの違いしかないので好きな方をindex.phpをして保存して、アクセスしてみます。

パラメータのparamに「これはテストだよ」という文字列を代入してリクエストすると、

(例えばGETならURLを index.php?param=これはテストだよ にしてアクセス)

当たり前ですが、このように表示されます。

上記2つのプログラムで、

パラメータのparamを定義せずにリクエストするとどうなるでしょうか?

実際にやってみるとphpのログに、

と書いてあると思います。

もしparamが定義されていないときにちゃんとした処理がしたい場合はどうすればいいでしょうか?

そんなときに活躍するのがisset()です。

isset()を使ってパラメータを受け取ってみる

普通にGETやPOSTで送られてきたパラメータを処理するのはあまりよくないということがわかりました。

というわけでこんな時に大活躍するisset()を使ってみたいと思います。

isset()を使ってパラメータを受け取るには以下のコードにようにします。(POSTの場合も同じ)

 

このようなコードにしてindex.phpにアクセスすると、

paramに値を入れた場合は、

と返ってきます。

paramを定義しなかった場合は当然何も表示されません。

つまりisset()は簡単に説明すると、

パラメータがなにもないときはFALSEを返して、そうでないときはTRUEを返す

これをもっと詳細に説明すると、

isset($var)は、変数が定義されていてかつNULLではない時にTRUEを返す

ということになります。

実際にisset()を使って試してみると、

 

というふうになります。

isset()を使うときに気をつけること

isset()はとても便利ですが、気をつけなければならない点もあります。

それは送られてきたパラメータの値が空白だった場合です。

実際にいろんなサイトにある入力欄などをみてみればわかるのですが、入力欄が空白のままだと送信することができませんよね?

しかしパラメータが空白ということは、パラメータ自体は定義されていて値がNULLという訳でもないので、isset()でチェックしてもTRUEと返ってきてしまうのです。

実際にそのことを確かめたプログラムを以下に載せます。

 

このままだと実際にサイトやAPIを作る時に入力欄に何も入力していない場合でも処理を通してしまうので問題ですね。

ではどうすればいいのでしょうか?

答えは簡単です。以下のコードをみてください。

 

というふうにしてあげるだけです。

つまりisset()でチェックした後に、さらに空白かどうかを判断してあげればいいのです。

少し詳しい説明を加えると、

$paramが空白かどうかをチェックするif文で「$param !== “”」としているのは、

「$param != “”」だと、$paramに0が入っていた場合でも$paramが空白だとみなされてしまうからです。

「$param != “”」としてしまうと入力欄に「0」と書いて送信したのに空白だと見なされてしまうので大変なことになってしまいますね。

これまでのことをまとめたコード

というでこれまでを考慮してGETやPOSTパラメータを処理すると以下のコードのようになります。

おまけ: isset()は引数を複数もつことができる

isset()の基本的な使い方を説明してきましたが、isset()は引数を複数もつことができます。

どういうことかというと、チェックしたいパラメータが複数ある場合にはそれらを全部isset()に入れてまとめてチェックすることができるということです。

早速コードを載せていきたいと思います。

 

というふうになります。

isset()の複数の引数のうち1つでも定義されていないかNULLだった場合はFALSEを返す。

つまり、全ての引数が定義されていてかつNULLではない場合にのみ、TRUEを返すということになります。

実際にサイトやAPIなどを作るときはパラメータが複数あると思うのでが、パラメータごとにisset()を使っていては冗長なコードになってしまいます。

しかし、1つのisset()の中にチェックしたいパラメータを全部入れてしまえば簡潔にコードを書くことができるのです。