3

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 つの送信に違いはありません。ただし、前回の実験とは異なる点は、弦の長さが違いを生むのに役立つということです。前回うまくいかなかった理由がわかりません。

皆さん、ありがとうございました。

4

7 に答える 7

3

PHP でこの種の空をテストする最良の方法は、文字列の長さを使用することです。

isset($_POST['fname']) && (strlen($_POST['fname']) !== 0)
于 2010-09-07T16:33:44.107 に答える
3

PHPのドキュメントには、0 は空と見なされると記載されているため、この関数が空と見なすすべての値に次のようにパッチを適用することをお勧めします。

//I believe these are the most important values to cover
$results['is_fname_empty'] = empty($fname) && $fname != 0 && $fname != '0';

グッドラックのお役に立てれば幸いです!

于 2010-09-02T14:07:58.623 に答える
2

が得られるisset($fname) == falseので、$fnameは定義されていません。これは、PHP の POST 値に .xml 経由でアクセスするためです$_POST。正しいコードは次のようになります。

$results['is_fname_empty'] = empty($_POST['fname']);
$results['is_fname_isset'] = isset($_POST['fname']);
于 2010-09-06T17:40:34.060 に答える
1

このコードサンプルは私には怪しいように見えます:

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($fname) && $fname != 0 && $fname != '0'; // from dconde
FB::log($is_fname_empty, '$is_fname_empty');

4 行目の $fname は未定義のようです。多分それはあるべきです

$is_fname_empty = empty($_POST['fname']) && $_POST['fname'] != 0 && $_POST['fname'] != '0';
于 2010-09-08T17:45:44.690 に答える
1
strlen(fname)
  • strlen 成功すると文字列の長さを取得し、文字列が空の場合は0を取得します。
empty(fname)
  • var が空でもゼロでもない値を持つ場合、 FALSEを返します。次のものはと見なされます。

  • "" (空の文字列)

  • 0 (整数としての 0)
  • "0" (文字列としての 0)
  • ヌル
  • 間違い
  • array() (空の配列)
  • var $var; (変数は宣言されているが、クラスに値がない)クラスに値がない)
isset(fname)
  • var が存在し、NULL以外の値を持つ場合はTRUEを返し、それ以外の場合はFALSEを返します。

言い換えれば、$_POSTが空かどうかをチェックするために間違った方法を使用しています!!

ほんの一例です:

$empty = false;
foreach ( $_POST as $key => $val ) {
if ( trim($val) == '' || $val == 0 ) {
$empty = true;
} else {
$post[$key] .= $val;
}
}

if ( false === $empty ) {
print_r($post);
}

==の使用は重要であることに注意してください。「0」と 0 は == 0ですが、 「0」は=== 0ではありませ

于 2010-09-09T00:14:47.307 に答える
0

IFステートメントを使用する場合は、式を評価することに注意してください。

IF(0)はFALSEを返します

IF(null)はFALSEを返します

if($ _ POST ['fname'] === 0)-var=0かどうかを確認します

if($ _ POST ['fname'] =='')-var=emptyかどうかを確認します

于 2010-09-09T09:35:31.560 に答える
0

PHP では、通常の記号を使用して変数の値をテストできます。次に例を示します。

$a = 0;
($a == "0") || ($a == 0) || (empty($a))

すべて同じですが、変数の値をテストするだけでなく、変数のキャストもテストする「===」を使用できます。

$a = 0;
($a === 0)

上記のコードは true になりますが、以下のコードは false になります。

$a = 0;
($a === "0")

したがって、変数が空で、単に 0 に設定されていないかどうかをテストするには、次のコードを使用します。

$fname = trim($fname);
$results['is_fname_empty'] = ($fname !== 0) && (empty($fname)) ? TRUE : FALSE;

" " (ダブル スペース) を入力する場合は TRIM が必要です。

于 2010-09-06T16:39:29.637 に答える