PHP:checkbox-isset始终返回true

时间:2013-11-19 15:28:07

标签: php jquery mysql checkbox

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

<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值。

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

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

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

4 个答案:

答案 0 :(得分:3)

您可能需要一个布尔值来告诉您是否选中了复选框:

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

然后在PHP中检查

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

答案 1 :(得分: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变量的值1}}!”因此,它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']

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:-1)

这是因为您将值作为空字符串发送(请参阅下面的示例),请尝试使用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