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

Тема в разделе "PHP Pro", создана пользователем gregzem, 5 мар 2009.

Статус темы:
Закрыта.
  1. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    201
    Симпатии:
    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  
    
    Есть идеи, что за леший?
     
  2. Liver

    Liver

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

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

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

    ozware

    Регистр.:
    22 апр 2007
    Сообщения:
    327
    Симпатии:
    42
    gregzem, пишите багу на сайте разработчиков php
     
  4. ustas76

    ustas76 Постоялец

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

    EugeneVC

    Регистр.:
    28 окт 2007
    Сообщения:
    297
    Симпатии:
    83
    так проверять нельзя

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

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

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    EugeneVC

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

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    201
    Симпатии:
    66
    1. Кодировка cp1251
    2. Если бы оно всегда не работало, это объяснило бы проблему. Оно не работает время от времени.
     
  8. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Но все-таки возможно что данные приходят в UTF-8. Попробуйте сравнить результаты strlen() и mb_strlen().
     
  9. Dogmat

    Dogmat Постоялец

    Регистр.:
    16 фев 2007
    Сообщения:
    122
    Симпатии:
    38
    Первый раз вижу подобную проверку. Как минимум mysql_num_rows здесь лучше подходит.
     
  10. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    PHP:
    $encoding mb_detect_encoding($string);
    var_dump(mb_strlen($string$encoding));
     
Статус темы:
Закрыта.