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
Форумы портала PHP.SU :: Версия для печати :: Проблема с регистрами
Форумы портала PHP.SU » » Кодировки и все смежное » Проблема с регистрами

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

1. _mitya - 16 Августа, 2011 - 14:53:11 - перейти к сообщению
есть скрипт поиска с автозаполненим. он работает, но ищет не все.
к примеру слово "письмо" и "Письмо" находит, а "ПИСЬМО" нет. чтото можно решить?

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $q = strtolower( $_GET["q"] );
  4. if (!$q) return;
  5.  
  6. $dbhost = "localhost";          // Database Host
  7. $dbuser = "root";                       // User
  8. $dbpass = "";                   // Password
  9. $dbname = "db122";                      // Name of Database
  10.  
  11. mysql_connect( $dbhost, $dbuser, $dbpass ) or die( mysql_error() );
  12. mysql_select_db( $dbname ) or die( mysql_error() );
  13. mysql_query("SET NAMES 'utf8'");
  14. // Replace "TABLE_NAME" below with the table you'd like to extract data from
  15. $data = mysql_query( "SELECT * FROM material" )
  16. or die( mysql_error() );
  17.  
  18. // Replace "COLUMN_ONE" below with the column you'd like to search through
  19. // In between the if/then statement, you may present a string of text
  20. // you'd like to appear in the textbox.
  21. while( $row = mysql_fetch_array( $data )){
  22.         if ( strpos(mb_strtolower( $row['name'] ), $q ) !== false ) {
  23.                 echo $row['name'] . " \n";
  24.         }
  25. }
  26. ?>
2. EuGen - 16 Августа, 2011 - 14:58:24 - перейти к сообщению
Проще делать это в запросе:
PHP:
скопировать код в буфер обмена
  1. $data = mysql_query( "SELECT * FROM material WHERE name LIKE '%".mysql_real_escape_string($q)."%'" )
3. PATCH - 16 Августа, 2011 - 14:59:52 - перейти к сообщению
ненаходит ваше ПИСЬМО из за скорее всего то что вы весь текст приводите к нижнему регистру) mb_strtolower
4. _mitya - 16 Августа, 2011 - 15:03:47 - перейти к сообщению
EuGen пишет:
$data = mysql_query( "SELECT * FROM material WHERE name LIKE '%".mysql_real_escape_string($q)."%'" )



а с этим что делать
PHP:
скопировать код в буфер обмена
  1.  
  2. while( $row = mysql_fetch_array( $data )){
  3.         if ( strpos(mb_strtolower( $row['name'] ), $q ) !== false ) {
  4.                 echo $row['name'] . " \n";
  5.         }
  6. }

как теперь цикл организовать не пойму
5. EuGen - 16 Августа, 2011 - 15:13:51 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. while( $row = mysql_fetch_array( $data ))
  2. {
  3.                 echo $row['name'] . " \n";
  4. }
6. _mitya - 16 Августа, 2011 - 15:14:14 - перейти к сообщению
PATCH пишет:
ненаходит ваше ПИСЬМО из за скорее всего то что вы весь текст приводите к нижнему регистру) mb_strtolower

а как без этого делать? без этого оно не работает.
как по-другому тогда?
(Добавление)
EuGen пишет:
#
while( $row = mysql_fetch_array( $data ))
#
{
#
echo $row['name'] . " \n";
#
}

не, не работает так. автозаолнение не работает. если просто окей нажать, найдет.

CODE (javascript):
скопировать код в буфер обмена
  1. <script type="text/javascript" charset="windows-1251" src="js/jquery-1.2.6.pack.js"></script>
  2. <script type="text/javascript" charset="windows-1251" src="js/jquery.autocomplete.pack.js"></script>
  3. <link href="style.css" rel="stylesheet" type="text/css" />
  4. <script type="text/javascript">
  5. $().ready(function() {
  6.         $("#targetDiv").autocomplete("autocomplete.php", {
  7.                 width: 654,
  8.                 selectFirst: true
  9.         });
  10.        
  11. });
  12. </script>

