2011-12-26 13 views
0

講師がフォームの提出をテストしているビデオチュートリアルを見ています。phpが空で0が0の不思議な挙動

彼が使っているコードは次のとおりです。

$required_fields = array('menu_name', 'position', 'visible'); 

foreach ($required_fields as $fieldname) { 
    if (!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] != 0) { 
     $errors[] = $fieldname; 
    } 
} 

お知らせ状態if statementに、彼はこれが何らかの理由で私のために動作しません$_POST[$fieldname] != 0

を持ってい&&後。

ただし、0のような引用符をつけると、$_POST[$fieldname] != "0"となります。


ところで、'visible'フィールドは、MySQLのboolean、別名tinyint(1)、です。ここで

は、フォームのHTMLは、このフィールドに次のようになります。

Visible: 
<input type="radio" name="visible" value="1" <?php if ($sel_subject['visible'] == "1") {echo "checked=\"checked\"";} ?> /> Yes 
&nbsp; 
<input type="radio" name="visible" value="0" <?php if ($sel_subject['visible'] == "0") {echo "checked=\"checked\"";} ?> /> No 

任意のアイデア?ご協力いただきありがとうございます。


UPDATE:

私は何が起こったのかわからないんだけど、何らかの理由コードは、引用符なしで今取り組んでいます。混乱を招いて申し訳ありません。 、ん比較する前に

+0

私はそれを追加する必要があります、私は引用符で変更しようとしていると、HTMLではないが、それは違いはありません。 – Nathan

+0

使用しているコードを確認できますか? 'foreach'の' if'文のように、 '{'の前に ')'がありません。 – Tim

+0

@Tim申し訳ありませんが、私はその問題は見ていません。私は日食が私に警告したと思う。 – Nathan

答えて

1

 
$fieldName = (int) $_POST[$fieldname]; 

が、それは私はあなたがすべてのポストのparamsは値を持っているだろうことを確認する場合は()内の条件を定義していると思うし、ではありません

+0

これは何をしているのですか? – Nathan

+0

@Nathanそれはintにキャストしますが、基本的に文字列ではなくintに変換します。すべてのフォーム入力は文字列、偶数です。つまり、フォームに '0'を入れることは、数値/ int 0ではなく、サーバーに送られるときに文字列" 0 "を返します。もちろん、入力が" 0username "それをint型にキャストすると、数字は0になります。フォームからのデータを常に数値にしない限り、あなたが探しているものではありません。 – Phoenix

+0

@Nathanまた、 '(int) 'のように数値で始まらないintに文字列をキャストすると、結果は0になります。数値データのないすべてのフィールドが等しいため、結果は0ですintにキャストされた場合は0 – Phoenix

0

を役に立てば幸い空ですが、(可視のパラメータの)値として0を持つことができます。

しかし、2番目と3番目の条件は、いくつかのPHP内部型変換規則に反します。 パラメータに空の文字列値を渡すと、empty()はtrueを返します。したがって、& &演算子は2番目の条件をチェックします。空の文字列を整数0と比較するとtrueが返され、$ value!= 0はfalseを返すので、条件は適用されません。

なぜなら、 'position'(または他のもの)の必須フィールドに空の文字列を送信すると、上記のコードではエラーとみなされず、検証が失敗します。

あなたはすべての値が設定され、どれも空にしたいが、目に見えるフィールドが「0」の値を持つことができますので、私はあなたがこれとの比較を変更するお勧め:

foreach ($required_fields as $fieldname) { 
    if (!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] !== "0")) { 
     $errors[] = $fieldname; 
    } 
} 

は、すべてのHTTPのparamsということを忘れないでください(GET、POST、...)は文字列値としてPHPスクリプトに送られます。 ==または!=演算子を使用して文字列を整数0と比較すると、PHPは文字列値を整数に変換するため、 ''または '0'には違いはありません。しかし、===または!==演算子を使用し、0を文字列として持つことで、値は変換されません。だから、「0」と「0」を区別することができます。

+0

これは私のために大いに消化する:-)しかし、私が関心を持っている詳細のタイプです。あなたが私の更新に気づいたか/投稿を編集するのかはわかりませんが、何らかの理由で妥当性確認が適切に機能するようになりました。私はまだあなたが書いたことを勉強する時間がかかります。ここに私が理解するのに役立つ詳細があるようです。ありがとうございました。 – Nathan

+0

あなたの歓迎ネイサン。あなたが必要であれば、私はもっと喜んで説明します。しかし、HTMLフォームから空の値を送信すると(HTMLフィールドに何も入力せずに送信しても)、コードではエラーは考慮されません。それがあなたが望むものでないなら、私の提案された変更が助けになるかもしれません。 :) – farzad