2012-03-08 92 views
2

我的問題涉及爲什麼一段代碼工作,兩個沒有,以及我如何得到不工作的代碼工作。不($ VAR1包含 '值1' 等)

mysql_select_db("webuser1", $con); 

mysql_query("INSERT INTO users (column 1, column2) VALUES ('value1', 'value2')"); 

mysql_close($con); 

編號NO1:

mysql_select_db("webuser1", $con); 

mysql_query("INSERT INTO users (column 1, column2) VALUES ($var1, $var2)"); 

mysql_close($con); 

和代碼NO2不起作用($ _ POST [

,工程的代碼'值1']包含 '值1' 等):

mysql_select_db("webuser1", $con); 

mysql_query("INSERT INTO users (column 1, column2) VALUES ($_POST['value1'], $_POST['value2'])"); 

mysql_close($con); 

我不是應該能夠插入$ VAR或$ _POST在MySQL?我希望你不會覺得這個Q愚蠢,但我一直在尋找解決方案,但我還沒有理解他們。 謝謝

+0

寫入值您可以直接在查詢中插入$ _ POST,但** [你不應該](http://en.wikipedia.org/wiki/SQL_injection)** – 2012-03-08 13:00:22

+0

你正在尋找的解決方案只是一個**基本語法。**學習你的語言的語法正在使用是必需的。 – 2012-03-08 13:29:39

回答

6

在SQL中,字符串值需要被引用:

VALUES ('value1', 'value2')" 

當您使用變量:

VALUES ($var1, $var2)"); 

他們中沒有報價......除非引號是值本身。

所以,如果$var1 = 'value1'; $var2 = 'value2'然後(該變量是在您的字符串插值後)你的SQL是這樣的:

VALUES (value1, value2)" 

您可以通過添加引號解決立即解決問題:

VALUES ('$var1', '$var2')"); 

但這不修復您的主要安全漏洞,並讓您的數據以不同的方式破壞查詢。

您應該避免通過彙編來自變量的字符串來創建SQL語句。這種方式會導致SQL注入安全漏洞。使用支持bound arguments的接口。他們會爲你處理報價和逃跑。

+0

我知道存在安全風險,但是我在本地局域網服務器上執行此操作只是爲了理解它是如何工作的,並未在安全問題的任何地方使用。謝謝你的回答。 – Sergei 2012-03-08 13:15:55

+0

輸入數據中的拼寫錯誤可能會導致數據出現問題,因此相信所有用戶並不是一個明智的想法。做正確的事情並不艱難,你應該養成遵循最佳實踐的習慣。 – Quentin 2012-03-08 13:18:05

+1

@Sergei這只是錯誤的答案。沒有安全問題,只有格式問題。 SQL查詢**中的字符串應被引用並轉義**,否則您的查詢格式不正確。這是一個**語法**規則,你必須遵循**總是**。 – 2012-03-08 13:25:33

-1

您的變量不被識別爲變量。他們是你的字符串的一部分。

嘗試:

mysql_query("INSERT INTO users (column 1, column2) VALUES ('".$var1."', '".$var2."')"); 

同樣爲您的第二個問題。

+0

**危險**:這有[安全漏洞](http://bobby-tables.com/) – Quentin 2012-03-08 13:02:57

+0

這不會解決問題,因爲它仍然沒有將引號插入到最終的SQL中。 – Quentin 2012-03-08 13:03:22

+0

編輯意味着代碼現在可以工作,但它仍然存在SQL注入問題。 – Quentin 2012-03-08 13:13:53

-1

因爲POST變量有'在裏面,你必須連接而不是。

I.E.

mysql_query("INSERT INTO users (column 1, column2) VALUES (".$_POST['value1'].", ".$_POST['value2'].")"); 

或者

mysql_query("INSERT INTO users (column 1, column2) VALUES ({$_POST['value1']}, {$_POST['value2']})"); 

這也是一個好主意,把引號中的變量,如果其空(或字符串,而不是整數)

+0

**危險**:這有[安全漏洞](http://bobby-tables.com/)。無論如何,它不會工作,最終的SQL需要引用值。 – Quentin 2012-03-08 13:03:54

0

好像你不轉義並正確引用你的參數到mysql。

插入MySQL中,你需要逃避他們至少變量:$var = mysql_real_escape_string($_POST['variable'])然後".. VALUES ('".$var."')"

你也應該可能考慮使用庫連接到MySQL像DOCTRINEhttp://www.doctrine-project.org/處理這個給你。

+0

PDO(或mysqli)就足夠了,對於簡單的任務來說,完全成熟的ORM like原則可能太多 – 2012-03-08 13:02:24

-1
mysql_select_db("webuser1", $con); 

mysql_query("INSERT INTO users (column 1, column2) VALUES ('$var1', '$var2')"); 

mysql_close($con); 

當不使用圍繞值的撇號時,它應該是非字符串值。

+0

撇號,而不是逗號 – jprofitt 2012-03-08 13:03:27

+0

**危險**:這有[安全漏洞](http:// bobby- tables.com/) – Quentin 2012-03-08 13:04:19

3

MySQL需要單引號括住的字符串...所以你需要像這樣:

mysql_query("INSERT INTO users (column 1, column2) VALUES ('".$_POST['value1']."', '".$_POST['value2']."')"); 

的一切,是不是字符串你不需要單引號(')

如前所述,您不應該忘記將要放入數據庫的字符串轉義出來。例如 使用準備好的語句。通過綁定這些參數,可以確保您傳遞的值是您在準備好的語句中指定的類型。

+0

這裏的代碼有[安全漏洞](http://bobby-tables.com/)。確保你注意答案的最後一段。 – Quentin 2012-03-08 13:02:33

1

有一件事你必須明白:
不能插入$變量或$ _ POST值到MySQL表。

只能將它們插入到另一個PHP變量中。

哪個變量,如果碰巧是有效的SQL查詢,可以發送到mysql,這將在表中添加相應的值。

所以,你必須先學習正確的PHP字符串語法。

所以,PHP讓你3種不同添加一個關聯數組成員成字符串的方法:

$array['key'] = 'world'; 
$str = "Hello ".$array['key']; 
$str = "Hello {$array['key']}"; 
$str = "Hello $array[key]"; 

也有SQL語法問題。
SQL查詢中的字符串必須被轉義和引用。你的代碼缺乏。

0
$var1=$_POST['variable_name1']; 
$var2=$_POST['variable_name2']; 
$q="INSERT INTO `users` (`column 1`, `column2`) VALUES ($var1, $var2)"; 

$result=mysql_query($q); 
0

使用此解決方案,其100%的工作

mysql_query("INSERT INTO users (column 1, column2) VALUES ('{$_POST[value1]}', '{$_POST[value2]}')"); 

當您使用{},你不需要在'