Возможность десериализации сериализованной строки - PullRequest
0 голосов
/ 12 мая 2018

У меня есть сериализованная строка, и я пытаюсь ее не сериализовать, но она становится ложной.

Последовательная строка повторила:

string(175) "a:6:{s:6:"tables";s:9:"8 Tables";s:8:"table_no";s:1:"6";s:6:"chairs";s:6:"Chairs";s:8:"chair_no";s:1:"6";s:12:"round_tables";s:11:"Round Table";s:14:"round_table_no";s:1:"6";}" 

Данные в базе данных:

a:6:{s:6:"tables";s:9:"8 Tables";s:8:"table_no";s:1:"6";s:6:"chairs";s:6:"Chairs";s:8:"chair_no";s:1:"6";s:12:"round_tables";s:11:"Round Table";s:14:"round_table_no";s:1:"6";}

код для десериализации данных

var_dump(unserialize($fellowship_data['equipment']));

Данные поступают в пост-запросе перед сериализацией и сохраняются в базе данных

["equipment"]=>
  array(7) {
    ["tables"]=>
    string(9) "8' Tables"
    ["table_no"]=>
    string(1) "6"
    ["chairs"]=>
    string(6) "Chairs"
    ["chair_no"]=>
    string(1) "6"
    ["round_tables"]=>
    string(11) "Round Table"
    ["round_table_no"]=>
    string(1) "6"
    ["piping_drapes"]=>
    string(13) "Piping Drapes"
  }

Код перед сериализацией

$equipment = array();
    if ( isset($_POST['equipment']) ){
        $equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? str_replace("'","", $_POST['equipment']['tables']) : '';
        $equipment['table_no'] = isset( $_POST['equipment']['table_no'] ) ? $_POST['equipment']['table_no'] : '';
        $equipment['chairs'] = isset( $_POST['equipment']['chairs'] ) ? $_POST['equipment']['chairs'] : '';
        $equipment['chair_no'] = isset( $_POST['equipment']['chair_no'] ) ? $_POST['equipment']['chair_no'] : '';
        $equipment['round_tables'] = isset( $_POST['equipment']['round_tables'] ) ? $_POST['equipment']['round_tables'] : '';
        $equipment['round_table_no'] = isset( $_POST['equipment']['round_table_no'] ) ? $_POST['equipment']['round_table_no'] : '';
    }

Код для сериализации данных

$equipment = serialize($equipment);

Отмена сериализации, возвращая false.

Обновление Я изменил код и использовал json_encode и json_decode и сохранял в databsae как текст, теперь при декодировании json я получаю NULL !!

Кто-нибудь может дать мне некоторое представление о том, как это можно решить?

Если вам нужна дополнительная информация, пожалуйста, задайте мне вопрос, чтобы я добавил их к вопросу.

Примечание: Сервер, на котором я работаю, не поддерживает тип данных json в своей базе данных, поэтому я был вынужден использовать сериализацию. Я не рекомендую людям следовать этому и использовать serialize(), чтобы сохранить его.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Это потому, что из него создаются неверные данные сериализации. Даже если мы пытаемся создать данные JSON, это создает данные JSON с неправильным синтаксисом.

Если мы попробуем приведенные ниже коды, PDO не позволитит.

  1. $equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? str_replace("'","", $_POST['equipment']['tables']) : '';

  2. $equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? addslashes($_POST['equipment']['tables']) : '';

  3. $equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? str_replace("'","\'", $_POST['equipment']['tables']) : '';

приводит к ошибке сервера 500 в этом случае.

и

$equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? addcslashes($_POST['equipment']['tables']) : ''; приведет к NULL.

Мы можем использовать 2 или 3 и изменить наш PDO на this , что решит проблему.

0 голосов
/ 12 мая 2018

Я запустил предоставленный вами пример кода, и он корректно сериализует данные.

Ожидаемый результат :

string(175) "a:6:{s:6:"tables";s:8:"8 Tables";s:8:"table_no";s:1:"6";s:6:"chairs";s:6:"Chairs";s:8:"chair_no";s:1:"6";s:12:"round_tables";s:11:"Round Table";s:14:"round_table_no";s:1:"6";}"

