2011-05-06 151 views
0

我一直在这一行收到错误1064:这个php脚本有什么问题?

$sqlquery = "INSERT INTO user 
       (username, password, email, key) 
      VALUES 
       ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."','".$activation."')";` 
+7

我想你应该阅读这个:http://en.wikipedia.org/wiki/SQL_injection – jantimon 2011-05-06 14:33:55

+0

请详细说明你的意思 – Urinprobe 2011-05-06 14:34:54

+1

'回声是什么结果? $ sqlquery;' – Ikke 2011-05-06 14:35:31

回答

12

key是您在查询中使用的保留字,必须使用反引号将其转义。保留字错误是1064.

您还应该考虑学习一些安全理论,特别是关于在查询中使用非转义值(直接来自用户)。

下面的代码是安全和固定:

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 
$email = mysql_real_escape_string($_POST['email']); 
$sqlquery = "INSERT INTO `user` (`username`, `password`, `email`, `key`) VALUES ('{$username}','{$password}','{$email}','{$activation}')"; 

一个简单的规则,当谈到查询(嗯,什么事)是永远不要相信用户的输入。通过使用mysql_real_escape_string,您正在转义变量,以便它们可以安全地插入到数据库中。没有它,你可以允许用户运行他们想要的任何查询。

为了将来的参考,这里是一个complete list of MySQL Reserved Words

+0

thx! 这只是一个简单的测试,没有安全要求;) – Urinprobe 2011-05-06 14:38:21

+0

足够公平,然后只是引用'key'和工作完成:-) – 2011-05-06 14:39:14

+0

+1解释安全问题。即使这只是一个测试,你也应该习惯于以正确的方式过滤用户输入(来自外部的任何内容)。 – kapa 2011-05-06 14:46:51

2

MySQL错误1064通常意味着SQL语法错误。看看你的SQL语句,以确保它是有效的。

调试这些类型错误的好方法是打印出SQL,然后尝试在MySQL中手动执行它。

+0

Jip这是真的,只要我们不知道每个变量的内容,但它会发布确切的问题:) – tim 2011-05-06 14:35:07

+0

1064您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在'1'附近使用正确的语法VALUES('Simon','abc123','[email protected]','58d2f92539a5492fe6ef')第一行 – Urinprobe 2011-05-06 14:35:59

1

尝试围绕每个变量$varmysql_real_escape_string(),如

代替$_POST["password"] 使用mysql_real_escape_string($_POST["password"])

+0

这不是主要 – 2011-05-06 14:37:42

+0

@rudi我会说这是查询的主要问题之一 – kapa 2011-05-06 14:48:25

0

直接从HTTP请求中获取用户定义的值并将它们连接成一个SQL查询是B-A-D,并且可能是您的语法错误的来源。确保你逃脱所有的价值。

1

做,如果你使用这个,而不是你仍然得到错误:

$query = sprintf("INSERT INTO user 
        (username, password, email, `key`) 
        VALUES 
        ('%s','%s','%s','%s')", 
        mysql_real_escape_string($_POST["username"]), 
        mysql_real_escape_string($_POST["password"]), 
        mysql_real_escape_string($_POST["email"]), 
        mysql_real_escape_string($_POST["activation"])); 

$result = mysql_query($query); 

KEY is a MySQL reserved word - 它需要用反引号逃脱其在查询中使用。反引号是没有必要的,如果不使用保留字...