2011-05-09 47 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); 

在這種情況下,我加入單引號。你現在不應該有任何錯誤

相關問題