ソースコードで実際に動くまで約10時間・・・
原因を調べて修正するのは大変でしたが、自分に力が付いてきているなと実感できました。
特に2番目の不具合を発見するのには苦労しましたが、修正後動くようになった時は狂喜しました。一人絶叫したくなりました。
1.年齢の半角数字のエラーメッセージ
対象
webservice_practice05
function.php
事象
年齢を未入力で送信すると、「MSG11:郵便番号の形式が違います」が
表示されました。
原因
Function validNumberを確認したところ、
MSG11が$err_msgに格納されています。
修正前のコード
define(‘MSG11’, ‘郵便番号の形式が違います’);
function validNumber($str, $key){
if(!preg_match(“/^[0-9]+$/”, $str)){
global $err_msg;
$err_msg[$key] = MSG11;
}
修正内容
・新しい定数MSG12を定義
・MSG11からMSG12へ変更
修正後のコード
define(‘MSG12′,’半角の数字のみご利用いただけます’);
function validNumber($str, $key){
if(!preg_match(“/^[0-9]+$/”, $str)){
global $err_msg;
$err_msg[$key] = MSG12;
}
2.不要なはずのバリデーションチェックが走ってしまう
対象
webservice_practice05
profEdit.php
事象
ファイルのコメントに「//DBの情報と入力情報が異なる場合にバリデーションを行う」と
あるにも関わらず、未入力のすべての項目に対してバリデーションチェックが走ってしまう
原因
DBにはNullが格納されている。一方で比較する変数は空文字のため、
型までの厳密な比較をおこなうと「更新された」と判定されてしまう
gettypeでDB値および変数の型を出力させると確認できる
修正前のコード
if($dbFormData[‘username’] !== $username){
validMaxLen($username, ‘username’);}
修正内容
・DB値がnullかつ入力値が空文字の場合には、バリデーションチェックが
走らないようにif文を変更
・上記のケースに該当したことが見えるように、関数debugでログを出力する
・記載しているコードは、usernameですが、tel,zip,addr,ageについても同様です。
修正後のコード
//username,tel,zip
if(empty($dbFormData[‘username’]) && $username===””){
debug(‘usernameはDB値が(nullや0)かつ入力値が空文字のためバリデーション不要’);
}elseif($dbFormData[‘username’] !== $username){
validMaxLen($username, ‘username’);}
まだ完全でないと思われるところ
Emptyは0や0.0を許容してしまうため、意図せずにバリデーションを回避してしまうかもしれない
3.更新した内容がDBに反映されない
対象
webservice_practice05
profEdit.php
事象
php.logには「クエリ成功」と出力されているにも関わらず、
更新内容がDBに反映されない
原因
DB、ageの型はint型のため、空文字を書きもうとすると反映できない
以下のようなSQL文をphpMyAdminから流すことで上記の理由が確認できる
UPDATE users SET username = ‘例’, tel = ”, zip = 0, addr = ”, age = ”, email = ‘XXXX@gmail.com’ WHERE id = X
修正前のコード
$age = $_POST[‘age’];
修正内容
zipと同じように空で送信されきてきた場合には0を入れる
修正後のコード
$age = (!empty($_POST[‘age’])) ? $_POST[‘age’] : 0;
まだ完全でないと思われるところ
DBに反映できない場合には、エラーにならないといけない
4.ageを未入力で登録したにも関わらず0が表示される
対象
webservice_practice05
profEdit.php
事象
「3.更新した内容がDBに反映されない」での修正をおこなった後、
画面上で年齢に0が入ってしまう
原因
LESSON動画でも解説していたとおり、DBに0が入っているため
修正前のコード
ブログの文章に入力できないため一部<>等削除しています
input type=”number” name=”age” value=”php echo getFormData(‘age’);”>
修正内容
DB値0のときには値を空白にする
修正後のコード
ブログの文章に入力できないため一部<>等削除しています
input type=”number” name=”age” value=”php
if( !empty(getFormData(‘age’)) ){
echo getFormData(‘age’); }else{
debug(‘ageはemptyでtrue判定されました’);}”
まだ完全でないと思われるところ
年齢0を登録する反映されていないように見えてしまう
備考
「value=」と「<?php」の間に改行やスペースを入れると、それ自体が値になってしまう
コメント