2009-02-27 83 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方法的替代方法。