2009-02-27 64 views
0

我有一個form = form提交表單處理文件,它將文章寫入數據庫,然後通過電子郵件發送結果給用戶。問題php mysql查詢

我寫了一個insert語句,但是當表單正在處理中時,我得到一個錯誤,但不是數據庫專家,我真的不知道問題是什麼。這裏的代碼 -

// MYSQL QUERY 
$result = mysql_query("INSERT INTO 2009_prize_results 
    (name, address, address2, email, 100, 101, 102, 103, 104, 105, 106, 107, 108) 
VALUES 
    ($_POST[name],$_POST[address],$_POST[address2],$_POST[email] 
    ,$_POST[100],$_POST[101],$_POST[102],$_POST[103],$_POST[104],$_POST[105] 
    ,$_POST[106],$_POST[107],$_POST[108])"); 
if (!$result) { 
    die ("SQL error: " . mysql_error()); 
} 

和錯誤我得到is--

SQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '100, 101, 102, 103, 104, 105, 106, 107, 108) VALUES (Marty Martin,313 Orlando Av' at line 1

提交值分別爲

name = Marty Martin 
address = 313 Orlando Ave 
address2 = Anytown, VA 
email = [email protected] 
100 = on 
101 = off 
10* are all checkboxes so are either on or off 

我有錯的是什麼?

+0

下次請使用正確的格式:http://stackoverflow.com/editing-help – Gumbo 2009-02-27 20:33:36

回答

3

你需要圍繞每個項目單引號VALUES

編輯:也是你的$ _ POST []變量可能不會在字符串中進行評估。您需要使用不同的語法或使用邪惡的extract();

+0

謝謝,那是問題的一部分! – Marty 2009-02-27 20:39:32

1

您需要將您的值放在引號中。例如:

... VALUES(Marty 

應該

... VALUES('Marty' 

嘗試:

// Concatenated for readability 
$query = "INSERT INTO 2009_prize_results " . 
     "(name, address, address2, email, 100, 101, 102, " . 
     "103, 104, 105, 106, 107, 108) VALUES " . 
     "('{$_POST['name']}', 
      '{$_POST['address']'}, 
      '{$_POST['address2']}', 
      '{$_POST['email']}', 
      '{$_POST[100]'}, '{$_POST[101]}', '{$_POST[102]}', '{$_POST[103]}', 
      '{$_POST[104]}', '{$_POST[105]}', '{$_POST[106]'}, '{$_POST[107]}', 
      '{$_POST[108]'})"; 

$result = mysql_query($query); 
+0

詛咒!比我快41秒! – tkotitan 2009-02-27 20:35:43

+0

請看,這是一個很好的例子,說明爲什麼PHP的嵌入字符串替換是一個糟糕的想法。 – staticsan 2009-03-01 23:37:40

+0

是的,更好的方法可以是使用sprintf(或者甚至更好:準備好的語句)。對於簡單的事情,儘管雙引號提供的替換可能非常有用。 – Ross 2009-03-02 08:57:27

2

調試這類問題的方法是查看實際發送的查詢並查看它出了什麼問題。當你發現它有什麼問題時,你可以弄清楚什麼樣的價值會影響工作並通過適當的調整和/或驗證檢查來修復它。另請注意:字符串被''(單引號)包圍,並且未爲字符串指定的值應以NULL(不含引號)形式傳入。如果你的表或列的名稱是非標準的或其他問題,請不要忘記它的名稱周圍有`(反引號);那些也會導致語法錯誤。

+0

謝謝,您對非標準名稱是正確的,在數據​​庫中將列名稱作爲整數似乎也會造成問題。 – Marty 2009-02-27 20:40:26

9

請參閱:

Little Bobby Tables :-) How does the SQL injection from the "Bobby Tables" XKCD comic work?

如果你必須使用MySQL庫,那麼請確定你正在運行的所有的通過mysql_real_escape_string你的投入,否則使用預處理語句。

然後,當您將查詢放在一起時,將所有VALUES用引號引起來(單個或雙個都可以)。

4

如果您實際上有這樣的數字名稱列,您可能需要用反引號對它們進行分隔,以免它們被SQL解釋爲文字數字。並請爲了您自己的理智和我的格式化您的查詢。

$result = mysql_query(" 
INSERT INTO 2009_prize_results(
     name 
    , address 
    , address2 
    , email 
    , `100` 
    , `101` 
    , `102` 
    , `103` 
    , `104` 
    , `105` 
    , `106` 
    , `107` 
    , `108` 
) 
VALUES (
    -- values here as others have stated 
)"); 
2

除了在單引號中包含變量外,還應該在您的POST變量中轉義特殊字符。請參閱mysql_real_escape_string method documentation以獲取解釋和示例。

在預覽時,轉義完成以幫助防止XKCD使用的排序SQL injection attacks。除非它發生在你身上並沒有什麼樂趣,而且很容易避免。

要回答評論者的問題,是的,您也可以使用PHP和MySQL執行prepared statements。這是使用mysql_real_escape_string方法的替代方法。