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"ます。


ところで、このフィールドは、 MySQL では'visible'ブール値、つまり です。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

何か案は?よろしくお願いいたします。


アップデート:

何が起こったのかわかりませんが、何らかの理由でコードが引用符なしで機能するようになりました。混乱して申し訳ありません。

4

2 に答える 2

1

比較する前に、次のことを行います。

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

それが役に立てば幸い

于 2011-12-26T04:16:25.560 に答える
0

if () で条件を定義して、すべての投稿パラメーターに値があり、空ではないことを確認したと思いますが、値として 0 を持つことができます (可視パラメーターの場合)。

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

そのため、「位置」(またはその他のフィールド) の必須フィールドに空の文字列を送信すると、上記のコードはそれをエラーと見なさず、検証に失敗します。

すべての値を設定して空の値を設定したくないが、可視フィールドの値が「0」になる可能性があるため、比較を次のように変更することをお勧めします。

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

すべての HTTP パラメーター (GET、POST、...) は文字列値として PHP スクリプトに送信されることに注意してください。== または != 演算子を使用して文字列を整数 0 と比較すると、PHP は文字列値を整数に変換するため、'' と '0' の間に違いはありません。しかし、=== または !== 演算子を使用し、文字列として 0 を使用すると、値は変換されません。したがって、「」と「0」を区別できます。

于 2011-12-26T05:01:36.747 に答える