2012-03-30 48 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