値が入っているかチェックについて 前々回の質問の回答...
最初に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で正しく値をうけられているのかなどを確認しましょう。
また、すみませんが、質問を間違えてしまったのですが、
(誤)
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下の処理に入れずに処理が進み、後続の処理でエラーが発生した解釈でよろしいですか?
そのとおりです。
var_dump((int)$currentPageNum);
exit;
といったデバッグ用の処理をコードに入れた上で、「p=あいう」のような不正な値を入れてクエリ実行してみてください。int(0)と表示されるはずです。つまりintに型変換した結果数値の0になっているため、ifの条件分岐でtrueとなり、if下の処理に入ることなく以下の処理に進んでしまったわけですね。
ログに出力されているNoticeやWarningなどもここで0が渡されたことに起因して発生しているものなので、気になるようでしたら各処理の内容を見てみるなどしてみましょう。
部活の学習一覧
Lesson 01
「WEBサービスと必要な機能」
Lesson 02
「画面を設計しよう!」
Lesson 03
「テーブルを設計しよう!part1」
Lesson 04
「テーブルを設計しよう!part2」
Lesson 05
「テーブルを設計しよう!part3」
Lesson 06
「DB作成」
Lesson 07
「画面を作ろう!」
Lesson 08
「画面を作ろう!part2」
Lesson 09
「ユーザー登録機能を作ろう!」
Lesson 10
「ユーザー登録機能を作ろう!part2」
コーヒーブレイク
「投資の小話」
Lesson 11
「ログイン機能を作ろう!」
Lesson 12
「ログアウト機能を作ろう!」
Lesson 13
「退会機能を作ろう!」
Lesson 14
「プロフィール編集機能を作ろう!」
コーヒーブレイク
「書いて書いて書きまくれ!」
Lesson 15
「パスワード変更機能を作ろう!」
Lesson 16
「パスワードリマインダー機能を作ろう!」
Lesson 17
「商品登録機能を作ろう!」
Lesson 18
「商品登録機能を作ろう!part2」
Lesson 19
「商品登録機能を作ろう!part3」
Lesson 20
「商品一覧表示機能を作ろう!」
Lesson 21
「商品詳細画面を作ろう!」
Lesson 22
「商品検索機能を作ろう!」
Lesson 23
「連絡掲示板機能を作ろう!」
Lesson 24
「お気に入り機能を作ろう!」
Lesson 25
「マイページ機能を作ろう!」
コーヒーブレイク
「はたらくプログラミング 第5話」
ご意見箱
前々回の質問の回答ですが
サンプルコードでは、
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)){
に変えるとリダイレクトのエラーが出て読み込めません。
解決方法をご教授願います。