За последние 24 часа нас посетили 118346 программистов и 8024 робота. Сейчас ищет 1561 программист ...

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

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

  1. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Здравствуйте! Пытаюсь записать массив данных в куки, но не работает запись почему-то, выдает null постоянно, но если записывать в куки без массива, то работает, очень прошу вашей помощи, мой код:
    PHP:
    1. $array = array(
    2.      array(
    3.      "name"=>"Архив",
    4.      "price"=>"100"
    5.      ),
    6.      array(
    7.      "name"=>"Архив 2",
    8.      "price"=>"200"
    9.      ),
    10. );
    11. $json = json_encode($array);
    12. setcookie("filtername", $json);
    13. $array2 = json_decode($_COOKIE['filtername']);
    14. echo "<pre>";
    15. var_dump($array2);
    16. echo "</pre>";
    Заранее спасибо! Подскажите еще пожалуйста, как потом в дополнение к этим данным добавить новые(без перезаписи всего массива)? то бишь при текущем коде идет в запись Архив и Архив2, и после я мог к ним добавить новые Архив 3 к примеру, но без полной замены массива, а его дополнению, спасибо!
     
  2. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Не знаю, у меня все работает и выводит:
    Код (Text):
    1. array(2) {
    2.   [0]=>
    3.   object(stdClass)#5 (2) {
    4.     ["name"]=>
    5.     string(10) "Архив"
    6.     ["price"]=>
    7.     string(3) "100"
    8.   }
    9.   [1]=>
    10.   object(stdClass)#6 (2) {
    11.     ["name"]=>
    12.     string(12) "Архив 2"
    13.     ["price"]=>
    14.     string(3) "200"
    15.   }
    16. }
    --- Добавлено ---
    Может ты сервер настроил не правильно...
     
  3. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Если принудительно писать $_COOKIE['filtername'] = json_encode($array);, то выводит, но не хочет через setcookie...
    У меня есть 3 страницы, на каждой странице есть форма post, и каждая форма отправляется на выбор на 1 общую страницу где и сохраняются данные с всех форм которые отправили... Код:
    Код (Text):
    1. 1 страница
    2.   <form action="/post.php" method="post">
    3. <input type="hidden" name="namep" value="Name array1">
    4. <input type="hidden" name="pricep" value="price array1">
    5. <input name="but" type="submit">
    6. </form>
    7.  
    8. 2 страница
    9.   <form action="/post.php" method="post">
    10. <input type="hidden" name="namep" value="Name array2">
    11. <input type="hidden" name="pricep" value="price array2">
    12. <input name="but" type="submit">
    13. </form>
    14.  
    15. 3 страница
    16.   <form action="/post.php" method="post">
    17. <input type="hidden" name="namep" value="Name array3">
    18. <input type="hidden" name="pricep" value="price array3>
    19. <input name="but" type="submit">
    20. </form>
    И файл обработки и сохранения отправок с форм:
    PHP:
    1. $array = array(
    2.      array(
    3.      "name"=>$_POST['namep'],
    4.      "price"=>$_POST['pricep']
    5.      ),
    6. );
    7. $json = json_encode($array);
    8. setcookie("filtername", $json);
    9. $array2 = json_decode($_COOKIE['filtername']);
    10. echo "<pre>";
    11. var_dump($array2);
    12. echo "</pre>";
    В итоге я к примеру перешел на 1 страницу, нажал Submit и на странице post.php добавилось значение из первой формы и сохранилось в куках, затем я вышел с post.php и перешел к примеру на страницу 3 и отправил форму, затем опять меня перекинуло на post.php и там уже должны быть данные не только с последней формы, но и с 1-й что я отправлял ранее. Подскажите пожалуйста, как это реализовать?
    1. через setcookie у меня почему-то не записывает массив, а если принудительно $_COOKIE['filtername'] = json_encode($array); то работает
    2. Как сохраняя предыдущее значение, добавлять новое? так выдает ошибку
    PHP:
    1. $array = array(
    2.      array(
    3.      "name"=>$_POST['namep'],
    4.      "price"=>$_POST['pricep']
    5.      ),
    6. );
    7. $json = json_encode($array);
    8. setcookie("filtername", $json);
    9. $array2 = json_decode($_COOKIE['filtername']);
    10. $secondArray= array(
    11.     array(
    12.    "name"=>$_POST['namep'],
    13.      "price"=>$_POST['pricep']
    14.     ),
    15. );
    16. $_COOKIE['filtername'][] = json_encode($secondArray);
    17. echo "<pre>";
    18. var_dump($array2);
    19. echo "</pre>";
    [] operator not supported for strings
     
  4. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    1. через setcookie у меня почему-то не записывает массив, а если принудительно $_COOKIE['filtername'] = json_encode($array); то работает , точнее если через setcookie , то var_dump(json_decode($_COOKIE['filtername'])) выдает постоянно null
     
  5. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Теперь по порядку:
    $_COOKIE['filtername'] = json_encode($array); - чисто в теории это будет выглядеть также как ты будешь присваивать к переменной $b значения. Проще говоря, так не выйдет. Что касаемо куки, я бы на твоем месте посмотрел в сторону сессии, почему? Ну, потому что она запоминает.
    PHP:
    1. $array = array(
    2.     array(
    3.         "name"=>14,
    4.         "price"=>51
    5.     ),
    6. );
    7. $_SESSION['filtername'] = $array;
    8. $_SESSION['filtername'][] = ['test'=>'test1']; //Новый массив
    9.  
    10. $array2 = $_SESSION['filtername'];
    11. echo "<pre>";
    12. var_dump($array2);
    13. echo "</pre>";
    Но тебе действительно ли нужен json? Если да, то скорее тебе придется разбивать на разные переменные...
    result:
    Код (Text):
    1. array(2) {
    2.   [0]=>
    3.   array(2) {
    4.     ["name"]=>
    5.     int(14)
    6.     ["price"]=>
    7.     int(51)
    8.   }
    9.   [1]=>
    10.   array(1) {
    11.     ["test"]=>
    12.     string(5) "test1"
    13.   }
    14. }
    --- Добавлено ---
    Однако можно сделать так и ты объединишь два массива, вот как тебе надо:
    PHP:
    1. $array = array(
    2.     array(
    3.         "name"=>'user',
    4.         "price"=>100
    5.     ),
    6. );
    7. $array2 = array(
    8.     array(
    9.         "nameAdmin"=>'test',
    10.         "Password"=>'123'
    11.     )
    12. );
    13. $array=array_merge($array, $array2);
    14. $json = json_encode($array);
    15. setcookie("filtername", $json);
    16.  
    17.  
    18.  
    19. echo "<pre>";
    20. var_dump($_COOKIE['filtername']);
    21. echo "</pre>";
     
  6. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Я выбрал куки, т.к. мне нужно запоминание на уровне браузера и по времени.
    Вот моя идея, но она не работает как нужно, посмотрите пожалуйста, буду очень благодарен за помощь:
    PHP:
    1. $strcoc = json_decode(stripslashes($_COOKIE['filtername']));
    2. if($strcoc[0] != null){//если есть куками 0 из массива то заполяем основной массив куками, если нет, то post если был отправлен
    3. $arrname0 = $strcoc[0]['name'];
    4. $arrprice0 = $strcoc[0]['price'];
    5. } else {
    6. $arrname0 = $_POST['namep'];
    7. $arrprice0 = $_POST['pricep'];
    8. }
    9. if($strcoc[1] != null){
    10. $arrname1 = $strcoc[1]['name'];
    11. $arrprice1 = $strcoc[1]['price'];
    12. } else {
    13. $arrname1 = $_POST['namep2'];
    14. $arrprice1 = $_POST['pricep2'];
    15. }
    16. if($strcoc[2] != null){
    17. $arrname2 = $strcoc[2]['name'];
    18. $arrprice2 = $strcoc[2]['price'];
    19. } else {
    20. $arrname2 = $_POST['namep3'];
    21. $arrprice2 = $_POST['pricep3'];
    22. }
    23. $array = array(//основной массив куки, куда записываем все сохранения и выводим
    24.    array(
    25.      "name"=>$arrname0,
    26.      "price"=>$arrprice0
    27.      ),
    28.        array(
    29.      "name"=>$arrname1,
    30.      "price"=>$arrprice1
    31.      ),
    32.        array(
    33.      "name"=>$arrname2,
    34.      "price"=>$arrprice2
    35.      ),
    36. );
    37. SetCookie("filtername", json_encode($array));//обновление основной куки
    38. $strcocecho = json_decode(stripslashes($_COOKIE['filtername']));//выводим массив
    39.  
    40. echo "<pre>";
    41. var_dump($strcocecho);
    42. echo "</pre>";
     
  7. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Объясни, что ты хочешь сделать? Добавить в массив новые данные?
     
  8. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Как я выше писал, к примеру перешел на 1 страницу, нажал Submit и на странице post.php добавилось значение из первой формы и сохранилось в куках, затем я вышел с post.php и перешел к примеру на страницу 3 и отправил форму, затем опять меня перекинуло на post.php и там уже должны быть данные не только с последней формы, но и с 1-й что я отправлял ранее
     
  9. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    HTML:
    1. 1 страница
    2.   <form action="/post.php" method="post">
    3. <input type="hidden" name="namep" value="<?=$_POST['namep']?>">
    4. <input type="hidden" name="pricep" value="<?=$_POST['pricep']?>">
    5. <input name="but" type="submit">
    6. </form>
    7. 2 страница
    8.   <form action="/post.php" method="post">
    9. <input type="hidden" name="namep" value="<?=$_POST['namep']?>">
    10. <input type="hidden" name="pricep" value="<?=$_POST['pricep']?>">
    11. <input name="but" type="submit">
    12. </form>
    13. 3 страница
    14.   <form action="/post.php" method="post">
    15. <input type="hidden" name="namep" value="<?=$_POST['namep']?>">
    16. <input type="hidden" name="pricep" value="<?=$_POST['pricep']?>">
    17. <input name="but" type="submit">
    18. </form>
    --- Добавлено ---
    И все... Что строить города...
     
  10. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Информация в формах статична, я их отправлял ранее уже, мне нужно поправить мой обработчик что я выслал выше с сохранением всей информации на куках как я описал ранее.
    --- Добавлено ---
    Мой нужный html:
    Код (Text):
    1. 1 страница
    2.   <form action="/post.php" method="post">
    3. <input type="hidden" name="namep" value="Name array1">
    4. <input type="hidden" name="pricep" value="price array1">
    5. <input name="but" type="submit">
    6. </form>
    7. 2 страница
    8.   <form action="/post.php" method="post">
    9. <input type="hidden" name="namep" value="Name array2">
    10. <input type="hidden" name="pricep" value="price array2">
    11. <input name="but" type="submit">
    12. </form>
    13. 3 страница
    14.   <form action="/post.php" method="post">
    15. <input type="hidden" name="namep" value="Name array3">
    16. <input type="hidden" name="pricep" value="price array3>
    17. <input name="but" type="submit">
    18. </form>
    Мой обработчик который не работает, не сохраняет данные:
    PHP:
    1. $strcoc = json_decode(stripslashes($_COOKIE['filtername']));
    2. if($strcoc[0] != null){//если есть куками 0 из массива то заполяем основной массив куками, если нет, то post если был отправлен
    3. $arrname0 = $strcoc[0]['name'];
    4. $arrprice0 = $strcoc[0]['price'];
    5. } else {
    6. $arrname0 = $_POST['namep'];
    7. $arrprice0 = $_POST['pricep'];
    8. }
    9. if($strcoc[1] != null){
    10. $arrname1 = $strcoc[1]['name'];
    11. $arrprice1 = $strcoc[1]['price'];
    12. } else {
    13. $arrname1 = $_POST['namep2'];
    14. $arrprice1 = $_POST['pricep2'];
    15. }
    16. if($strcoc[2] != null){
    17. $arrname2 = $strcoc[2]['name'];
    18. $arrprice2 = $strcoc[2]['price'];
    19. } else {
    20. $arrname2 = $_POST['namep3'];
    21. $arrprice2 = $_POST['pricep3'];
    22. }
    23. $array = array(//основной массив куки, куда записываем все сохранения и выводим
    24.   array(
    25.   "name"=>$arrname0,
    26.   "price"=>$arrprice0
    27.   ),
    28.   array(
    29.   "name"=>$arrname1,
    30.   "price"=>$arrprice1
    31.   ),
    32.   array(
    33.   "name"=>$arrname2,
    34.   "price"=>$arrprice2
    35.   ),
    36. );
    37. SetCookie("filtername", json_encode($array));//обновление основной куки
    38. $strcocecho = json_decode(stripslashes($_COOKIE['filtername']));//выводим массив
    39. echo "<pre>";
    40. var_dump($strcocecho);
    41. echo "</pre>";
    Помогите поправить данный код пожалуйста, чтобы работало сохранение и запись как нужно, заранее спасибо!
     
  11. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    setcookie точно устанавливается перед отправкой заголовков и контента?
     
  12. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    509
    Симпатии:
    40
    Записать в куку массив не получится, и дописать что-то тоже вряд ли, а лишь удалить и записать новую.
     
  13. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Может слишком длинная переменная получается? там 4кб (2000 юникодных русских букоф)
    SetCookie в php регистр не важен?
     
    #13 nospiou, 3 мар 2018
    Последнее редактирование: 3 мар 2018
  14. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    да, проверьте у себя мой код пожалуйста, мб он только у меня не работает, мб я что-то с переменными намудрил
     
  15. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    509
    Симпатии:
    40
    да там мудрить нечего, либо устанавливать по одному значению, либо объединять значения в одну строку типа "Name array1_price array1"
     
  16. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Проверил первый код. Все работает. При первом запросе страницы переменной нету. При втором отображается. Вы же не пытаетесь сделать точно так же как в коде? Куки появится только когда в пользователя отобразится страница.
    --- Добавлено ---
    Ну так он же и объединяет созданием json объекта.
     
    #16 nospiou, 3 мар 2018
    Последнее редактирование: 3 мар 2018
  17. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    этот код вы проверяли? работает сохранение с разных форм и обьеденяет новые данные с старыми в куках?
     
  18. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Не знаю в чем здесь сложность. Но вот так точно работать не будет. Сначала сет куки потом отображения страницы и при следующем запросе уже можно использовать гет. Пока Страница не вернется браузер не сможет прописать куки. Это смущает? В данном примере возвращается старая кука до сета.
    PHP:
    1. SetCookie("filtername", json_encode($array));//обновление основной куки.
    2. $strcocecho = json_decode(stripslashes($_COOKIE['filtername']));//выводим массив
     
    JonyFront нравится это.
  19. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Логика кода вообще странная
    PHP:
    1. $strcoc=json_decode(stripslashes($_COOKIE['filtername']));
    2. $arr = [
    3.     "name" => $_POST['namep'];
    4.     "price" => $_POST['price'];
    5. ];
    6. $strcoc[] = $arr // или array_push или даже $page = $_POST['page_num']; $strcoc[$page] = $arr
    7. setcookie("filtername",json_encode($strcoc));
    8. echo $strcoc;
     
    #19 nospiou, 3 мар 2018
    Последнее редактирование: 3 мар 2018
    JonyFront нравится это.
  20. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    PHP:
    1. $strcoc=json_decode(stripslashes($_COOKIE['filtername']));
    2. $arr = [
    3.     "name" => $_POST['namep'];
    4.     "price" => $_POST['price'];
    5. ];
    6. $strcoc[] = $arr // или array_push или даже $page = $_POST['page_num']; $strcoc[$page] = $arr
    7. setcookie("filtername",json_encode($strcoc));
    8. echo $strcoc;
    Спасибо, подскажите пожалуйста как сохранить предыдущий выбор? к примеру я перешел на 1 страницу с формой, нажал Submit и на странице post.php добавилось значение из первой формы и сохранилось в куках, затем я вышел с post.php и перешел к примеру на страницу 3 и отправил форму другую, затем опять меня перекинуло на post.php и там уже должны быть данные не только с последней формы, но и с 1-й что я отправлял ранее
    --- Добавлено ---
    Добавлять в массив должно такие же ключи
    "name" => $_POST['namep'];
    "price" => $_POST['price'];, но с разными значениями, т.к. разные формы, к примеру как я писал тут
    PHP:
    1. if($strcoc[0] != null)
    2. $arrname0 = $strcoc[0]['name'];
    3. $arrprice0 = $strcoc[0]['price'];
    4. } else {
    5. $arrname0 = $_POST['namep'];
    6. $arrprice0 = $_POST['pricep'];
    7. }
    8. if($strcoc[1] != null){
    9. $arrname1 = $strcoc[1]['name'];
    10. $arrprice1 = $strcoc[1]['price'];
    11. } else {
    12. $arrname1 = $_POST['namep2'];
    13. $arrprice1 = $_POST['pricep2'];
    14. }
    15. if($strcoc[2] != null){
    16. $arrname2 = $strcoc[2]['name'];
    17. $arrprice2 = $strcoc[2]['price'];
    18. } else {
    19. $arrname2 = $_POST['namep3'];
    20. $arrprice2 = $_POST['pricep3'];
    21. }
    22. $array = array(//основной массив куки, куда записываем все сохранения и выводим
    23.   array(
    24.   "name"=>$arrname0,
    25.   "price"=>$arrprice0
    26.   ),
    27.   array(
    28.   "name"=>$arrname1,
    29.   "price"=>$arrprice1
    30.   ),
    31.   array(
    32.   "name"=>$arrname2,
    33.   "price"=>$arrprice2
    34.   ),
    35. );
     
  21. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Вот мой код как раз для этого. Он уже должен работать
    и ваш возможно заработает если измените
    PHP:
    1. $strcocecho = json_decode(stripslashes($_COOKIE['filtername']));//выводим массив
    2. //на
    3. $strcocecho = $array; //выводим массив
    Но мой короче а делает тоже самое.
    А еще лучше вот так
    PHP:
    1. $strcoc=json_decode(stripslashes($_COOKIE['filtername']));
    2. if(isset($_POST['namep']) && isset($_POST['price'])) {
    3.     $strcoc[] = [
    4.         "name" => $_POST['namep'],
    5.         "price" => $_POST['price'],
    6.     ];
    7. }
    8. setcookie("filtername",json_encode($strcoc));
    9. echo $strcoc;
     
    #21 nospiou, 3 мар 2018
    Последнее редактирование: 3 мар 2018
    JonyFront нравится это.
  22. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Большое спасибо, сохраняет как нужно, подскажите пожалуйста, почему выводит информацию, но с ошибкой Trying to get property of non-object 14, не могу понять...
    PHP:
    1. $strcoc=json_decode(stripslashes($_COOKIE['filtername']));
    2. if(isset($_POST['namep']) && isset($_POST['price'])) {
    3.     $strcoc[] = [
    4.         "name" => $_POST['namep'],
    5.         "price" => $_POST['pricep'],
    6.     ];
    7. }
    8. setcookie("filtername",json_encode($strcoc));
    9. foreach($strcoc as $k){
    10.         echo $k->name;
    11. }
    --- Добавлено ---
    И можно ли как-то удалить один из массивов в куках? уже после сохранения
     
  23. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    сделай вот так
    PHP:
    1. $strcoc[] = (object) [
    2.     ...
    3. ]
    PHP:
    1. unset($strcoc[1]);
    2. setcookie("filtername",json_encode($strcoc));
     
    #23 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018
    JonyFront нравится это.
  24. JonyFront

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

    С нами с:
    5 июн 2016
    Сообщения:
    143
    Симпатии:
    1
    Спасибо, вышло вот так, но что-то все равно ошибки выкидывает, посмотрите пожалуйста, не могу понять из-за чего, уже разные вариации пробовал...:
    PHP:
    1. $strcoc=json_decode(stripslashes($_COOKIE['filtername']));
    2. if(isset($_POST['namep']) && isset($_POST['price'])) {
    3.     $strcoc[] = (object) [
    4.         "name" => $_POST['namep'],
    5.         "price" => $_POST['pricep'],
    6.     ];
    7. }
    8. setcookie("filtername",json_encode($strcoc));
    9. echo "<ul>";
    10. foreach($strcoc as $k => $val){
    11. echo <<<HTML
    12. <li>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></li>
    13. HTML;
    14. if(isset($_POST['delb'][$k])){
    15. unset($strcoc[$_POST['delid'][$k]]);
    16. setcookie("filtername",json_encode($strcoc));
    17. }
    18. }
    19. echo "</ul>";
    Скрин ошибок https://prnt.sc/imgr5p
     
  25. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Пустые заголовки говорят о том что ты добавил форму с пустым input (хотя учитывая попытку получить свойство не объекта это старые данные до того как код заработал) можно еще делать не isset($_POST['namep']) a просто $_POST['namep'] или $_POST['namep'] != '' или strlen($_POST['namep']) > 2
    Не возможно изменить заголовок говорит о том что ты пытаешься перезаписать заголовок после вывода контента. Куки это html заголовок он отдается в самом начале
    PHP:
    1. if(isset($_POST['delb'][$k])){
    2.     unset($strcoc[$_POST['delid'][$k]]);
    3. }
    4. setcookie("filtername",json_encode($strcoc));
    5. echo "<ul>";
    6. foreach($strcoc as $k => $val){
    Может тебе лучше установить magento?)
     
    #25 nospiou, 4 мар 2018
    Последнее редактирование: 4 мар 2018
    JonyFront нравится это.