ウェブカツ学習メモ Lesson14「プロフィール編集機能を作ろう!」

ソースコードで実際に動くまで約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」の間に改行やスペースを入れると、それ自体が値になってしまう