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 :: баг в substr

 PHP.SU

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


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

> Без описания
Ch_chov
Отправлено: 24 Сентября, 2008 - 08:18:58
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




Кто нибудь сталкивался с этим ?
http://bugs.php.net/bug.php?id=45311
Как то можно его обойти?
Или заменить substr другой функцией?
 
 Top
valenok Модератор
Отправлено: 24 Сентября, 2008 - 10:29:23
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




Поставить более новую версию php =)
(Добавление)
А если обращаться к строке через отдельные буквы ? Тоесть echo $data[0].$data[1] ;


-----
Truly yours, Sasha.
 
My status
 Top
Ch_chov
Отправлено: 24 Сентября, 2008 - 11:18:36
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




На хостинге PHP 5.2.6 и пропатчить нет возможности.
Цитата:
А если обращаться к строке через отдельные буквы ?

Мне кажется это приведет к значительному увеличению времени работы скрипта.
Функция substr находится во вложеном цикле.
 
 Top
Джур
Отправлено: 24 Сентября, 2008 - 13:00:38
Post Id



Посетитель


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


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




несовсем понял... где тут ошибка... хм...

substr с utf8 работает неправильно и это нормально...
mb_substr с utf8 работает и это правильно...

Но вот за каким лешим в utf8 строчку пихать не utf-ные символы я недопонимаю. Это же не простой набор байтов.

Ch_chov уточните плиз что вам сделать надо.


-----
Тамбовский каджит тебе товарищ
 
 Top
Ch_chov
Отправлено: 24 Сентября, 2008 - 14:12:02
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




Я так понял, что баг проявляется тогда, когда смешиваются данные в разных кодировках.
Цитата:
Проблема заключается в том, что в PHP 5.2.6 функции mb_substr() и substr() некорректно вырезают часть данных, если эти данные имеют хоть один символ кириллицы, не закодированный в UTF8.

Цитата отсюда: http://forum[dot]vingrad[dot]ru/forum/s/[dot][dot][dot]opic-226758[dot]html

Я сам не могу понять почему так происходит, у меня везде используется только ANSI
Причем баг проявляется не постоянно, а периодически 2-3 раза в сутки.
В том что глючит именно substr установил точно.

(Отредактировано автором: 24 Сентября, 2008 - 14:13:06)

 
 Top
valenok Модератор
Отправлено: 24 Сентября, 2008 - 15:08:32
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




Тоесть у вас не бинарные данные вовсе ???


-----
Truly yours, Sasha.
 
My status
 Top
Ch_chov
Отправлено: 24 Сентября, 2008 - 17:31:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




Нет не бинарные и не UTF.
Обычная строка с кириллицей.

(Отредактировано автором: 24 Сентября, 2008 - 17:35:19)

 
 Top
valenok Модератор
Отправлено: 24 Сентября, 2008 - 21:42:31
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




Тогда чего то вы не то рассказываете про баги. Там дело совсем в другом. Код показывайте.


-----
Truly yours, Sasha.
 
My status
 Top
Ch_chov
Отправлено: 25 Сентября, 2008 - 12:00:51
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




Я думаю, что если в строке есть кирилица, не закодированная в UTF8, то substr воспринимает ее как бинарные данные. Поэтому описанный баг распостраняется и на этот случай. На локальном компе стоит PHP 4.4.0 и ни каких глюков не разу не было.

Скрипт представляет собой обычный шаблонизатор. В строку $str_cont_old загружется содержимое базового шаблона из файла, затем в теле цикла происходит поиск шаблонов заключенных в фигурные скобки и замена их содержимым соответствующего файла.

Вот код:
PHP:
скопировать код в буфер обмена
  1.  
  2. //$str_cont_old  - исходная строка с HTML кодом и шаблонами
  3. //$str_cont_new - готовая строка для выдачи в браузер
  4.  
  5.  
  6. $e=0;
  7. while(true) {
  8.         if(!$b=strpos($str_cont_old,'{',$e)) break; //Позиция откр. фиг. скобки.
  9.         $e=strpos($str_cont_old,'}',$b); //Позиция закр. фиг. скобки
  10.  
  11.   //Считываем то что находится между скобками
  12.         $tname=substr($str_cont_old, $b+1, $e-$b-1);
  13.        
  14.                 ........
  15.             ........
  16.             ........
  17.  
  18.  //Производим замену
  19.         $str_cont_new=str_replace('{'.$tname.'}' ,$cont_inc_tpl, $str_cont_new);
  20. }


Опытным путем установил, что в момент когда происходит ошибка strpos совершенно верно находит позиции открытой и закрытой скобок. А вот substr начинает считывать название шаблона не с $b+1 а на несколько символов дальше.
Например:
После обработки такого участка строки
'...<title>{title}</title>...'
функция substr должна вернуть имя шаблона $tname='title', а вместо этого я получаю $tname='/titl'

(Отредактировано автором: 25 Сентября, 2008 - 13:46:49)

 
 Top
valenok Модератор
Отправлено: 25 Сентября, 2008 - 17:33:07
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




А зачем вам искать чьи то позиции ? Нельзя просто заменять содержимое квадратных скобок на то что надо ?


-----
Truly yours, Sasha.
 
My status
 Top
Ch_chov
Отправлено: 25 Сентября, 2008 - 17:58:10
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


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




Цитата:
А зачем вам искать чьи то позиции ? Нельзя просто заменять содержимое квадратных скобок на то что надо ?


Не квадратных, а фигурных. Нахмурился

Каким образом заменять? Я перерыл все строковые функции на этот счет.

(Отредактировано автором: 25 Сентября, 2008 - 18:01:09)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB