2

ページにフォームを投稿していますが、データから値を取得する際に奇妙な問題が発生しPOSTます。image_idご覧のとおり、条件付きを実行する前に、、voteおよびfb_id_formがすべて設定されているかどうかを確認できます。

javascriptアラートが実行されるので、3つの変数が設定されていることがわかります。しかし、私が得るものは混乱しています。「動作しました」という最初のアラートウィンドウが表示されます。そして、2つの空白のアラートウィンドウが表示されます。どうすればfb_id_form(条件付きで)「設定」できますが、アラートを出そうとしても価値がありませんか?

if(isset($_POST['image_id']) && isset($_POST['vote']) && isset($_POST['fb_id_form'])){
    $image_id = $mysqli->real_escape_string($_POST['image_id']);
    $vote = $mysqli->real_escape_string($_POST['vote']);
    $fb_id_form = $mysqli->real_escape_string($_POST['fb_id_form']);
    echo "<script>alert('worked');</script>";
    echo "<script>alert('".$fb_id_form."');</script>";
    echo "<script>alert('".$_POST['fb_id_form']."');</script>";
}

これは(同じページの)フォームデータです:

echo "<form method=\"post\" action=\"\">
<input type=\"hidden\" name=\"image_id\" value=\"".$id."\" />
<input type=\"hidden\" name=\"vote\" value=\"1\" />
<input type=\"hidden\" name=\"fb_id_form\" value\"".$fb_id."\" />
<input type=\"submit\" name=\"submitvote\" value=\"Vote\" />
</form>";

これが問題です。フォームの直前に$fb_idのアラートをエコーアウトしましたが、正しい値が表示されます。提出すると価値がなくなってしまうのではないかと思います。

4

5 に答える 5

3

空の文字列が含まれているisset場合でも true になるためです。$_POST['fb_id_form']使いたいempty()

isset と空のリンク

empty は isset とはかなり異なります。まず第一に、最も明白なことは、それが isset の反対の方法で機能するということですが、それだけではありません。Empty はすべてに対して true を返します isset は PLUS に対して false を返し、空の文字列、空の配列、文字列 "0"、数値 0、または false に対しても true を返します。

于 2012-11-30T17:11:33.587 に答える
2

変数はisset()、NULL ではなく割り当てられている場合に設定されます (true です)。これは、空の文字列 ("") を含む変数が実際に設定されていることを意味します。ドキュメントを参照してください。

変数が空かどうかを確認するには、 を使用するempty()か、 で確認し$mystr === ""ます。

于 2012-11-30T17:09:41.320 に答える
1

マニュアルから

isset — 変数が設定されていて NULL でないかどうかを判断する

""変数が、などの場合に false を返すと言われている場所はありません。あなたの例では、このデータを投稿することでサニティチェックを簡単にバイパス0できますfalse

image_id=&vote=&fb_id_form=

追加のデータ検証が必要であり、これにはPHP フィルター関数を使用できます。$_POST3 つのパラメーターが含まれていて、それらが整数であるかどうかを確認するコード例:

$params = filter_input_array(INPUT_POST, array(
'image_id'   => array('filter' => FILTER_VALIDATE_INT, 'options' => array('default' => NULL)),
'vote'       => array('filter' => FILTER_VALIDATE_INT, 'options' => array('default' => NULL)),
'fb_id_form' => array('filter' => FILTER_VALIDATE_INT, 'options' => array('default' => NULL))
));

たとえば、誰かがこのデータをあなたのページに投稿します。

image_id=&vote=hello+world&fb_id_form=12345

次に、上記のコードは次を返します。

array(3) {
  ["image_id"]=>
  NULL
  ["vote"]=>
  NULL
  ["fb_id_form"]=>
  int(12345)
}

PS:mysqli->real_escape_stringデータを検証しません。

于 2012-11-30T17:19:01.543 に答える
1

isset()変数に格納されているのが空の文字列だけであっても true を返すため、これらの結果が得られます。結果が保存されていない可能性があります。これは、フォームに、フィールドを空にして変数を空の文字列のままにするページを復元するアクションがある可能性があるという事実が原因である可能性がありますか? より完全な回答を得るには、HTML コードを確認する必要があります...

于 2012-11-30T17:16:25.840 に答える
0

分離前後の一重引用符と関係があると思います。

echo "<script>alert(".$fb_id_form.");</script>";

echo "<script>alert(".$_POST['fb_id_form'].");</script>";

于 2012-11-30T17:15:48.157 に答える