PHP:checkbox-isset 总是返回 true

Posted

技术标签:

【中文标题】PHP:checkbox-isset 总是返回 true【英文标题】:PHP: checkbox-isset always returns true 【发布时间】:2013-12-03 05:45:14 【问题描述】:

在我的表单中(我使用 jQuery 的 ajax() 通过 POST 提交)我有以下复选框(检查新用户是否应该具有管理员权限):

<form action="../inc/new_user.php" id="new_user_form">
    Username:<br><input type="text" name="username" placeholder="Username"><br><br>
    Email:<br><input type="text" name="email" placeholder="Email"><br><br>
    Password:<br><input type="password" name="password" placeholder="Password"><br><br>


    <!-- here's the checkbox -->
    Admin: <input type="checkbox" name="admin" /><br><br>

    <input type="submit" value="Save">
</form>

然后我发布值(所有其他字段都可以正常工作,只是复选框没有):

$( "#new_user_form" ).submit(function( event ) 
      event.preventDefault();
      var $form = $( this ),
        username = $form.find( "input[name='username']" ).val(),
        email = $form.find( "input[name='email']" ).val(),
        password = $form.find( "input[name='password']" ).val(),
        admin = $form.find( "input[name='admin']" ).val(),
        url = $form.attr( "action" );

      var posting = $.post( url,  username: username, email: email, password: password, admin:admin  );

      posting.done(function( data ) 
        $( "#message_dialog" ).empty().append( data );
        $ ("#message_dialog" ).dialog(
          modal: true,
          buttons: 
            Ok: function() 
              $( this ).dialog( "close" );
            
          
        );
      );
    );

这段代码用于获取 PHP 中的值:

$user_username      =   $_POST['username'];
$user_email     =   $_POST['email'];
$user_password      =   $_POST['password'];
if (isset($_POST['admin'])) 
    $user_admin = 1;
 else 
    $user_admin = 0;

但是当我回显 $user_admin 时,无论复选框的状态如何,我总是得到“1”。这很奇怪,因为我多次被告知如果未选中该复选框,则不会设置 $_POST 值。

我还尝试在输入元素上使用 value-attribute,并在 PHP 中进行了比较。我的方法都没有奏效,这让我现在发疯了。

注意:我将我的 php 变量 $user_admin 设置为 0 或 1 以将其作为 TINYINT 存储在我的数据库 (mysql) 中。 1 表示“是,用户是管理员”,0 表示“不,他不是管理员”。

请告诉我这里出了什么问题。

【问题讨论】:

复选框没有 value 属性,您正试图从中提取 val() 并通过 jQuery 发送它 - 因此您什么也得不到。 这是因为您是手动建立变量,因此您的 php post 端总会有一个管理员返回。如果您无法正确获取它,请不要创建每个vars。只需将您的表单数据设为var $formData = $form.serializeArray(),然后使用$.post( url, $formData) 请看:api.jquery.com/serialize && api.jquery.com/serializeArray 【参考方案1】:

你可能想要一个布尔值来告诉你复选框是否被选中:

admin = $form.find( "input[name='admin']" ).is(':checked'),

然后在 PHP 中检查它

if (isset($_POST['admin']) && $_POST['admin']) 

【讨论】:

在 jquery 端,它可以工作。我提醒了 admin 变量,根据复选框的状态返回 true 或 false。在 php 站点上,post 变量也具有与 JS 相同的值,但是将其放入我的 $user_admin avriable 时,它​​没有 那么它也应该在 PHP 端工作,只是弄清楚要检查什么,可能你必须检查字符串“true”,或者将其转换为布尔值 (boolean)$_POST['admin']等等? 好的,通过使用 =="true" 检查 $_POST 变量的值来修复它。 但是因为 admin 总是作为数据传递,所以 isset($_POST['admin']) 将始终为真,因此否定它的使用,除非 OP 作为 k/vP 发送表单数据,因为表单数据意味着发送。【参考方案2】:

首先,admin = $form.find( "input[name='admin']" ).val() 将始终返回'on',因为您不会得到是否检查。解决此问题的一种方法是将结尾更改为admin = $form.find( "input[name='admin']" )[0].checked,这将为您提供true |或| false.

其次,因为您将数据作为admin: admin 传递,所以您的服务器端将总是isset($_POST['admin']) 作为TRUE |或| 1 因为从技术上讲,它已经设置好了。当您以admin: admin 手动发送数据时,您是在告诉服务器端,“嘿,这里有一个名为admin 的键,我正在发送一个名为admin 的JS 变量的值!”因此,它isset

为避免这种情况,您可以使用 jQuery 的 .serializeArray() 来获得与 form 已正常提交 (aka, not using e.PreventDefault) 相同的值。所以你的重写可以很简单:

$( "#new_user_form" ).submit(function( event ) 
    event.preventDefault();
    var $form = $(this),
        $data = $form.serializeArray(),
        url = $form.attr( "action" );

    var posting = $.post(url, $data);

    posting.done(function(data) 
        $( "#message_dialog" ).empty().append(data).dialog(
            modal: true,
            buttons: 
                Ok: function() 
                    $( this ).dialog( "close" );
                
            
        );
    );
);

这也意味着,if (isset($_POST['admin'])) 也将按照您的预期工作。


提示:请记住,您始终可以将数据添加到表单的序列化数组中,只需将name/value object 添加到收集的数据中即可。例如,从上面我们有$data = $form.serializeArray()。如果您想为从表单收集的数据添加另一个值,那么您只需:

$data[$data.length] =  name: 'bob', value: 'hello world' ;

因此现在提供另一个值服务器端读取为:$_POST['bob']!

【讨论】:

【参考方案3】:
if (isset($_POST['admin'])) 
    $user_admin = 1;
 else 
    $user_admin = 0;

这表示$_POST 是否有复选框值 并且在您的页面复选框中始终位于 $_POST 但其状态值不同 你可以试试这个

if ($_POST['admin']) 
    $user_admin = 1;
 else 
    $user_admin = 0;

【讨论】:

问题是我发送了复选框的原始数据而不是状态。使用它可能意味着我还必须更改一些 jQuery... 啊,对不起,我忘记了 jquery admin = $form.find( "input[name='admin']" ).is(':checked')【参考方案4】:

这是因为您将值作为空字符串发送(参见下面的示例),请尝试使用 strlen($var)===0 检查其是否为空。 这段代码:

  var posting = $.post( url,  username: username, email: email, password: password, admin:admin  );

将像这样发送数据:

$_POST['username'] = "foo";
$_POST['email'] = "bar";
$_POST['password'] = "foobar";
$_POST['admin'] = ""; // empty string! Because it has no value

【讨论】:

不。当我 var_dumped POST 数组时,我总是得到 $_POST['admin'] => "on" str_len = 2 或 sth。类似

以上是关于PHP:checkbox-isset 总是返回 true的主要内容,如果未能解决你的问题,请参考以下文章

axios http 总是返回空数据

IServiceProvider.GetServices<T>() 是不是总是按注册顺序返回可用的服务实现?

PHP复选框总是返回[重复]

为啥 Facebook PHP SDK getUser 总是返回 0?

数组上的PHP“如果为真”测试总是返回真?

PHP 文件检查总是返回 false