[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: База данных, почему то, возвращает не все результаты!
coder
Делаю сайт. Файловая база. Решил сделать поиск. Файлы лежат в разных таблицах(по разделам). Поиск осуществляется регулярными выражениями(REGEXP выбрал из-за независимости от регистра... Может что нибудь по быстрее посоветуете?), в несколько заходов. Вначале поиск строкой поиска, по имени файлов. Потом строка разбивается на отдельные слова и посылаются новые запросы. Сдесь возникла загвоздка. Строка поиска состояла из одного слова, поэтому и на первом этапе и на втором базе посылается один и тот же запрос(я проверял). Но некоторые записи не находятся на первом этапе, но находятся на втором!!! Как это исправить? Я в последствие поставлю проверку, и если слово только одно, то второй этап не будет выполняться(для экономии ресурсов). Но тогда некоторые значение не будут находится! Вобщем огромная просьба - помогите!
Заранее спасибо.



Спустя 12 минут, 21 секунда (6.05.2007 - 21:04) Patrick написал(а):
Запросы в студию!

Спустя 16 минут, 53 секунды (6.05.2007 - 21:21) coder написал(а):
Код
$sql="SELECT * FROM $table WHERE name REGEXP '$search_string'";
echo($sql."<br>");

foreach($search_words as $word){
$sql="SELECT * FROM $table WHERE name REGEXP '$word'";
echo($sql."<br>");
}

Результат:
SELECT * FROM utilits_antivir WHERE name REGEXP 'norton'
SELECT * FROM utilits_antivir WHERE name REGEXP 'norton'

Если отменить второй запрос, то результатов будет на два меньше...
Всего их около 15.

Спустя 3 минуты, 6 секунд (6.05.2007 - 21:24) coder написал(а):
У меня только одна идея - это из за того что скрипт стоит на моем глючном компе. Но проверить мне больше негде, потомучто хостинг буду покупать не скоро.

Спустя 2 часа, 59 минут, 7 секунд (7.05.2007 - 00:23) Patrick написал(а):
зачем плкупать? воспользуйся бесплантым! Это во первых, а во вторых http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html
PS. Ты был на _forum.smolgrad.ru

Спустя 10 часов, 15 минут, 29 секунд (7.05.2007 - 10:39) Ghost написал(а):
а где коненкт к базе,исполнение запросов и выборка результатов?
как оно все проверялось?

Спустя 11 часов, 9 минут, 36 секунд (7.05.2007 - 21:48) coder написал(а):
Код
$link=mysqli_connect($cfg['host'], $cfg['user'], $cfg['password'], $cfg['name'], $cfg['port'], $cfg['socket']);
if(!$link){
//error_handler() - моя функция для обработки ошибок. После ее выполнения программа останавливаетя.
//Пока она просто выводит их на экран, но потом будет отсылать по email
error_handler("Ошибка при подключение к серверу MySQLi или выборе базы данных.");
};
$sql="SELECT * FROM $table WHERE name REGEXP '$search_string'";
$result=mysqli_query($link, $sql);
if(!$result){
$errno=mysqli_errno($link);
$error=mysqli_error($link);
error_handler("Ошибка обращения к бд: $error (код ошибки: $errno). Таблица - $table.");
return false;};
while($row=mysqli_fetch_array($result)){
$first_of_search_results[]=$row['Id']."|".$table;
};

Спустя 46 минут, 49 секунд (7.05.2007 - 22:35) Ghost написал(а):
это часть кода, и она ничего не выводит на экран
я так могу разве что дописать код и поискать ошибку в дописаной части кода.
для анализа нужен код включающий исполнение и вывод результата для обоих запросов, желательно с разделителем между ними

Спустя 19 часов, 26 минут, 32 секунды (8.05.2007 - 18:01) coder написал(а):
Пока писал для форума урезанную версию, чтобы проще читалось, все заработало! В смысле урезанная версия заработала. Буду постепенно усложнять код.... Скрипт все таки приложу:
Код
<?php
include('../config.inc.php');
$link=mysqli_connect($cfg['host'], $cfg['user'], $cfg['password'], $cfg['name'], $cfg['port'], $cfg['socket']);
if(!$link){
error_handler("Ошибка при подключение к серверу MySQLi или выборе баззы данных.");
};


//функция получает таблицу(строка поиска в глобальной переменной)
//и ищет в ней все вхождения. Возвращает булевское значения.
//Массивы с результатами поиска в глобальных переменных.
function search($table){
//глобальные переменные: ссылка на бд поисковая
//строка(а также она же разбитая на слова и на слова без оконьчаний)
global $link, $search_string, $search_words;
//переменные с результатами поиска
global $first_of_search_results;
global $second_of_search_results;
global $third_of_search_results;
global $fourth_of_search_results;

//первый поисковый запрос
$sql="SELECT * FROM $table WHERE name LIKE '%".$search_string."%'";
//его реализация
$result=mysqli_query($link, $sql);
//Обработка ошибок
if(!$result){
$errno=mysqli_errno($link);
$error=mysqli_error($link);
error_handler("Ошибка обращения к бд: $error (код ошибки: $errno). Таблица - $table.");
return false;
};
//проход по найденым значениям
while($row=mysqli_fetch_array($result)){
//заполнение переменной значениями(id разделитель и таблица)
$first_of_search_results[]=$row['Id']."||||".$table;
};

//третий поисковый запрос(они идут не по порядку)
$sql="SELECT * FROM $table WHERE keywords LIKE '%".$search_string."%'";
//его реализация
$result=mysqli_query($link, $sql);
//Обработка ошибок
if(!$result){
$errno=mysqli_errno($link);
$error=mysqli_error($link);
error_handler("Ошибка обращения к бд: $error (код ошибки: $errno). Таблица - $table.");
return false;};
//проход по найденым значениям
while($row=mysqli_fetch_array($result)){
$third_of_search_results[]=$row['Id']."||||".$table;
};


//теперь не целеком строка поиска обрабатывается, а слова по отдельности
foreach($search_words as $word){

//второй поисковый запрос
$sql="SELECT * FROM $table WHERE name LIKE '%".$word."%'";
//его реализация
$result=mysqli_query($link, $sql);
//Обработка ошибок
if(!$result){
$errno=mysqli_errno($link);
$error=mysqli_error($link);
error_handler("Ошибка обращения к бд: $error (код ошибки: $errno). Таблица - $table.");
return false;};
//проход по найденым значениям
while($row=mysqli_fetch_array($result)){
//запись значений в переменную
$second_of_search_results[]=$row['Id']."||||".$table;
}

//четвертый поисковый запрос
$sql="SELECT * FROM $table WHERE keywords LIKE '%".$word."%'";
//его реализация
$result=mysqli_query($link, $sql);
//Обработка ошибок
if(!$result){
$errno=mysqli_errno($link);
$error=mysqli_error($link);
error_handler("Ошибка обращения к бд: $error (код ошибки: $errno). Таблица - $table.");
return false;};
//проход по найденым значениям
while($row=mysqli_fetch_array($result)){
$fourth_of_search_results[]=$row['Id']."||||".$table;
}};

return true;
}


//запись в глобальные переменные тсроку поиска, и массив со словами поиска
function working_search_string($string){
global $search_string, $search_words;
//обрезание краев
$search_string=trim($string);
//разбивание фразы по отдельным словам
$words=explode(" ", $string);
$search_words=array_unique($words);
};


function cosy_search($string, $tables){
global $first_of_search_results;
global $second_of_search_results;
global $third_of_search_results;
global $fourth_of_search_results;

$search_results=Array();

working_search_string($string);

foreach($tables as $table){
search($table);
};

if(is_array($first_of_search_results)){
$search_results=array_merge($search_results, $first_of_search_results);
}

if(is_array($second_of_search_results)){
$search_results=array_merge($search_results, $second_of_search_results);
}

if(is_array($third_of_search_results)){
$search_results=array_merge($search_results, $third_of_search_results);
}

if(is_array($fourth_of_search_results)){
$search_results=array_merge($search_results, $fourth_of_search_results);
}


$search_results=array_unique($search_results);

return $search_results;
}

//обработчик ошибок
function error_handler($msg){
echo($msg."<br>");
//die();
};



$tables[]="utilits_antivir";
$tables[]="utilits_microsoft";


$search_results=cosy_search("безопас", $tables);

foreach($search_results as $key=>$name){
echo($name."<br>");
};


?>


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.