Почему при получении значения JSON из базы данных он не может быть декодирован в PHP?


я использую следующую function для вставки строки JSON в мою базу данных:

$a_value = 1;
$b_value = 0;
$c_value = 1;

$feature = array("A" => $a_value,
                    "B" => $b_value,
                    "C" => $c_value,
                );

$featureJson = json_encode($feature);

я получаю это

{"A":"1","B":"0","C":"1"}

Затем в другом месте моей системы я использую это, чтобы получить его

$queryDeEjemplo = SELECT * FROM features WHERE id = 1
$json = $stmt->fetch();
// Resultado: string "{"A":"1","B":"0","C":"1"}"
$resultado = json_decode($json);
// Resultado: NULL

Почему это происходит?

я использую MYSQL. Поле feature имеет тип VARCHAR 500 символов.

 1
php
Author: Victor Alvarado, 2018-02-19

3 answers

Проблема

Проблема в том, что:

  1. выбраны все столбцы в таблице: SELECT * FROM features WHERE id = 1;
  2. Вы создаете массив: $json = $stmt->fetch(); что-то вроде этого:

    Array
    (
        [persona_id] => 9
        [persona_nom] => {"A":"1","B":"0","C":"1"}
        [ciudad_id] => 12
    )
    
  3. вы пытаетесь применить json_decode к этому массиву: $resultado = json_decode($json); когда такая функция должна получать в качестве параметра строку, а не массив.

Результатом этой процедуры является следующее Warning:

PHP Warning: json_decode () expects parameter 1 to be string, array Гивен

И вы получаете значение NULL, потому что параметр не может быть декодирован как неправильный.

Решения

1.

Поскольку предположение JSON, (я говорю предположение, потому что на самом деле это VARCHAR, внутри которого вы сохраняете строку в форме JSON), находится в одном столбце этой таблицы, вы можете получить его, обратившись к данным в этом столбце в частности.

Например:

$json = $stmt->fetch(PDO::FETCH_ASSOC);
$resultado = json_decode($json["persona_nom"]);
print_r($resultado);

Там у вас будет на экране:

{"A":"1","B":"0","C":"1"}

2.

Во всяком случае, здесь использование json_decode является избыточным, поскольку предположительно в столбце VARCHAR должен быть действительный json. На самом деле, если вы делаете это:

print_r ($json["persona_nom"]);

Результат такой же, как если бы вы использовали json_decode:

{"A":"1","B":"0","C":"1"}

И если это значение должно быть получено как действительный JSON в другом месте (вызов Ajax, служил REST и т.д.), с ним поместите header перед print_r было бы достаточно.

3. Лучшее решение

Нет ничего лучше, чем когда они относятся к вам как к тому, кто вы есть. В этом смысле MySQL позволяет использовать тип данных JSON, возможно, это лучше всего подходит, если вы хотите хранить объекты JSON в своей базе данных.

 2
Author: A. Cedano, 2018-02-19 14:50:10

Начиная с версии 5.7 MySQL, вы можете хранить JSON так же, как и в традиционном файле; все, что вам нужно, это создать поле, которое будет хранить эту информацию следующим образом:

CREATE TABLE mi_tabla( 
   id INT,
   campo_json JSON NOT NULL,
   detalle VARCHAR(100) NOT NULL
);

Обратите внимание, что JSON в 3-й строке приведенного выше кода является типом данных, который хранит поле.

Дополнительная информация: https://dev.mysql.com/doc/refman/5.7/en/json.html

 0
Author: Albert Hidalgo, 2018-02-19 13:57:35

Я нашел проблему в следующем:

  1. я получал массив с другими полями таблицы.
  2. я пытался преобразовать весь массив.
  3. затем просто обратитесь к полю, но также не servia.
  4. Prosegui преобразовать json в array, но доступ к значению, а не принимать весь массив.

    $resultJson = $stmt->traerUnico();
    // array ["features"] => string {"A":"1","B":"0","C":"1"}
    $result = json_decode($resultJson["features"]);
    // object(stdClass)#7 ["A"] => 1, ["B"] => 2, ["C"] => 3
    
 0
Author: Victor Alvarado, 2018-02-19 14:07:17