2011-05-09 85 views
0

我收到以下代码中的以下错误。MySQL语法:您的SQL语法中有错误...

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 '@doe.com,username,5f4dcc3b5aa765d61d8327deb882cf99,09/05/2011 1:11:13 AM)' at line 1

$username = $_GET['username']; 
$password = md5($_GET['password']); 
$firstname = $_GET['firstname']; 
$lastname = $_GET['lastname']; 
$email = $_GET['email']; 
$date = uk_date(); 
$conn = mysql_connect('localhost', 'myuser', 'mypass'); 
mysql_select_db('dbname'); 
$query = "INSERT INTO accounts (FirstName, LastName, Email, Username, Password, LastLoginDate) VALUES (". $firstname . ",". $lastname ."," . $email . "," . $username . "," . $password . "," . $date . ")"; 
$result = mysql_query($query) or die(mysql_error()); 
echo 'Success'; 
mysql_close($result); 

能不能请您让我知道,我的问题是什么?我是MySQL和PHP的新手,所以请你提供一个解释,说明我做错了什么,以备日后参考。

+3

问题是,你是(等等等等等等等等等等等等等等),而且你没有使用准备好的语句。 – BoltClock 2011-05-09 00:17:04

+0

准备好的陈述是什么意思? – 2011-05-09 00:18:16

+1

看看[PHP PDO手册]中的这篇文章(http://php.net/manual/en/pdo.prepared-statements.php)。准备好的语句对于帮助防范大多数Web应用程序易受攻击的SQL注入攻击都是不可或缺的。 – BoltClock 2011-05-09 00:18:54

回答

5

你有没有在你的INSERT引用的任何值,你应该说更多的东西是这样的:

$query = "INSERT INTO accounts (FirstName, LastName, Email, Username, Password, LastLoginDate) VALUES ('". $firstname . "','". $lastname ."','" . $email . "','" . $username . "','" . $password . "','" . $date . "')"; 

你也应该使用mysql_real_escape_string所有这些变量,以确保所有嵌入式引号并且这些都被正确编码。

一个更好的版本是这样的:

$query = sprintf("INSERT INTO accounts (FirstName, LastName, Email, Username, Password, LastLoginDate) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')", 
    mysql_real_escape_string($firstname), 
    mysql_real_escape_string($lastname), 
    mysql_real_escape_string($email), 
    mysql_real_escape_string($username), 
    mysql_real_escape_string($password), 
    mysql_real_escape_string($date)); 

你也应该听BoltClock和使用PDO和占位符,所以你不必担心你的报价和逃逸这么多。 PDO也将使数据库更容易切换。

+0

你的引号在第一个查询中是错误的(第一个''')。你让他们切换。 – judda 2011-05-09 00:23:42

+0

@judda:好眼睛,谢谢,并修复。你已经指出了一个很好的理由,不要试图用这种方式来建立一个查询:太多的引号互相争斗,造成不可理解的混乱。 – 2011-05-09 00:39:19

4

大概用户输入有一个单引号字符,因此在将它作为查询发送到数据库之前,它将会安全到escape special character,这将阻止您的脚本进行sql注入。

$query = "INSERT INTO accounts (FirstName, LastName, Email, Username, Password, LastLoginDate) VALUES ('$firstname', '$lastname', '$email','$username','$password', '$date')"; 
0

一旦你逃过你的变量,如其他建议,你需要围绕他们的报价,如果他们是字符串varialbles:

mysql_select_db('dbname'); 
$query = "INSERT INTO accounts 
     (FirstName, LastName, Email, Username, Password, LastLoginDate) 
     VALUES ('". $firstname . "','". $lastname ."','" . $email . "','" . 
     $username . "','" . $password . "','" . $date . "')"; 
$result = mysql_query($query) or die(mysql_error()); 
echo 'Success'; mysql_close($result); 

在这种情况下,我加入单引号。你现在不应该有任何错误