php/mysql复选框对True对1


php/mysql checkbox on vs. True vs. 1

这应该不难,但我正在努力,所以我想我应该请求帮助,因为我在网上找不到任何特定的东西。

我是从表单上的复选框发布的。当我冻结输出时,当我在浏览器窗口中查看查询字符串时,它会显示变量的名称=on。同样,当我回显发布的值时,它们会显示为on。问题是当插入数据库时,尽管输入TRUE有效,但on无效。字段类型为tinyint(1)。我必须将所有的on转换为TRUE吗。我觉得这以前从来都不是问题。

<form action="processform.php" method="post">
<input type = "checkbox" name="var1" CHECKED>
<input type = "checkbox" name="var2" CHECKED>
<input type="submit" name="submit" value="submit"></form>

另一端的脚本。

$var1 = $_POST['var1'];
$var2 = $_POST['var2'];
echo $var1; //echoes "on"
$sql = "INSERT into table (var1,var2) VALUES (TRUE,TRUE)"; //works
$sql = "INSERT into table (var1,var2) VALUES ($var1,$var2)"; //does not work.
$sql = "INSERT into table (var1,var2) VALUES ('$var1','$var2')"; //does not work.
mysql_query($sql);

这是打字错误吗?无法想象您真的需要将每个变量的"on"空白更改为TRUE或FALSE

如果要返回除ON 之外的值,则需要包含一个value=""字段

<input type = "checkbox" name="var2" value="1" CHECKED>

您可以为HTML中的每个复选框添加一个value="TRUE"

或者,您对$var1$var2的分配可以将它们设置为TRUE/FALSE1/0,具体取决于是否设置了$_POST['var1']$_POST['var2']。我对HTML中复选框的记忆是,如果设置了复选框,它们就会出现在$_POST[]中,如果没有设置复选框,则不存在。

$var1 = isset($_POST['var1']);
$var2 = isset($_POST['var2']);

我希望您在问题中没有实际使用代码,这是SQL注入攻击的一个很好的开端。

当前,您的代码容易受到SQL注入的攻击。考虑将其更改为类似的内容,您将能够避免SQL注入,并且您尝试做的事情应该有效:

$var1 = isset($_POST['var1']) ? 1 : 0;
$var2 = isset($_POST['var2']) ? 1 : 0;
echo $var1; //echoes "on"
$sql = "INSERT into table (var1,var2) VALUES (TRUE,TRUE)"; //works
$sql = "INSERT into table (var1,var2) VALUES ($var1,$var2)"; //should work.
$sql = "INSERT into table (var1,var2) VALUES ('$var1','$var2')"; //should also work.
mysql_query($sql);

TRUE布尔值计算为1,=int
另外2个字符串要么是实际文本$var1的"on",但字段类型是int,所以没有意义

您只需将输入值设置为1即可完成。

字段是一个tinyint(1)。不能将字符串"on"放入整数字段!

因此,您可以使用TRUE/FALSE或1/0。

如果传入的值为"on"并返回FALSE或0,那么编写一个返回TRUE或1的小函数就不需要太多工作。。。类似的东西

function ConvertCheckboxValue($value) {
    return $value == "on" ? 1 : 0;
}

TRUE之所以有效,是因为PHP不是强类型的,任何"truthy"都会转换为字符串"1",这是在构建sql语句时发生的。最简单的解决方案是使输入的value属性="1"。当你把它从$_GET数组中取出时,它将是一个字符串"1",它将在数据库中的tinyint字段中工作。

<input type="checkbox" name="var2" value="1" />

你肯定想对它进行预处理,以避免像其他人提到的那样注入sql

$var2 = $_GET['var2'] === '1' ? '1' : '0';

我特别将$var2设置为字符串"1"或"0",这样就更清楚地表明,您实际上期望的是tinyint字段的这些值。

我就是这样做的:

var myVal = ( $('#myCheckbox').is(':checked') ) ? 1 : 0;
alert('myVal is: ' +myVal); //alerts 1 if checked, 0 if not checked

jsFiddle演示