php mysql查询的问题

时间:2009-02-27 20:30:33

标签: php mysql

我有一个表单,其中method = post提交到表单处理程序文件,该文件将帖子写入数据库,然后将结果通过电子邮件发送给用户。

我已经编写了一个插入语句但是在处理表单时我遇到了错误,但不是数据库错误我不确定问题是什么。这是代码 -

// 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());
}

我得到的错误是 -

  

SQL错误:SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在“100,101,102,103,104,105,106,107,108”附近使用正确的语法值(Marty Martin,313 Orlando Av'在第1行

提交值

name = Marty Martin
address = 313 Orlando Ave
address2 = Anytown, VA
email = foo@foo.com
100 = on
101 = off
10* are all checkboxes so are either on or off

这里有什么问题?

6 个答案:

答案 0 :(得分:9)

请参阅:

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

如果你必须使用mysql库,那么请确保你通过mysql_real_escape_string运行所有输入,否则使用Prepared Statements。

然后,当您将查询放在一起时,将所有VALUES包装在引号中(单个或双重将起作用)。

答案 1 :(得分: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 :(得分:3)

你需要在VALUES

中的每个项目周围使用单引号

编辑:你的$ _POST []变量也可能在字符串中没有评估。您需要使用不同的语法或使用evil extract();

答案 3 :(得分:2)

调试这些问题的方法是查看实际发送的查询,看看它有什么问题。当你看到它出了什么问题时,你可以弄清楚是什么价值,并通过适当的调整和/或验证检查来修复它。

另外,请记住:字符串被''(单引号)包围,未为字符串指定的值应作为NULL(无引号)传入。如果您的表或列名称是非标准的或有其他问题,请不要忘记在其名称周围添加“`(反引号);这些也可能导致语法错误。

答案 4 :(得分:2)

除了用单引号包装变量外,还应该转义POST变量中的特殊字符。请查看mysql_real_escape_string method documentation以获取解释和示例。

在预览中,进行转义以帮助防止XKCD取笑的SQL injection attacks种类。除非它发生在您身上并且很容易避免,并不容易避免。

要回答评论者的问题,是的,您还可以使用PHP和MySQL执行prepared statements。这是使用mysql_real_escape_string方法的替代方法。

答案 5 :(得分: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);