Почему при получении значения 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 символов.
3 answers
Проблема
Проблема в том, что:
- выбраны все столбцы в таблице:
SELECT * FROM features WHERE id = 1;
-
Вы создаете массив:
$json = $stmt->fetch();
что-то вроде этого:Array ( [persona_id] => 9 [persona_nom] => {"A":"1","B":"0","C":"1"} [ciudad_id] => 12 )
- вы пытаетесь применить
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 в своей базе данных.
Начиная с версии 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
Я нашел проблему в следующем:
- я получал массив с другими полями таблицы.
- я пытался преобразовать весь массив.
- затем просто обратитесь к полю, но также не servia.
-
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