strlen иногда неправильно определяет длину?!

Статус
В этой теме нельзя размещать новые ответы.

gregzem

Гуру форума
Регистрация
21 Окт 2007
Сообщения
202
Реакции
66
В чудеса не верю, но этот случай реально заставляет задуматься про бубен и куклу вуду.

Пример:

PHP:
<?
  $a = "6Ы│_";
  $n = strlen($a);
  if ($n != 4)
     print "ERROR. Count detected = ".$n." and correct number is 4"; 
          else
     print "OK"; 
?>


А теперь открываем Для просмотра ссылки Войди или Зарегистрируйся
и начинаем много раз нажимать F5.

Иногда результатом работы скрипта является вот это
3_instead_of_4.gif

вот такая конфигурация:

Код:
PHP Version 5.2.6 

System  FreeBSD fhe7.hoster.ru 7.0-STABLE FreeBSD 7.0-STABLE #2: Wed Dec 24 21:08:46 MSK 2008 

Build Date  Feb 13 2009 18:13:56  

Configure Command  './configure' '--with-layout=GNU' '--with-config-file-scan-dir=/usr/local/etc/php' '--disable-all' '--enable-libxml' '--with-recode' '--with-libxml-dir=/usr/local' '--enable-reflection' '--program-prefix=' '--with-pgsql' '--with-mhash' '--enable-fastcgi' '--with-apxs2=/usr/local/sbin/apxs' '--with-regex=php' '--with-zend-vm=CALL' '--enable-zend-multibyte' '--disable-ipv6' '--prefix=/usr/local' '--mandir=/usr/local/man' '--infodir=/usr/local/info/' '--build=amd64-portbld-freebsd7.0'  

Server API  Apache 2.0 Handler

Есть идеи, что за леший?
 

Liver

Гуру форума
Регистрация
24 Сен 2008
Сообщения
315
Реакции
92
Нужно верить в чудеса. Я один раз делал примочку к вордпрессу и работал напрямую с базой в контексте вп. так там были запросы
PHP:
$r=mysql_query("...");
так вот такие запросы, которые в вп, если ничего не найдено возвращали false. А мои запросы null. var_export показывал, что там null и дебагер тоже.

Однако при этом невозможно было поймать.
ни if(!$r) ни if(!empty($r)) ни if($r==null) ни if($r!=false) ни if(!is_null($r)) не срабатывали.

После этого я не доверяю пхп и больше верю в чудеса.
 

ozware

Профессор
Регистрация
22 Апр 2007
Сообщения
322
Реакции
46
gregzem, пишите багу на сайте разработчиков php
 

ustas76

Постоялец
Регистрация
15 Фев 2007
Сообщения
140
Реакции
25
И там дадут в бубен, кодировка в utf и винда еще? читай про кодировки, mb_* и т.д.
 

EugeneVC

Гуру форума
Регистрация
28 Окт 2007
Сообщения
295
Реакции
84
так проверять нельзя

PHP:
if($r!=false){
...
}
только так:

PHP:
if($r!==false){
...
}
 

Liver

Гуру форума
Регистрация
24 Сен 2008
Сообщения
315
Реакции
92
EugeneVC

И так тоже было. Я просто не стал перечислять все перепробованные варианты. Тем более что $r вообще то был null. Я даже пробовал разные экзотические вроде
PHP:
if(intval($r)==0)
и это не работало. Просто глюк, он и в африке глюк. Я так и не понял его причин и просто запросил данные из базы средствами самого вп. И проявлалась данная бага на денвере.
 

gregzem

Гуру форума
Регистрация
21 Окт 2007
Сообщения
202
Реакции
66
И там дадут в бубен, кодировка в utf и винда еще? читай про кодировки, mb_* и т.д.

1. Кодировка cp1251
2. Если бы оно всегда не работало, это объяснило бы проблему. Оно не работает время от времени.
 

admLoki

генератор случайного PHP
Регистрация
14 Сен 2006
Сообщения
481
Реакции
104
1. Кодировка cp1251
2. Если бы оно всегда не работало, это объяснило бы проблему. Оно не работает время от времени.
Но все-таки возможно что данные приходят в UTF-8. Попробуйте сравнить результаты strlen() и mb_strlen().
 

Dogmat

Постоялец
Регистрация
16 Фев 2007
Сообщения
122
Реакции
40
Однако при этом невозможно было поймать.
ни if(!$r) ни if(!empty($r)) ни if($r==null) ни if($r!=false) ни if(!is_null($r)) не срабатывали.

Первый раз вижу подобную проверку. Как минимум mysql_num_rows здесь лучше подходит.
 

admLoki

генератор случайного PHP
Регистрация
14 Сен 2006
Сообщения
481
Реакции
104
PHP:
$encoding = mb_detect_encoding($string);
var_dump(mb_strlen($string, $encoding));
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху