2012-02-19 70 views
-1

我有一個web應用程序,可以使用表單中的簡單文本區從數據庫運行查詢。我有一個問題:php檢查mysql查詢是否會運行

我需要檢查查詢內存消耗之前它運行(所以它不會崩潰我的服務器)。

有沒有一種方法使用PHP或MySQL來做到這一點?

例如,我有3個表:

新聞(idNews,創建,idMedio,狀態) NewsAreaMain(idNewsAreaMain,idNews,idAreaMain) AreaMain(idAreaMain)

並且有人嘗試了實際上使服務器崩潰的以下查詢:

SELECT DISTINCT News.* 
FROM NewsAreaMain, News 
WHERE 
    (
     (
      NewsAreaMain.idNews=News.idNews 
      AND News.idNews IN 
       (
        SELECT DISTINCT News.idNews 
        FROM News, NewsAreaMain 
        WHERE NewsAreaMain.idNews=News.idNews 
        AND NewsAreaMain.idAreaMain="1" 
       ) 
     ) 
    AND idMedio="5" 
    OR (idMedio="6") 
    ) 
AND News.state=1 
ORDER BY created DESC 
LIMIT 0, 20; 
+0

不是我所知道的。確保你相信你的用戶修改你的數據庫。 – 2012-02-19 18:25:05

+0

你想允許執行任意的用戶輸入查詢?這聽起來不是一個好主意。 – 2012-02-19 18:25:16

+0

這聽起來有點可怕,你是否以任何方式清理和限制用戶查詢......或允許他們輸入自由文本sql? – okyanet 2012-02-19 18:25:55

回答

2

不是我所知道的。如果有的話,我確信所有共享的託管站點都會使用它並阻止過於密集的查詢,而不是使用這種骯髒的方法來殺死運行時間過長的查詢。

這可能是你唯一的選擇。定期檢查SHOW PROCESSLIST中的第一個條目,如果「時間」超過某個值(以秒爲單位,那麼10可能是確定的,如果緊的話,值大於60的任何情況都是要求麻煩),殺死它與KILL QUERY #####(使用作爲SHOW PROCESSLIST的一部分返回的相關ID號碼)。

+0

迄今爲止這是最好的答案,謝謝! – 2012-02-20 06:44:17

0

沒有mysql查詢應該會導致服務器崩潰。 Mysql相當不錯。
看來這不是一個查詢,但一些代碼實際上崩潰了服務器。
如果您在意提供有關「崩潰服務器」的更多詳細信息,我相信會有解決方案。

+0

事情是這樣的: BD: 新聞(idNews) NewsAreaMain(idNewsAreaMain,idNews,idAreaMain) AreaMain(idAreaMain) QUERY: SELECT DISTINCT新聞* FROM NewsAreaMain,新聞 WHERE \t( \t ( \t NewsAreaMain.idNews = News.idNews 和News.idNews IN \t( \t SELECT DISTINCT News.idNews 從新聞,NewsAr eaMain WHERE NewsAreaMain.idNews = News.idNews AND NewsAreaMain。idAreaMain = 「1」 ) \t \t) \t AND idMedio = 「5」 OR(idMedio = 「6」) ) AND News.state = 1個 ORDER BY創建DESC LIMIT 0,20; – 2012-02-19 18:43:28

+0

是嗎?這是一個查詢。但你怎麼知道這是記憶問題? – 2012-02-19 18:44:35

+0

,因爲當我檢查日誌時,mySQL的內存峯值在紅色(i.ve更新了問題,現在查詢更清晰) – 2012-02-19 18:48:18