это то, что я вставляю на странице поиска.
7. _mitya - 17 Августа, 2011 - 09:39:36 - перейти к сообщению
Так все-таки мжно что-то сделать, чтоб находило слова верхнего регистра типа "ПИСЬМО" ??
8. illy - 17 Августа, 2011 - 10:11:04 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $text="Чипсы Письмо Симпсоны пиСьмо Футурама ПИСЬМО";
  3. if($z=preg_match_all('#письмо#mUsi',$text,$v)){
  4. echo 'Найдено: '.sizeof($v[0]).'совпадения<br><br>';
  5. for($n=0;$n!=sizeof($v[0]);$n++){
  6. echo $v[0][$n].'<br>';
  7. }
  8. $m=preg_replace('#(письмо)#mUsi','<b>\1</b>',$text);
  9. echo '<br>В тексте: '.$m;
  10. }
  11. ?>
  12.  
9. _mitya - 17 Августа, 2011 - 11:07:31 - перейти к сообщению
ничего не происходит если это ввести.
я в пхп не силен. это вообще реально сделать без огромного переделывания кода?
10. EuGen - 17 Августа, 2011 - 12:02:45 - перейти к сообщению
Тогда http://phpfaq[dot]ru/debug

С вещами же вроде
_mitya пишет:
я в пхп не силен
помочь себе можете только Вы. Дерзайте - учитесь.
Пример с SQL я привел - нужно запрашивать у БД уже верную информацию (сообразно поисковому слову) и выводить все найденные результаты.
11. _mitya - 17 Августа, 2011 - 14:16:21 - перейти к сообщению
я не знаю как пользоваться дебагом.
происходит такая вещь.
если искать Письмо - все ок.
а если ПиСьмо, то его не ищет автозаполнение.
может что-то с кодировкой?
12. illy - 17 Августа, 2011 - 14:27:09 - перейти к сообщению
Попробуй так:
PHP:
скопировать код в буфер обмена
  1. while( $row = mysql_fetch_array( $data )){
  2. if($z=preg_match_all('#'.$q.'#mUsi',$row['name'],$v)){
  3. $m=preg_replace('#('.$q.')#mUsi','<b>\1</b>',$row['name']);
  4. echo 'Найдено: '.sizeof($v[0]).'совпадения в тексте '.$m.'<br><br>';
  5. for($n=0;$n!=sizeof($v[0]);$n++){
  6. echo $v[0][$n].'<br>';
  7. }
  8. }
  9. ?>
13. _mitya - 17 Августа, 2011 - 14:53:49 - перейти к сообщению
пишет в автозаполнении совпадения найдены, но опять не выводит ПИСЬМО.
и когда вводишь п - находит письмо и Письмо, а когда вводишь пи - только письмо. странно.
в чем может быть проблема? то, что вводиться - переходит в нижний регистр, то что в базе - переводится в нижний регистр - все должно быть окей. не пойму.
может правда это ког\дировка utf?

а ни у кого нету рабочего примера автозаполнения?
14. illy - 17 Августа, 2011 - 15:57:35 - перейти к сообщению
проблема решена. Всё дело было в кодировке

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $q = strtolower( $_GET["q"] );
  3. if (!$q) return;
  4.  
  5. $dbhost = "localhost";          // Database Host
  6. $dbuser = "root";                       // User
  7. $dbpass = "";                   // Password
  8. $dbname = "db122";                      // Name of Database
  9.  
  10. mysql_connect( $dbhost, $dbuser, $dbpass ) or die( mysql_error() );
  11. mysql_select_db( $dbname ) or die( mysql_error() );
  12. mysql_query("SET NAMES 'utf8'");
  13. // Replace "TABLE_NAME" below with the table you'd like to extract data from
  14. $data = mysql_query( "SELECT * FROM material" )
  15. or die( mysql_error() );
  16.  
  17. if(mysql_num_rows($data) > 0){
  18.     while($row = mysql_fetch_assoc($data)){
  19.         if(mb_strpos(mb_strtolower($row['name'], 'UTF-8'), $q, 0, 'UTF-8') !== FALSE){
  20.             echo $row['name'] . " \n";
  21.         }
  22.     }
  23. } 
  24. ?>

 

Powered by ExBB FM 1.0 RC1