• パラメータに不正な
    値が入っているかチェックについて 前々回の質問の回答...
  • guest 
    パラメータに不正な値が入っているかチェックについて
    前々回の質問の回答ですが

    サンプルコードでは、
    if(!is_int($currentPageNum) ){
    となっており、int型にキャストはしていません。
    よってint型以外が渡ってくると、エラー処理に入るようになっています。

    とのことですが
    if(!is_int($currentPageNum) ){
    の場合URLの/index.php以降のクエリパラメータが出力されず、
    2ページに遷移しようとして、1ページ目のままで遷移できないです。
    var_dumpで$currentPageNumを見ると、最初にindex.php
    アクセスした場合はint型ですが、2ページをクリックした場合string型です。

    また if(!is_int($currentPageNum)){
    でキャストした場合、2ページ目には遷移できますが、URLに不正な値
    ?p=あ ?p=[1] などを入力しても後続の処理
    error_log('エラー発生:指定ページに不正な値が入りました');
    header("Location:index.php");
    が動かないです。

    また、前々回の質問者の方のように
    if(!preg_match('/^[0-9]+$/',$currentPageNum)){
    に変えるとリダイレクトのエラーが出て読み込めません。

    解決方法をご教授願います。
    回答 2

    ウェブカツコーチ 
    講師からの回答
    >最初にindex.phpアクセスした場合はint型ですが、2ページをクリックした場合string型です。
    最初にindex.phpアクセスしたときは
    $currentPageNum = (!empty($_GET['p'])) ? $_GET['p'] : 1;
    の処理で数値の1が入るからint型ですね。
    そして2ページめをクリックした時に文字列になるのは$_GET['p']で取得した数字は数値型ではなく文字列型だからです。

    であれば、
    ・型をキャストしてあげる
    か、
    ・is_int()をis_numeric()のように文字列型の数字も数値として判断してくれる関数に置き換える
    などすることで、処理が進むはずです。


    >また if(!is_int($currentPageNum)){でキャストした場合、2ページ目には遷移できますが…
    「キャスト」とは型変換のことです。例えばstring型の“1”を(int)などを使って数値に変換するなどのことです。
    なので、以前の質問にも回答していますが、上記の!is_intの処理ではキャストは行っていません。
    >URLに不正な値?p=あ?p=[1] などを入力しても後続の処理error_log(‘エラー発生:指定ページに不正な値が入りました’);header(“Location:index.php”);が動かないです
    if(!is_int($currentPageNum) ){
    で現状数値型以外はif下の処理に入るはずなので、どこかで処理がおかしくなっている可能性がありますね。
    私の環境で同様の処理を試したところ問題なくログに出力されました。
    var_dump($_GET['p']);
    exit;
    といった処理をはさみ、そもそもGETで正しく値をうけられているのかなどを確認しましょう。

    guest 
    回答ありがとうございました。is_numeric()で解決できました。

    また、すみませんが、質問を間違えてしまったのですが、

    (誤)
    if(!is_int($currentPageNum)){
    でキャストした場合、〜

    ではなく

    (正)
    if(!is_int((int)$currentPageNum)){
    でキャストした場合、〜

    と(int)が抜けていました。

    この場合ページは遷移できるのですが、不正な値を入力するとif文に入らずに
    エラー
    Notice: Trying to access array offset on value of type bool in /Applications/MAMP/htdocs/webservice_practice11/index.php on line 103

    Warning: Invalid argument supplied for foreach() in /Applications/MAMP/htdocs/webservice_practice11/index.php on line 103

    Notice: Trying to access array offset on value of type bool in /Applications/MAMP/htdocs/webservice_practice11/index.php on line 118
    発生しました。

    103は  foreach($dbProductData['data'] as $key => $val):

    118は <?php pagination($currentPageNum, $dbProductData['total_page']); ?>

    です。

    これは不正な値を入力した場合、int型にキャストするため、if下の処理に入れずに処理が進み、後続の処理でエラーが発生した解釈でよろしいですか?

    ウェブカツコーチ 
    講師からの回答
    >これは不正な値を入力した場合、int型にキャストするため、if下の処理に入れずに処理が進み、後続の処理でエラーが発生した解釈でよろしいですか?

    そのとおりです。

    var_dump((int)$currentPageNum);
    exit;

    といったデバッグ用の処理をコードに入れた上で、「p=あいう」のような不正な値を入れてクエリ実行してみてください。int(0)と表示されるはずです。つまりintに型変換した結果数値の0になっているため、ifの条件分岐でtrueとなり、if下の処理に入ることなく以下の処理に進んでしまったわけですね。

    ログに出力されているNoticeやWarningなどもここで0が渡されたことに起因して発生しているものなので、気になるようでしたら各処理の内容を見てみるなどしてみましょう。