MySQL запрос, приводящий к многочисленным выводам, делает страницу php пустой - PullRequest
1 голос
/ 02 марта 2011

Я использую функцию запроса для поиска.Все идет хорошо, когда я ищу ключевые слова, которых мало в БД.Однако, когда ключевое слово «популярно» в БД, на экране появляется пустая страница.

function dbSearch($q) //$q is array of keywords
{

  global $mainframe, $option;

  $db =& JFactory::getDBO();

  $str = implode("%' AND text LIKE '%", $q);
  $str = str_replace("AND text LIKE '%-", "AND text NOT LIKE '%", $str);

  $lim   = $mainframe->getUserStateFromRequest("$option.limit", 'limit', 100, 'int'); 
  $lim0  = JRequest::getVar('limitstart', 0, '', 'int');
  $query = "SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE type=4 AND text LIKE '%".$str."%' ORDER BY ref ASC";

  $db->setQuery( $query );
  $rows = $db->loadObjectList();
  $count = count($rows);

  if ($db->getErrorNum())
  {
    echo $db->stderr();
    return false;
  }

  $db->setQuery('SELECT FOUND_ROWS();'); 
  jimport('joomla.html.pagination');
  $pageNav = new JPagination( $db->loadResult(), $lim0, $lim );

  HTML_output::showFoundResults($rows, $pageNav, $count);
}

Что-то не так в запросе выше?почему это не удается по многочисленным результатам?

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Я предполагаю, что ваш PHP занимает много времени, чтобы сгенерировать результаты на основе запроса. В вашем журнале ошибок apache, вероятно, будет отображаться ошибка тайм-аута PHP, так как страница слишком длинна, чем 30 секунд, чтобы сгенерировать страницу.

Попробуйте установить LIMIT на что-то намного меньшее, например, 10, и посмотрите, может ли он генерировать страницу.

Еще одна вещь, которую вы можете сделать, это пропустить «стоп-слова», как они называются, такие слова, как «и», «the» и т. Д., Которые очень распространены в языке. Поисковые системы делают это, и быстрый поиск даст вам больше деталей и списков стоп-слов.

Вы можете увидеть, сколько времени занимает выполнение запроса, запустив запрос в таком инструменте, как phpMyAdmin.

SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE type=4 AND text LIKE '%jabberwocky%' ORDER BY ref ASC";

По сравнению с

SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE type=4 AND text LIKE '%the%' ORDER BY ref ASC";

В том же инструменте запроса, если вы поставите «EXPLAIN» перед запросом, MySQL вернет список всех действий, которые он должен был выполнить для выполнения запроса.

Стоит отметить, что поиск по слову 'the' также будет возвращать результаты для 'теорией' способа, которым построен ваш запрос. Нелегко кодировать без перехода на запрос REGEX.

0 голосов
/ 03 марта 2011

Пустые страницы обычно указывают на фатальную ошибку или, возможно, ошибку синтаксического анализа. Если вы установили максимальное количество ошибок в журнале, и оно по-прежнему показывает пустую страницу, попробуйте добавить [код] php_value display_errors 1 php_value display_startup_errors 1 [/ Код]

в ваш файл .htaccess

0 голосов
/ 02 марта 2011

Пустая страница появляется через сколько раз?Каково значение директивы max_execution_time в файле конфигурации php?

Если это то же самое время, попробуйте увеличить это значение или внести некоторые улучшения в запрос или таблицу.

...