2015-12-04 28 views
0

我有一個很奇怪的問題,在執行上的MySQL數據庫的查詢:不同的結果執行從phpmyadmin的SQL查詢(良好)和PHP腳本(壞)

  • 從phpMyAdmin的:查詢執行和返回好結果

  • 來自我的PHP腳本:查詢執行,沒有錯誤,行數很多,但表中顯示的值中有近50%是錯誤的!

使用的SQL查詢完全相同,相當長(250行),需要26秒才能在phpmyadmin中執行,並且工作良好。

在我的PHP腳本與mysqli_query()執行的典型方式我想說查詢ISS:

if ($res=mysqli_query($mysqli,$q, MYSQLI_USE_RESULT)){ 
$data = array(); 
    while ($row=mysqli_fetch_assoc($res)){ 
    $data[] = $row; 
    } 
    mysqli_free_result($res); 
    var_dump($data); 
} 

在我取代backtite查詢:(`),以單引號(')。

任何想法爲什麼它使用phpmyadmin,但不是從PHP與mysqli_query()函數?順便說一句phpmyadmin不使用mysqli_query()函數?

沒有錯誤被拋出,我真的失去了這裏,如果有人有一個提示,那將是非常讚賞:)

THX :)

+2

請提供查詢本身。 [工作演示](http://sqlfiddle.com/)會更有幫助。你爲什麼用引號替換反引號? – showdev

+0

'phpMyAdmin'有一個功能,您可以點擊標記爲* create PHP Code *的鏈接,該鏈接將從您的成功聲明中創建PHP代碼,然後您可以像往常一樣替換值。你有沒有嘗試過使用這個來減少錯字錯誤? – Martin

+0

@showdev對不起,我不能提供查詢本身,它太長..我試圖刪除的情況下,它被php misinterperated的情況。是否有任何字符我必須從查詢中刪除PHP? – benoo

回答

0

最有可能的答案是,是的東西之間的不同查詢。因爲您無法輕鬆追蹤250行的差異。使用MySQL查詢日誌中記錄包括查詢MySQL的看到他們,然後比較不同之處:

要禁用或啓用一般查詢日誌或在運行時更改日誌文件名,使用全局general_log和general_log_file系統變量。將general_log設置爲0(或OFF)以禁用日誌或設置爲1(或ON)以啓用它。設置general_log_file以指定日誌文件的名稱。如果日誌文件已經打開,它將被關閉並打開新文件。

東西線沿線的:

SET GLOBAL general_log = 'ON'; 
SET GLOBAL general_log_file= 'querylog.log'; 

.. run queries 
SET GLOBAL general_log = 'OFF'; 

注意,這是一個全局設置,而記錄被激活的服務器將記錄所有客戶端的查詢。你的MySQL也需要超級權限來改變這個設置。或者,您可以更改my.cnf配置文件並重新啓動MySQL。

一旦你有兩個查詢,比較應該顯示你的差異,並指導你到一個修復。

+0

Thx爲您的答案,我會試試這個。我必須在本地MAMP服務器上運行,因爲現在我使用1and1的共享主機,但我不確定日誌功能是否可用。其實我從一個texteditor複製我的查詢,並將其粘貼到我的PHP文件和phpmyadmin,複製不可見字符是否有可能被php誤解? – benoo

+0

這應該在MAMP主機上工作,日誌記錄是MySQL功能。文本中的「特殊」字符可能被PHP誤解。你可以試試'$ res = mysqli_query($ mysqli,mysql_real_escape_string($ mysqli,$ q),MYSQLI_USE_RESULT)這將解決一些潛在的問題。 –

0

YAY在經歷了幾次頭痛之後,偶然解開了這個謎團,但我現在不知道爲什麼,但現在它運行良好。

這裏是我提出讓小的變化它的工作:

  1. 變化從UTF8 PHP文件編碼爲ISO-Latin1的
  2. 重新輸入所有非alphha字符,以確保他們正常

在我的SQL查詢我對我在where子句中檢查字符串的口音,所以我想這個..

的事情是我在同一臺服務器上許多PHP文件,編碼以UTF8格式和帶有重音符號的文字完美運作。

這裏唯一的區別是,口音是我的SQL查詢,也許是服務器託管我的網站不能正確處理UTF-8字符,系統編碼沒有得到很好的配置..

只是可以肯定,我有一個終端訪問服務器,我怎樣才能看到系統編碼?

但問題解決了,一切都好!

相關問題