2013-04-05 99 views
-1

我有一個小問題,當我提出我的論壇數據我得到這個錯誤:PHP PDO錯誤1064

SQLSTATE[42000]: Syntax error or access violation: 1064 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 'Explain, Country, IP, Hostname)

我的代碼是這樣的:

  $STH = $DBH->prepare("INSERT INTO `Applications` (`Username`, `Email`, `Age`, `Reason`, `Explain`, `Country`, `IP`, `Hostname`) VALUES ($username, $email, $age, $reason, $explain, $country, $ip, $hostname)"); 
     $STH->execute();

我不能似乎找到了問題。

+0

這是奇怪的。從顯示的消息,它看起來像這個問題是在解釋 - 這是一個保留字,所以它必須被包裹成'backtick'符號。然而它被封裝在顯示的查詢中。 – raina77ow 2013-04-05 20:48:22

+0

是的,你要引用所有這些值(不是'$ username',但'$ DBH->報價($用戶名)') – raina77ow 2013-04-05 20:50:02

+1

請不建議使用'$ DBH->報價()直接'。 – tadman 2013-04-05 20:51:59

回答

2

你沒有正確使用PDO,創造大量的SQL注入的問題。放入SQL的值需要正確轉義。

placeholder method使然做這種方式:

$STH = $DBH->prepare("INSERT INTO `Applications` (`Username`, `Email`, `Age`, `Reason`, `Explain`, `Country`, `IP`, `Hostname`) VALUES (:username, :email, :age, :reason, :explain, :country, :ip, :hostname)"); 
$STH->bindParam(':username', $username); 
$STH->bindParam(':email', $email); 
... (remaining columns) .. 
$STH->bindParam(':hostname', $hostname); 
$STH->execute(); 

這是爲了確保你的SQL是properly escaped的最佳途徑。

+1

違揹你是絕對正確的關於這個(+1),但它並沒有看起來像顯示錯誤原因。但是,如果OP將查詢重寫入此問題,問題可能會消失。 ) – raina77ow 2013-04-05 20:52:36

+0

順便說一句,一次可發送佔位符PARAM值到'execute'爲好。 – raina77ow 2013-04-05 20:56:11