За последние 24 часа нас посетили 15434 программиста и 1588 роботов. Сейчас ищут 794 программиста ...

Глюк PHP!

Тема в разделе "PHP для новичков", создана пользователем V2oD2o, 16 май 2016.

  1. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    Всем приветы.

    не буду полностью описывать алгоритм работы - это очень надолго, наткнулся на интересную тему.

    есть массив, вот:
    var_dump:: array(2) { ["1"]=> bool(true) ["2"]=> bool(true) }
    print_r:: Array ( [1] => 1 [2] => 1 )

    А обратиться к нему - не могу, пробовал:
    var_dump:: $array[1] -> NULL
    var_dump:: $array["1"] -> NULL
    var_dump:: $array['1'] -> NULL
    var_dump:: $array[(int)1] -> NULL
    var_dump:: $array[(string)1] -> NULL

    В чем прикол то? :)))))
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    переменную попутал?
     
  3. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    точно нет, своя CMS
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    покаж код которым выводишь print_r(); например
     
  5. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    $checked=(array)getItemSQLList($product[0]['sqlextend'],$item['var'],'val_checkbox');
    print_r($checked);

    внутри [iditem]=>true\false, список чеканутых чекбоксов, объект переведенный в массив, если не конвертить то работает нормально
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну какбе
    $array и $checked это совсем не одно и тоже
     
  7. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    я упростил для размещения на форуме
    --- Добавлено ---
    т.е. имеется ввиду var_dump($checked[1]) - выдаст NULL
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. $str = serialize($checked);
    2. echo $str;
    запости
     
  9. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    a:2:{s:1:"1";b:1;s:1:"2";b:1;}
    --- Добавлено ---
    фишка в том что изначально это JSON - переданный из ajax в php - сохраненный в бд, затем "достатый", но как известно (array)json_decode - почему то оставляет вложенные объекты как объекты, вот функция возвращает мне этот объект, но я его сразу конверчу в массив - (array)getItemSQLList - и ничего не работает) если не конвертить на последнем шаге, а просто юзать как $checked->1 - то работает, только эта 1 - находится в переменной, т.е. в цикле где то там в недрах выглядит так - if ($checked->$current['id']==true) { выдать чеканутый бокс } else { пустой }
    --- Добавлено ---
    Стало еще интереснее, на разных версиях работат тоже по разному)))
    на 5.3.3 - работает только через массивы, 5.3.13 - работает только через объекты
    --- Добавлено ---
    Походу выход только один, обновить до 5.3.3
     
  10. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Поток сознания. Код дай, который ведет себя по-разному.
    --- Добавлено ---
    PS: использовать 5.3.x для разработки _нельзя_
     
  11. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    Это как это ?

    вот массив "достатый" из БД - a:11:{s:9:"trademark";s:1:"2";s:8:"checkbox";O:8:"stdClass":2:{s:1:"1";b:1;s:1:"2";b:1;}s:8:"name_dop";s:4:"null";s:7:"krcolor";s:4:"null";s:8:"FullDesc";s:4:"null";s:4:"Desc";s:4:"null";s:11:"technologie";s:4:"null";s:11:"processtype";s:4:"null";s:8:"selector";s:4:"null";s:10:"Badproduct";s:4:"null";s:6:"Hidden";b:0;}

    из него достается объект checkbox с помощью поиска нужной на текущий момент переменной

    и в спике свойств товара есть чекбоксы $options - список возможных боксов для текущкго товара грузится из другой таблицы, и соответственно проверяем какие из чекбоксов чекнуты

    Вариант смассивом:
    Код (Text):
    1. $checked=(array)getItemSQLList($product[0]['sqlextend'],$item['var'],'val_checkbox');
    Код (Text):
    1.  
    2. foreach ($options as $option) {
    3.  if (isset($checked[$option['id']]) && $checked[$option['id']]==1) {
    4.   $block.="<label><input type=checkbox checked value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>";
    5.  } else {
    6.   $block.="<label><input type=checkbox value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>";
    7.  }
    8. }
    Вариант с объектом
    Код (Text):
    1. $checked=getItemSQLList($product[0]['sqlextend'],$item['var'],'val_checkbox');
    Код (Text):
    1.  
    2. foreach ($options as $option) {
    3.  if (isset($checked->$option['id']) && $checked->$option['id']==1) {
    4.   $block.="<label><input type=checkbox checked value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>";
    5.  } else {
    6.   $block.="<label><input type=checkbox value='{$option['id']}'><span style='position:relative;top:-2px;'>{$option['data']}</span></label>";
    7.  }
    8. }
     
  12. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    PHP:
    1. $foo = 'a:11:{s:9:"trademark";s:1:"2";s:8:"checkbox";O:8:"stdClass":2:{s:1:"1";b:1;s:1:"2";b:1;}s:8:"name_dop";s:4:"null";s:7:"krcolor";s:4:"null";s:8:"FullDesc";s:4:"null";s:4:"Desc";s:4:"null";s:11:"technologie";s:4:"null";s:11:"processtype";s:4:"null";s:8:"selector";s:4:"null";s:10:"Badproduct";s:4:"null";s:6:"Hidden";b:0;}';
    2. $bar = unserialize($foo);
    3. $var = 1;
    4. echo $bar['checkbox']->$var;
    Дает 1

    Все работает.
    --- Добавлено ---
    PHP 5.3 не поддерживается уже почти 2 года. Текущая версия 5.6. Хотя новый проект нынче имеет смысл начинать на 7.0. У них не такие большие различия в обратной совместимости, что бы держаться на старые версии
     
  13. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    а если $check=(array)$bar['checkbox'];
    echo $check[1];

    ?
    --- Добавлено ---
     
  14. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Угу, понял в чем твоя проблема.
    Числовые ключи в PHP всегда приводятся к integer. Т.е. $a['1'] - всегда переписывается внутри на $a[1]. Например
    Код (Text):
    1. php > $arr = [ "1" => true, "2" => true ];
    2. php > var_export($arr);
    3. array (
    4.   1 => true,
    5.   2 => true,
    6. )
    7. # ключи - без кавычек, т.е. integer
    Исключение - конвертация из объекта. Если у объекта было свойство строковое '1' - то строковое оно и останется в массиве.
    Код (Text):
    1. php > $baz = new StdClass;
    2. php > $baz->{"1"} = true;
    3. php > $baz->{"2"} = true;
    4. php > var_export((array)$baz);
    5. array (
    6.   '1' => true,
    7.   '2' => true,
    8. )
    9. # ключи в кавычках, т.е. строковые
    А так, как обращения к ключу '1' переписываются в integer - то до такого строкового ключа не добраться.

    Как быстрый хак, можно написать что-то вроде $baz = array_combine(array_keys($baz), array_values($baz)) - т.е. создать новый массив из старого. При создании пхп конвертнет строковые числовые ключи в целое.
    Код (Text):
    1. php > var_export(array_combine(array_keys($baz), array_values($baz)));
    2. array (
    3.   1 => true,
    4.   2 => true,
    5. )
    Насчет другого поведения в 5.3.3 нужно погуглить.
     
    mahmuzar нравится это.
  15. V2oD2o

    V2oD2o Активный пользователь

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    Интересная тема получилась, спасибо - не додумался бы..
    в итоге у меня на дебажной машине ща работает через объект, а на рабочем хосте - на массиве - и как то это не дастиш фантастиш)
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @MiksIr забавно.
    @V2oD2o у функции json_decode() есть второй аргумент, с его помощью устанавливается тип возвращаемого значения - массив. Тогда возвращается корректный массив. Еще можно получить свойства любого объекта в корректный массив с помощью функции get_object_vars().
     
  17. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  18. Scogzhe

    Scogzhe Зэк
    [ БАН ]

    С нами с:
    4 фев 2015
    Сообщения:
    109
    Симпатии:
    0
    Может ещё быть из за хоста.
     
  19. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Актуальная версия:
    PHP 7.0.6 Released
    Какие нах 5.3.3. Ужас. Давно пора избавиться от этого куска дерьма.

    Уже забыл даже, что это такое.
     
  20. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Если у клиента сайт написан давно(под 5.3 например) и работает без проблем - выполняя свою функцию и принося доход, то логика клиента проста - зачем чтото постоянно переписывать в погоне за новой версией?
    Это его право. он платит. В этом нет ничего необычного.

    Новое конечно нужно начинать на максимально свежей версии, ну а поддержка старых проектов может требовать и старых версий.
     
  21. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Затем, что новые CVE (дыры безопасности) в 5.3 не фиксятся больше.
     
  22. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Поломать могут и сайт написанный на последней семерке. если это комуто будет нужно.
    В любом случае, если клиент нехочет вкладываться в миграцию на новое ПО - это его дело и его риски. Это очень распространенное явление. Никакого кошмара в этом нет.