2012-03-30 105 views
0

这应该不难,但我努力与它,所以我想我会请求帮助,因为我找不到任何具体的网络。php/mysql复选框与真正与1

我从表单上的复选框发布。当我在冻结输出时查看浏览器窗口中的查询字符串时,它显示变量的名称= on。同样,当我回应他们显示的发布值时。问题是插入到数据库时,虽然输入TRUE的作品,开启不。 Fieldtype是tinyint(1)。我是否必须将所有的ons转换为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

+0

为什么你认为试图插入一个字符串中一个int字段类型是一个好主意? – 2012-03-30 02:52:57

回答

4

您需要包括一个value=""场,如果你想返回以外的值,然后再接通

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

只是改变HTML仍然留下SQL注入的可能性。 – 2012-03-30 03:37:21

+0

这工作。谢谢! – user1260310 2012-03-30 14:39:22

1

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

或者,你的任务,以$var1$var2可以将它们设置为TRUE/FALSE1/0取决于是否$_POST['var1']$_POST['var2']设置与否。我对HTML中复选框的回忆是,如果设置了它们,则存在于$_POST[]中,如果未设置,则不存在。

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

我希望你实际上并没有使用的代码在你的问题,这是一个SQL注入攻击的罚款开幕。

+1

是的,如果没有检查,键/值不会在那里。 – joshuahealy 2012-03-30 02:57:34

+0

在这种情况下,他可以使用'isset()'。感谢您的确认@appclay。 – tomlogic 2012-03-30 03:23:56

0

True布尔结果为1,= INT
其他2要么是“上”的实际文本$ VAR1的字符串,但字段类型为int,所以是没有意义的

你可以只设置输入值为1,并用它来完成。

0

该字段是tinyint(1)。你不能把字符串“on”放到一个整数字段中!

所以你可以使用TRUE/FALSE或1/0。

它不会有太大的工作写一个小函数返回TRUE或1如果传入的值是“开”和返回FALSE,否则为0 ...像

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

关于是一个字符串,它不是一个普通的字符串,因为它是由复选框产生的。从这个意义上说,我的回忆是,它类似于TRUE,它也不是一个字符串,可以进入Tinyint。我相信是一个布尔值,尽管我可能是错的。我有另一个相同的脚本,从复选框更新为tinyint字段。也许这是因为这是一个插入,而不是更新....但是,我会尝试包括值1.关于注入攻击,这只是一个原型...所有的表单数据将通过一个函数进行消毒生产。 – user1260310 2012-03-30 06:11:20

+0

当我设置value = 1时,有趣的是,它通过“on”给出了和以前一样的问题。当我设置value =“TRUE”时,它传递TRUE。另一方面,为了使插入语句正常工作,我必须从tick中取出TRUE。但是,对于这个解决方案,我不太满意,因为在蜱上使用它在另一个脚本中正在为我工​​作。不一致似乎不正确。也许我应该发布。 – user1260310 2012-03-30 14:15:44

+0

纠正,值= 1确实正确传递。 – user1260310 2012-03-30 14:29:10

1

目前,你的代码很容易受到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); 
+0

应该可以使用'isset' - 因为它是一个复选框,它既可以设置,也可以不关心值(1),也可以不设置(0)。它可以像'$ var1 = isset($ _ POST ['var1']);''一样简单。 – tomlogic 2012-03-30 03:22:08

+0

@tomlogic - 你是正确的,编辑来反映这一点。 – 2012-03-30 03:30:33

0

杰作,因为PHP不是强类型,以及任何“truthy”转换成一串“1”,这正在建立该sql语句时发生。最简单的解决方案是使输入的值属性=“1”。当你将它从$ _GET数组中取出时,它将是一个字符串“1”,它将在数据库的tinyint字段中起作用。

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

你肯定会想预处理,以避免SQL注入像其他的都提到

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

我的$ VAR2专门设置为“1”的字符串或“0”,因此更清楚的是,您实际上期待着tinyint字段的这些值。

+0

实际上,他的例子中的TRUE是在SQL语句中,而不是由PHP处理。 MySQL会将布尔文字“TRUE”设置为1,将“FALSE”设置为0. – tomlogic 2012-03-30 03:25:29

+0

已将它放在下面的答案中。谢谢! – user1260310 2012-04-15 16:50:04

0

这是我要做的事:

var myVal = ($('#myCheckbox').is(':checked')) ? 1 : 0; 

alert('myVal is: ' +myVal); //alerts 1 if checked, 0 if not checked 

jsFiddle Demo