Почему плагин jQuery Form смешивает NULL и 0 - PullRequest
3 голосов
/ 31 августа 2010

Я использую плагин jQuery Form http://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.

Случай I> Если я отправляю форму, не вводя ничего для #fname, возвращаемый результат будет следующим:

"is_fname_empty":true,"is_fname_isset":false

Случай II> Если я отправляю форму с вводом 0 для #fname, возвращаемый результат будет следующим:

"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

Как видите, нет никакой разницы между двумя представлениями, если мы рассмотрим только пустой, isset и метод, предоставленный dconde.Однако, что отличается от моих последних экспериментов, так это то, что длина строки может помочь мне изменить ситуацию.Я не знаю, почему это не работает для меня в прошлый раз.

Спасибо вам всем.

Ответы [ 7 ]

3 голосов
/ 07 сентября 2010

Лучший способ проверить пустоту в PHP - через длину строки, т. Е.

isset($_POST['fname']) && (strlen($_POST['fname']) !== 0)
3 голосов
/ 02 сентября 2010

В документации PHP указано, что 0 считается пустым, поэтому вы можете захотеть исправить все значения, которые эта функция считает пустыми, например:

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

Я надеюсь, что смогупомогите удачи!

2 голосов
/ 06 сентября 2010

Вы получаете isset($fname) == false, поэтому $fname не определено. Это потому, что вы получаете доступ к значениям POST в PHP через $_POST. Правильный код будет:

$results['is_fname_empty'] = empty($_POST['fname']);
$results['is_fname_isset'] = isset($_POST['fname']);
1 голос
/ 09 сентября 2010
strlen(fname)
  • strlen получить длину строки в случае успеха и 0 , если строка пуста.
empty(fname)
  • Возвращает FALSE , если var имеет непустое и ненулевое значение.Следующие вещи считаются пустыми :

  • "" (пустая строка)

  • 0 (0 в виде целого числа)
  • "0" (0 в виде строки)
  • NULL
  • FALSE
  • array () (пустой массив)
  • var $ var; (объявленная переменная,но без значения в классе) без значения в классе)
isset(fname)
  • Возвращает TRUE , если var существует и имеет значениекроме NULL , 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);
}

NOTE использование == это важная причина, "0" и 0 равны == 0 НО"0" не === 0

1 голос
/ 08 сентября 2010

Этот пример кода кажется мне подозрительным:

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';
0 голосов
/ 09 сентября 2010

если вы используете оператор IF, помните, что он вычисляет выражение

IF (0) возвращает FALSE

IF (null) возвращает FALSE

if ($ _ POST['fname'] === 0) - проверить, если var = 0

if ($ _ POST ['fname'] == '') - проверить, если var = пусто

0 голосов
/ 06 сентября 2010

В PHP вы можете проверить значение переменной, используя обычные знаки, например:

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

одинаковы, однако вы можете использовать '===', который проверяет не только значение переменной, но и приведение к ней.

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

Вышеприведенный код будет верным, однако код ниже будет ложным.

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

Поэтому, чтобы проверить, является ли переменная пустой, а не просто установлена ​​в 0, используйте код

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

TRIM требуется, если кто-то входит в "" (двойные пробелы).

...