在我的表单中(我通过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表示“不,他不是管理员”。
请告诉我这里出了什么问题。
答案 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