2013-05-19 84 views
0

當我試圖通過PHP插入一條記錄到MySQL時,我遇到了一個非常奇怪的問題,我想知道是否有人可以擺脫它的任何光線,因爲我不知道想法現在。通過PHP MySQL INSERT問題mysql_query

數據庫表:

Field  Type  Null Default Comments 
UserID  bigint(20) No  Autoincrement 
UserGUID text  No  
ServerID int(11)  No  
UserName text  No  
Passwrd  text  No  
Prompt  text  No  
Answer  text  No  
EMail  text  No  
Verified int(11)  No 0  
Language text  No  
Gender  int(1)  Yes  NULL  
DateOfBirth int(11)  Yes  NULL  
Country  int(11)  Yes  NULL  
PostCode text  Yes  NULL  
State  text  Yes  NULL  
Town  text  Yes  NULL  

相關的PHP代碼片段...

public function signupUser($uid, $pwd, $prompt, $answer, $email, $lang, ... &$result) 
{ 
    $guid = $this->getGUID(); 

    $serverID = 1; 
    $result = mysql_query("INSERT INTO User(UserGUID, ServerID, UserName, Passwrd, EMail) " + 
            "VALUES ('$guid', $serverID, '$uid', '$pwd', '$email')"); 

之前有人告訴我,我應該使用庫MySQLi,參數化我的查詢之類的,請注意,這個PHP/MySQL只是一個本地測試工具,在專用網絡上,只有在真正的Web服務(dotNet/Oracle)可用時才用於開發目的。

所以,如果我調用該函數上面合適的參數,$結果回來了......

您的SQL語法錯誤;檢查對應於您的MySQL服務器版本的手冊正確的語法使用近「0」在行1

,但如果我降低了查詢,只是...

$result = mysql_query("INSERT INTO User(UserGUID, ServerID, UserName, Passwrd) " + 
             "VALUES ('$guid', $serverID, '$uid', '$pwd')"); 

它的作品!很高興地插入記錄(儘管在非空字段中有空值!?!)爲了增加更多的複雜性,如果我使用合適的值運行(原始)查詢,例如

INSERT INTO User(UserGUID, ServerID, UserName, Passwrd, EMail) VALUES ('guid', serverID, 'uid', 'pwd', 'email') 

直接對數據庫通過phpMyAdmin,它也可以!

這使我瘋狂。我試着改變字段名稱,可空性,順序,我在查詢中使用哪些字段(在前四個工作之後),值 - 它們都沒有什麼不同。它幾乎看起來好像不需要超過四個字段。

請......任何人......?我真的很難理解爲什麼它不接受第五個領域,我沒有任何意義。不幸的是,返回的錯誤根本沒有任何幫助,太模糊,似乎等同於MS發生的所謂「錯誤」。

如果我必須更換爲mysqli,我會但我寧願不必重新制作測試設備,如果我可以避免它。

+0

由於您正在創建整個SQL查詢(無綁定等),因此將其放入字符串中,執行並將其寫入屏幕:'$ sql =「INSERT ...」; echo $ sql; $ result = mysql_query($ sql);'並且在返回錯誤時查看查詢的實際外觀。 –

+1

php中的連接是用'.',而不是'+'完成的。這可能是問題 –

+0

@VedranŠego好吧,我!你已經間接地爲我回答了。我完全不熟悉PHP(正如你可能已經猜到的那樣),並且一直使用+作爲字符串連接運算符,因爲它似乎可以在其他地方使用。多麼flamin'白癡我假設+會是concat。請隨意添加,作爲正式答案,我會標記它。 @爆炸藥對不起隊友,他擊敗了你,但你現在就是。 – Mike

回答

1

編輯後的啓示:看看在php中的連接運算符是絕對的意見。不是+我會把錢放在那裏是你的問題......在我的第一眼看來,甚至沒有看到它。

在過去的香港專業教育學院運行到奇怪的煩惱有點類似於此

- 並能在反引號columnX封裝我的表和列名,columnY解決它 - 我也嘗試表名「用戶」之間加空格和包含在SQL語法

mysql_query("INSERT INTO User(UserGUID, ServerID, UserName, Passwrd, EMail) " + 
           "VALUES ('$guid', $serverID, '$uid', '$pwd', '$email')"); 

列名的括號看看this question?非常相似,你的結果成功

希望我能有一些幫助

+0

感謝隊友,一些有用的東西,看看那裏。 – Mike

0

如果您的例子是文字,我懷疑任何作品。字符串連接運算符是「。」不是「+」在PHP中。此外,PHP不會解釋單引號內的變量。嘗試重新編寫查詢這樣的:

$result = mysql_query("INSERT INTO User SET UserGUID = '" . $guid . "', ServerID = " . $serverID . ", UserName = '" . $uid . "', Passwrd = '" . $pwd . "'"; 
+0

這個例子是字面的,是的,它是'+'。然而,這些變量很高興在單引號中解釋並進入數據庫。 – Mike

0

我總是創建一個字符串中的SQL,並且,如果有問題,我插入一個echo $sqlerror_log($sql)聲明。

有時候會有一些非常微妙的東西。當您將調試輸出中的查詢複製並粘貼到phpMyAdmin中時,您將看到更有意義的錯誤消息。

有一件事是可能的,變量$email包含突破字符串的東西。在將它們包含在SQL查詢中之前,請確保您使用mysql_real_escape_string