Единственная разница между ожидаемым и вашим результатом состоит в том, что содержимое "8 таблиц" не имеет длины 9 символов. Ваш исходный ввод (8 'таблиц) на самом деле имеет длину 9 символов с отфильтрованным символом.
Моим лучшим предположением будет то, что ваш ввод сериализуется с символом ', а вы фильтруете его после сериализации.

Вот фрагмент кода, который я запустил :

<?php

    $equipment = array();

    // Simulated post data from form submit
    $_POST["equipment"]["tables"] = "8' Tables";
    $_POST["equipment"]["table_no"] = "6";
    $_POST["equipment"]["chairs"] = "Chairs";
    $_POST["equipment"]["chair_no"] = "6";
    $_POST["equipment"]["round_tables"] = "Round Table";
    $_POST["equipment"]["round_table_no"] = "6";
    $_POST["equipment"]["piping_drapes"] = "Piping Drapes";


    if ( isset($_POST['equipment']) ){
        $equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? str_replace("'","", $_POST['equipment']['tables']) : '';
        $equipment['table_no'] = isset( $_POST['equipment']['table_no'] ) ? $_POST['equipment']['table_no'] : '';
        $equipment['chairs'] = isset( $_POST['equipment']['chairs'] ) ? $_POST['equipment']['chairs'] : '';
        $equipment['chair_no'] = isset( $_POST['equipment']['chair_no'] ) ? $_POST['equipment']['chair_no'] : '';
        $equipment['round_tables'] = isset( $_POST['equipment']['round_tables'] ) ? $_POST['equipment']['round_tables'] : '';
        $equipment['round_table_no'] = isset( $_POST['equipment']['round_table_no'] ) ? $_POST['equipment']['round_table_no'] : '';
    }

    $equipment = serialize($equipment);
    var_dump($equipment);
    var_dump(unserialize($equipment));

?>


Использование JSON для сериализации ваших данных :

Если вы решите использовать json для сериализации ваших данных, в коде не будет большой разницы.
Вы используете "json_encode" так же, как "serialize" и "json_decode", аналогично "unserialize". Самое важное замечание по декодированию данных json в php заключается в том, что вы можете решить, хотите ли вы объект или ассоциативный массив. Если вам нужен массив, то функцией декодирования будет json_decode ($ data, true ).

Пример использования JSON :

<?php

    $equipment = array();

    // Simulated post data from form submit
    $_POST["equipment"]["tables"] = "8' Tables";
    $_POST["equipment"]["table_no"] = "6";
    $_POST["equipment"]["chairs"] = "Chairs";
    $_POST["equipment"]["chair_no"] = "6";
    $_POST["equipment"]["round_tables"] = "Round Table";
    $_POST["equipment"]["round_table_no"] = "6";
    $_POST["equipment"]["piping_drapes"] = "Piping Drapes";


    if ( isset($_POST['equipment']) ){
        $equipment['tables'] = isset( $_POST['equipment']['tables'] ) ? str_replace("'","", $_POST['equipment']['tables']) : '';
        $equipment['table_no'] = isset( $_POST['equipment']['table_no'] ) ? $_POST['equipment']['table_no'] : '';
        $equipment['chairs'] = isset( $_POST['equipment']['chairs'] ) ? $_POST['equipment']['chairs'] : '';
        $equipment['chair_no'] = isset( $_POST['equipment']['chair_no'] ) ? $_POST['equipment']['chair_no'] : '';
        $equipment['round_tables'] = isset( $_POST['equipment']['round_tables'] ) ? $_POST['equipment']['round_tables'] : '';
        $equipment['round_table_no'] = isset( $_POST['equipment']['round_table_no'] ) ? $_POST['equipment']['round_table_no'] : '';
    }

    $equipment = json_encode($equipment);
    var_dump($equipment); // Encoded data as json string
    var_dump(json_decode($equipment, true)); // Associative array with the decoded data

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...