За последние 24 часа нас посетили 87292 программиста и 4639 роботов. Сейчас ищут 2040 программистов ...

Запись массива в куки не работает

Тема в разделе "PHP для новичков", создана пользователем JonyFront, 3 мар 2018.

  1. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Жесть, что-то я уже совсем запутался)) сделал вот так:
    PHP:
    1. if($_POST['namep'] != "" or $_COOKIE['filter2'] != null) {//выполнять только если был пост запрос или есть не пустые куки
    2. $strcoc=json_decode(stripslashes($_COOKIE['filter2']));
    3. if($_POST['namep'] != "" and $_POST['pricep'] != "") {
    4.     $strcoc[] = (object) [
    5.         "name" => $_POST['namep'],
    6.         "price" => $_POST['pricep'],
    7.     ];
    8. }
    9. setcookie("filter2",json_encode($strcoc));
    10. foreach($strcoc as $k => $val){
    11. if(isset($_POST['delb'][$k])){//если отправили delb , то выполнять удаление из массива ключа под номером $k
    12.     unset($strcoc[$_POST['delid'][$k]]);
    13.     setcookie("filter2",json_encode($strcoc));
    14. }
    15. echo <<<HTML
    16. <div>Name - {$val->name} <span>Price - {$val->price}</span> <form method="post"><input type="hidden" name="delid[{$k}]" value="{$k}"><input type="submit" name="delb[{$k}]" value="Del."></form></div><br/>
    17. HTML;
    18. }
    19. }
    Теперь без поста и без куков пишет ошибку Notice: Undefined index: namep in
    и Notice: Undefined index: filter2, а если отправляю пост с формы с данными, то первый раз выводит, и после обновления страницы не сохраняет, в куки перестало сохранять, ппц запутался уже))

    Хех, magento) я учусь пока что, пытаюсь понять что и как
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    ты прав все плохо
    $_COOKIE['filter2']!=null убери
    setcookie("filter2",json_encode($strcoc)); только один раз перед foreach
    if(isset($_POST['delb'])) unset($strcoc[$_POST['delb']]); только один раз перед setcookie
     
    JonyFront нравится это.
  3. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Выкидывает ошибку Notice: Undefined index: namep on line 5
    PHP:
    1. if($_POST['namep'] != "") {
    2. $strcoc=json_decode(stripslashes($_COOKIE['filter2']));
    3. if($_POST['namep'] != "" or $_POST['pricep'] != "") {
    4.     $strcoc[] = (object) [
    5.         "name" => $_POST['namep'],
    6.         "price" => $_POST['pricep'],
    7.     ];
    8. }
    9. if(isset($_POST['delb'])){
    10.     unset($strcoc[$_POST['delid']);//с этой строкой выкидывает 500 ошибку
    11. }
    12. setcookie("filter2",json_encode($strcoc));
    13. foreach($strcoc as $k => $val){
    14. echo <<<HTML
    15. <div>Name - {$val->name} <span>Price - {$val->price}</span> <form method="post"><input type="hidden" name="delid[{$k}]" value="{$k}"><input type="submit" name="delb[{$k}]" value="Del."></form></div><br/>
    16. HTML;
    17. }
    18. }
    Если я удаляю $_COOKIE['filter2']!=null проверку в самом начале, как же тогда ничего не выводить если куки и пост запрос пустые?(они изначально до отправки пустые могут быть, но уже как отправят формы - сохраняеться)
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну если они пустые то ничего и не выведется
    а проверка на присвоение уже есть ниже if($_POST['namep'] != "" or $_POST['pricep'] != "") {
    Notice: Undefined index: namep on line 5 не знаю. не должно быть. Выше идет проверка
     
    JonyFront нравится это.
  5. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    да, я сделал вот так и работает, но теперь после удаления 1 любого элемента из массива меняет его структуру и уже перестает работать следующее добавление в массив и пишет ошибку Fatal error: Cannot use object of type stdClass as array on line 8 http://prntscr.com/imm14m добавляет индекс к элементу массива я так понял, но как сделать чтобы дальше сохраняло новые после удаления любого из элементов? подскажите пожалуйста
    PHP:
    1. if(isset($_POST['namep']) or isset($_COOKIE['servlist'])) {
    2. $strcoc=json_decode(stripslashes($_COOKIE['servlist']));
    3. if(isset($_POST['namep']) or isset($_POST['pricep'])) {
    4.     $strcoc[] = (object) [
    5.         "name" => $_POST['namep'],
    6.         "price" => $_POST['pricep'],
    7.     ];
    8. }
    9. if(isset($_POST['delb'])){
    10.     unset($strcoc[$_POST['delid']]);
    11. }
    12. setcookie("servlist",json_encode($strcoc));
    13. foreach($strcoc as $k => $val){
    14. echo <<<HTML
    15. <div>Name - {$val->name} <span>Price - {$val->price}</span> <form method="post"><input type="hidden" name="delid" value="{$k}"><input type="submit" name="delb" value="Del."></form></div><br/>
    16. HTML;
    17. }
    18. } else {
    19.     echo "No list.";
    20. }
     
  6. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Решил проблему так
    PHP:
    1. if(isset($_POST['delb'])){
    2.     unset($strcoc[$_POST['delid']]);
    3.     $strcoc = array_values($strcoc);
    4. }
    , спасибо! Подскажите пожалуйста, как можно побороть дубль http://prntscr.com/imm5lq Name Price, и дубли элементов в массиве? заранее спасибо
     
  7. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    PHP:
    1. if(isset($_POST['delb'])){
    2.     $strcoc = json_decode(**********, true); // попробуй так
    3.     unset($strcoc[$_POST['delid']]);
    4.     // или возможно так заработает $strcoc[$_POST['delid']] = null;
    5. }
     
  8. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    проблему с добавлением индекса я решил так $strcoc = array_values($strcoc);, а вот с дублями можете подсказать? что-то функция array_unique не хочет работать с json... спасибо!
    --- Добавлено ---
    Точнее еще до добавления нового пост запроса как-то обработку сделать, чтобы если уже есть такой элемент в массиве, то новый не добавлять
     
  9. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Я тебе дам один очень классный совет который съекономит тебе много времени в будущем.
    https://rutracker.org/forum/tracker.php?f=1565&nm=php

    Используй сразу многомерные массивы тогда и удалять будет проще. Плюс сведи все или к массиву или к объекту true в последнем примере как раз будет возвращать масив а после json у тебя всегда object
     
    #34 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018
    JonyFront нравится это.
  10. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    @nospiou
    Спасибо за информацию, буду смотреть, по этой задаче осталось только дубли убрать и все мне, вот что получилось, но функция array_column выдает пустой массив array(0) { }, сможете подсказать?
    PHP:
    1. if(isset($_POST['namep']) or isset($_COOKIE['servlists'])) {
    2. $strcoc=json_decode(stripslashes($_COOKIE['servlists']));
    3. if(isset($_POST['namep']) or isset($_POST['pricep'])) {
    4. $whcoc = array_column($strcoc, 'name');
    5. $postcheck = $_POST['namep'];
    6. $checkwhcoc = array_search($postcheck, $whcoc);
    7. if($checkwhcoc !== false){
    8.     $strcoc[] = (object) [
    9.   "name" => $_POST['namep'],
    10.   "price" => $_POST['pricep'],
    11.   ];
    12. }else{
    13.      echo "no";
    14.    }
    15. }
    16. if(isset($_POST['delb'])){
    17.   unset($strcoc[$_POST['delid']]);
    18.    $strcoc = array_values($strcoc);
    19. }
    20. setcookie("servlists",json_encode($strcoc));
    21. foreach($strcoc as $k => $val){
    22. echo <<<HTML
    23. <div>Name - {$val->name} <span>Price - {$val->price}</span> <form method="post"><input type="hidden" name="delid" value="{$k}"><input type="submit" name="delb" value="Del."></form></div><br/>
    24. HTML;
    25. }
    26. } else {
    27.    echo "No list.";
    28. }
     
  11. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Убери array_values верни все обратно и давай строку с true
    Там все слишком не правильно что бы исправлять)
    и еще перед сет куки добавь
    $strcoc=json_encode($strcoc);
    $strcoc=json_decode($strcoc);
    Но лучше все переписать..
     
    #36 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018
    JonyFront нравится это.
  12. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    А чем плох вариант в моей случае array_values? чтобы я понимал, и что в общем плохого в коде текущем, что его нужно переписать? он дорабатываться не будет в плане новых функций, просто добавил - сохранил- удалил если нужно и все
     
  13. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    $strcoc=array_values($strcoc); ты затираешь все ключи а дальше по ключам пробуешь пройтись циклом а они уже другие у тебя уже совершенно другая переменная