jQuery Form Pluginhttp://jquery.malsup.com/form/
を使用してフォームを送信しています。
フォームを送信するために使用されるコードは次のとおりです。
var options = {
beforeSubmit: showRequest, // pre-submit callback
success: showResponse, // post-submit callback
url: 'recaptcha.php', // override for form's 'action' attribute
type: 'POST'
};
$('#myform').submit(function() {
$(this).ajaxSubmit(options);
return false;
});
これは私がテストに使用しているフォームです。
<form action="" method="post" style="margin:10px 0;" id="myform">
<div id="recaptcha_image"></div>
<input type="text" name="recaptcha_response_field" id="recaptcha_response_field" size="30" />
<input type='file' name='filename' size='10' />
First name: <input type="text" id="fname" name="fname" />
<input type="submit" value="Submit" id="submit_button" />
</form>
recaptcha.php のコード スニペットは次のとおりです。
$results['success'] = true;
$results['msg'] = 'Security code is valid!';
$results['is_fname_empty'] = empty($fname);
$results['is_fname_isset'] = isset($fname);
echo json_encode( $results );
return;
これは、jQuery Form Plugin で見つけた問題です。
ケース I> #fname に何も入力せずにフォームを送信すると、次のような結果が返されます。
"is_fname_empty":true,"is_fname_isset":false
ケース II> #fname に 0 を入力してフォームを送信すると、次のような結果が返されます。
"is_fname_empty":true,"is_fname_isset":false
ご覧のとおり、ユーザーが何を入力したかを区別する方法はないようです。ユーザーが何も入力しないか、ユーザーが0を入力するかを本当に知る必要があります。
誰でも助けることができますか?
ありがとうございました
// Update based on comments from dconde //
皆さんこんにちは、
問題を簡単に説明できるように、動作するスクリプトをセットアップしました。
<html> // testAjaxForm.php
<head>
<script type="text/javascript" src="js/jquery/jquery-1.4.2.js"></script>
<script type="text/javascript" src="js/jquery/jquery.form.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#myForm').submit(function() {
$(this).ajaxSubmit(); // called first
return false;
});
});
</script>
</head>
<body>
<form id="myForm" action="verify.php" method="post">
Name: <input type="text" name="fname" />
<input type="submit" value="Submit Comment" />
</form>
</body>
</html>
<?php // verify.php
require_once('./FirePHPCore/FirePHP.class.php');
require_once('./FirePHPCore/fb.php');
FB::setEnabled(true);
ob_start(); // avoid 'headers already sent error'
FB::log($_POST, '$_POST');
FB::log(strlen($_POST['fname']), 'strlen(name)');
FB::log(empty($_POST['fname']), 'empty(fname)');
FB::log(isset($_POST['fname']), 'isset(fname)');
$is_fname_empty = empty($_POST['fname']) && $_POST['fname'] != 0 && $_POST['fname'] != '0';
FB::log($is_fname_empty, '$is_fname_empty');
?>
Here is the printed information from FirePHP.
1> 何も入力せずにフォームを送信します。
$_POST: array('fname'=>'')
strlen(name): 0
empty(fname): TRUE
isset(fname): TRUE
$is_fname_empty: FALSE
2> フォームを 0 で送信します。
$_POST: array('fname'=>'0')
strlen(name): 1
empty(fname): TRUE
isset(fname): TRUE
$is_fname_empty: FALSE
お分かりのように、empty、isset、および dconde によって提供されるメソッドのみを考慮する場合、2 つの送信に違いはありません。ただし、前回の実験とは異なる点は、弦の長さが違いを生むのに役立つということです。前回うまくいかなかった理由がわかりません。
皆さん、ありがとうございました。