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 端总会有一个管理员返回。如果您无法正确获取它,请不要创建每个var
s。只需将您的表单数据设为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的主要内容,如果未能解决你的问题,请参考以下文章
IServiceProvider.GetServices<T>() 是不是总是按注册顺序返回可用的服务实现?