2012-08-27 50 views
1

我新的SQL/PHP和我不能克服的錯誤消息:如何在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 '1'," 

我試圖調試這個錯誤,但我在我的劇本找「1」,我只有該位:

//enter information into table 
$sql = "INSERT INTO $_SESSION[table_name] VALUES 
     ('$_POST[first_name]', '$_POST[last_name]', '$_POST[user_name]', 
      password('$_POST[password]'), 'Administrators', '', '', '0', '$_SESSION[admin_email]', 
      '$_POST[redirect_to]', '1', '$date')"; 

$result = @mysql_query($sql,$connection) or die(mysql_error()); 

if($result) 
{... 
  1. 我沒有找到任何與此問題。

  2. 我不知道如何調試這個,我應該如何繼續查找錯誤?任何線索?

我不知道我期待在正確的地方的腳本,但是這是我的「1」的唯一入口,該錯誤消息告訴我一下...

在檢查手冊後,SQL中的語法似乎是正確的...我在WAMP服務器中使用MySQL 5.5.24

我試圖安裝「登錄重定向v1.31」用於用戶身份驗證。

如果有人能幫助我,我會非常感激!

+1

您應該做的第一件事就是打印出您正在生成的SQL - 其中的某些內容不符合您期望的格式。 – andrewsi

+0

它可能無助於回答你的問題,但你應該停止使用'mysql_ *'函數。他們正在被棄用。請使用[PDO](http://php.net/manual/en/book.pdo.php)(自PHP 5.1起支持)或[mysqli](http://php.net/manual/en/book)。 mysqli.php)(自PHP 4.1起支持)。如果您不確定要使用哪一個,請閱讀本文(http://www.deprecatedphp.com/mysql_/)。 – Matt

+0

**你的代碼容易受到SQL注入**你真的應該使用[prepared statements](http://stackoverflow.com/a/60496/623041),你將變量作爲參數傳遞給它沒有得到評估的SQL。如果你不知道我在說什麼,或者如何解決它,請閱讀[Bobby Tables]的故事(http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain) 。 – eggyal

回答

7

STOP

之前你去更遠的地方使用此代碼,閱讀了有關SQL injection attacks,並FIX代碼

你的語法錯誤幾乎可以肯定是由噴射故障從造成的,無疑額外的'您插入到查詢中的數據中的某處。您正在將原始的用戶提供的數據傳遞到查詢中,允許惡意用戶接管您的服務器,破壞您的數據庫,踢你的狗等...

除此之外,請執行echo $sql並將結果粘貼到此處,我們將能夠向您顯示確切的'所在的位置。

+0

我會閱讀關於注入攻擊。謝謝! $ echo打印: INSERT INTO授權VALUES('Francisco','Arantes','myusername',密碼('********'),'管理員','','', '0','[email protected]',' 並停止。 – Francisco

+0

在瀏覽器的頁面上做'查看源代碼' - 沒有理由讓sql語句停止,除非有html或其他東西看起來像你的瀏覽器隱藏的HTML標籤,這可以解釋你的錯誤信息中出現的'>',永遠不會相信你的瀏覽器顯示的東西 - 總是看看頁面源代碼。 –

+0

謝謝!我得到了答案但不能上傳8小時,因爲我是新手,沒有足夠的聲望點。打印完回聲後,我意識到問題出在沒有明確定義的$ _POST [redirect_to]上。 – Francisco

0

第一步將隔離哪些部分的查詢是引用。

您的錯誤引用了一列,並插入了一個字段。我看到你通過了'1''1'是一個字符串,而1是一個整數。

如果Column Schema表示它是int列類型,則刪除單引號並重試。

0

對於初學者這樣做:

  1. 使用的echo語句打印$ SQL屏幕(或登錄到文件)。

  2. 將語句複製到您最喜歡的SQL編輯器中,並嘗試查找錯誤。

很難調試動態SQL語句而不知道執行代碼時綁定了哪些變量。

0

非常感謝你幫助我解決這個問題。

在變量上打印一個$echo給了我答案。問題在於$_POST[redirect_to]由於之前沒有很好定義而無法正常工作。

我改變了輸入變量爲空字符串,它的工作:

$sql = "INSERT INTO $_SESSION[table_name] VALUES 
     ('$_POST[first_name]', '$_POST[last_name]', '$_POST[user_name]', 
     password('$_POST[password]'), 'Administrators', '', '', '0', 
     '$_SESSION[admin_email]', ' ', '1', '$date')"; 

$result = @mysql_query($sql,$connection) or die(mysql_error()); 

if($result){ 
    // ... 
} 

我會研究該漏洞SQL injections和工作了,我很新的這一點。

謝謝你的更正和提示!