2012-02-19 77 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