Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: поиск на сайте по mysql

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
sofck
Отправлено: 12 Апреля, 2010 - 00:22:30
Post Id



Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Сент. 2008  


Помог: 0 раз(а)




Как то давно делал поиск для одного сайта, вроде всё работало.
Сейчас вот потребовалось на очередной сайт сделать поиск, нашел этот скрипт.
Почему когда ввожу русские слова для поиска по mysql
то получаю ошибку:
CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql_num_rows() expects parameter 1 to be resource, boolean given in

а на английском всё нормально.
////////
если добавляю в конфиг
CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql_query("SET NAMES 'cp1251'");
  2. mysql_query("SET CHARACTER SET 'cp1251'");

то ошибку не выдает но ничего не находит...((

(Отредактировано автором: 12 Апреля, 2010 - 00:36:09)

 
 Top
Viper
Отправлено: 12 Апреля, 2010 - 08:31:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




мда... индусы сдают позиции по говнокоду...

вам же четко написали что нужно передавать в функцию... код приведите что вы там "пишите"...


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
sofck
Отправлено: 12 Апреля, 2010 - 10:54:35
Post Id



Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Сент. 2008  


Помог: 0 раз(а)




ну это если сократить и не писать вспомогателный код.
хотя не осбо понимаю зачем две одинаковые функции keywords_text и keywords_title
CODE (htmlphp):
скопировать код в буфер обмена
  1. function keywords_text($words)
  2.        {
  3.               $keywords = split(' ', $words);
  4.           $num_keywords = count($keywords);
  5.           for ($i=0; $i<$num_keywords; $i++)
  6.          {
  7.            if ($i)
  8.            {
  9.              $keywords_string .= "or text like '%".$keywords[$i]."%' ";
  10.            }
  11.            else
  12.            {
  13.              $keywords_string = "text like '%".$keywords[$i]."%' ";
  14.            }
  15.          }
  16.            return $keywords_string;
  17.        }
  18.    function keywords_title($words)
  19.       {
  20.              $keywords = split(' ', $words);
  21.          $num_keywords = count($keywords);
  22.          for ($i=0; $i<$num_keywords; $i++)
  23.          {
  24.            if ($i)
  25.            {
  26.              $keywords_string .= "or title like '%".$keywords[$i]."%' ";
  27.            }
  28.            else
  29.            {
  30.              $keywords_string = "title like '%".$keywords[$i]."%' ";
  31.            }
  32.          }
  33.            return $keywords_string;
  34.        }
  35.  
  36.  
  37.  if(isset($_POST['send']))
  38.  {
  39.    $words = trim($_POST['keyword']);
  40.    $words = strip_tags($words);
  41.    $words = str_replace("'", "", $words);
  42.    $words = str_replace('"', "", $words);
  43.    $words = str_replace("-", "", $words);
  44.    $words = str_replace(",", "", $words);
  45.  }
  46.  
  47.   $var = keywords_text($words);
  48.   $var2 = keywords_title($words);
  49.   if(($var) || ($var2))
  50.    {
  51.                                 include("inc/db.php");  
  52.               $sql = "SELECT id, text, title, date, author FROM catalog WHERE ".$var." OR ".$var2."";
  53.               $result = mysql_query($sql);
  54.               $num_rows = mysql_num_rows($result);
  55.                            
  56.         do{echo $myrow['text'];}while($myrow = mysql_fetch_array($result));
  57.         }
 
 Top
Viper
Отправлено: 12 Апреля, 2010 - 13:29:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




а как должно работать условие
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE ".$var." OR ".$var2.""
?
я чего-то в доках mysql такого не встречал...


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
sofck
Отправлено: 12 Апреля, 2010 - 17:03:01
Post Id



Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Сент. 2008  


Помог: 0 раз(а)




Ну а если проще! то почему вот такой код работает только с английскими буквами.
При вводе русских же получаю ошибку
mysql_fetch_array() expects parameter 1 to be resource, boolean given in search.php on line 5


CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql_connect("localhost","root","");
  2. mysql_select_db("blog");
  3. $search=$_POST["search"];
  4. $result = mysql_query("SELECT * FROM tb1 WHERE text LIKE '%$search%'");
  5. while($r=mysql_fetch_array($result))
  6. {      
  7. $message=$r["text"];
  8. echo $message;
  9. }
  10.  

(Отредактировано автором: 12 Апреля, 2010 - 17:10:41)

 
 Top
WildZero
Отправлено: 13 Апреля, 2010 - 08:09:40
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




А что mysql_error() пишет??
 
 Top
Viper
Отправлено: 13 Апреля, 2010 - 08:38:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




а так

PHP:
скопировать код в буфер обмена
  1. for ($i=0; $i<count($result)) {
  2.         echo $row->text;
  3. }


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
JustUserR
Отправлено: 13 Апреля, 2010 - 16:59:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




sofck пишет:
Если добавляю в конфиг то ошибку не выдает но ничего не находит...((
Вероятно нужно установить не только кодировку MySQL-соединения - но также проверить кодировку самого PHP-скрипта и получаемых и отправляемых данных - ведь если их кодировка не совпадает то коды символов будут разные и поиск не получится Если кодировка действительно в определенных местах не совпадает то используйте iconv для перекодировки - а если используются регулярные выражения и сложные строковые функции но не забудьте поставить локаль


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
sofck
Отправлено: 14 Апреля, 2010 - 00:44:23
Post Id



Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Сент. 2008  


Помог: 0 раз(а)




JustUserR пишет:
sofck пишет:
Если добавляю в конфиг то ошибку не выдает но ничего не находит...((
Вероятно нужно установить не только кодировку MySQL-соединения - но также проверить кодировку самого PHP-скрипта и получаемых и отправляемых данных - ведь если их кодировка не совпадает то коды символов будут разные и поиск не получится Если кодировка действительно в определенных местах не совпадает то используйте iconv для перекодировки - а если используются регулярные выражения и сложные строковые функции но не забудьте поставить локаль


Скорей всего вы правы!!!

А случаем не могли бы подсказать функцию что бы он определяла в какой кодировке строка запроса и переводила её в кодировку удобную для базы если он отличаеться от нужной
 
 Top
JustUserR
Отправлено: 14 Апреля, 2010 - 09:04:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




sofck пишет:
Скорей всего вы правы!!! А случаем не могли бы подсказать функцию что бы он определяла в какой кодировке строка запроса и переводила её в кодировку удобную для базы если он отличаеться от нужной
Благодарю Сложность работы с кодировками заключается в том что формат передачи произвольных текстовых данных не предусматривает передачу с ним кодировки текста - то есть в общем случае определить ее невозможно разве что эврестически (По набору символов чтобы например они были кириллецей а не псевдографиков в выбираемой кодировке Улыбка Но при раболе в web задача несколько упрощается - во-первых получаемую от пользователя кодировку можно посмотреть в accept-charset или же определять ее с помощью JS на клиентской сторооне и передавать с формой запроса Во-вторых при раболе с базой данных можно схитрить и полробовать получить collation таблицы который по сути и есть кодировка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
sofck
Отправлено: 15 Апреля, 2010 - 10:22:20
Post Id



Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Сент. 2008  


Помог: 0 раз(а)




Ну вообщем разобрался и вот что получилось.
По крайне мере работает нормально. Можно искать не только одно слово, с регистром тоже всё гуд, ну и с кодировкой тоже справляеться.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?
  3. mysql_connect("localhost","root","");
  4. mysql_query("SET CHARACTER SET cp1251");
  5. mysql_query("SET NAMES cp1251");
  6. setlocale(LC_ALL, 'ru_RU.CP1251');
  7. $words = $_POST['keyword'];
  8. $words = strtolower($words);
  9. $words = trim($words);
  10. $words = strip_tags($words);
  11. $words = str_replace("'", "", $words);
  12. $words = str_replace('"', "", $words);
  13. $words = str_replace("-", "", $words);
  14. $words = str_replace(",", "", $words);
  15.  
  16.   function multi($words)
  17.       {
  18.              $keywords = split(' ', $words);
  19.          $num_keywords = count($keywords);
  20.          for ($i=0; $i<$num_keywords; $i++)
  21.          {
  22.            if ($i)
  23.            {
  24.              $keywords_string .= "or info like '%".$keywords[$i]."%' ";
  25.            }
  26.            else
  27.            {
  28.              $keywords_string = "info like '%".$keywords[$i]."%' ";
  29.            }
  30.          }
  31.            return $keywords_string;
  32.        }
  33.                 $var = multi($words);
  34.  
  35. $result = mysql_query("SELECT * FROM table WHERE ".$var." COLLATE cp1251_general_ci");
  36. while($data=mysql_fetch_array($result))
  37. {      
  38. $message=$data["info"];
  39. echo $message.'<hr>';
  40. }
  41. ?>
  42.  


Может кто нибудь внесет какие нибудь поправки или дополнения, то буду благодарен.
А так кому нибудь может тоже пригодиться!
 
 Top
Viper
Отправлено: 15 Апреля, 2010 - 11:21:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




setlocale не есть хорошим решением. хотя иногда и нужен.
а вот писать в запросах COLLATE это нехорошо.

все str_replace можно заменить одним
PHP:
скопировать код в буфер обмена
  1. $arr = array('\'', '"', '_', ',');
  2. $arr_1 = array('', '', '', '');
  3. $words = str_replace($arr, $arr_1, $words);


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
sofck
Отправлено: 15 Апреля, 2010 - 15:06:39
Post Id



Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Сент. 2008  


Помог: 0 раз(а)




Viper пишет:
setlocale не есть хорошим решением. хотя иногда и нужен.
а вот писать в запросах COLLATE это нехорошо.

все str_replace можно заменить одним
PHP:
скопировать код в буфер обмена
  1. $arr = array('\'', '"', '_', ',');
  2. $arr_1 = array('', '', '', '');
  3. $words = str_replace($arr, $arr_1, $words);


до использования setlocale у меня русский текст вообще не воспринимался.
А благодаря COLLATE стал возможен регистронезависимый поиск
))
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Апреля, 2010 - 16:34:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. #
  2. while($data=mysql_fetch_array($result))
  3. {      
  4. $message=$data["info"];
  5. echo $message.'<hr>';
  6. }

Будет проще:
CODE (htmlphp):
скопировать код в буфер обмена
  1. #
  2. while($data=mysql_fetch_array($result))
  3. {      
  4. echo $data["info"].'<hr>';
  5. }

Зачем там лишняя переменная?
 
 Top
JustUserR
Отправлено: 15 Апреля, 2010 - 16:41:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Viper пишет:
Setlocale не есть хорошим решением. Хотя иногда и нужен.
Я бы с вами не согласился и рекоммендовал его использовать всегда - все зачастую проблемами при работе со строкомыми функциями и регулярными выражениями становится отсутствие установленной верной локали
Viper пишет:
А вот писать в запросах COLLATE это нехорошо
Если он подставляется автоматически функцией то ничего особенно плохого здесь нет - зато точно уверены что нет проблем ни с кодировкой передачи ни кодировкой хранения данных
sofck пишет:
Может кто нибудь внесет какие нибудь поправки или дополнения, то буду благодарен.
В идеале определять кодировку по collcation и всюду устанавливать ее при работе с БД - а потом с помощью iconv переводить в кодировку PHP-скрипта и выводимых данных согласно заголовку Content-type


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB