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

Есть идеи, что за леший?
 
Нужно верить в чудеса. Я один раз делал примочку к вордпрессу и работал напрямую с базой в контексте вп. так там были запросы
PHP:
$r=mysql_query("...");
так вот такие запросы, которые в вп, если ничего не найдено возвращали false. А мои запросы null. var_export показывал, что там null и дебагер тоже.

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

После этого я не доверяю пхп и больше верю в чудеса.
 
gregzem, пишите багу на сайте разработчиков php
 
И там дадут в бубен, кодировка в utf и винда еще? читай про кодировки, mb_* и т.д.
 
так проверять нельзя

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

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

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

1. Кодировка cp1251
2. Если бы оно всегда не работало, это объяснило бы проблему. Оно не работает время от времени.
 
1. Кодировка cp1251
2. Если бы оно всегда не работало, это объяснило бы проблему. Оно не работает время от времени.
Но все-таки возможно что данные приходят в UTF-8. Попробуйте сравнить результаты strlen() и mb_strlen().
 
Однако при этом невозможно было поймать.
ни if(!$r) ни if(!empty($r)) ни if($r==null) ни if($r!=false) ни if(!is_null($r)) не срабатывали.

Первый раз вижу подобную проверку. Как минимум mysql_num_rows здесь лучше подходит.
 
PHP:
$encoding = mb_detect_encoding($string);
var_dump(mb_strlen($string, $encoding));
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху