#php #mysql #pdo #mysql-json
Вопрос:
У меня есть MySQL 5.7 и запрос с PDO:
$data['id'] = 1;
$data['key'] = 'new_field';
$data['value'] = 1;
$query= "
UPDATE `table`
SET `data` = JSON_MERGE_PATCH(`data`, JSON_OBJECT(:key, :value))
WHERE `id` = :id
";
...
prepare($query);
execute($data);
Но после этого у меня возникают:
ID | данные |
---|---|
1 | {«старое поле»: 2, «новое поле»: «1»} |
Почему мое новое значение имеет строковый тип? Ожидаемая таблица:
ID | данные |
---|---|
1 | {«старое поле»: 2, «новое поле»: 1} |
У меня есть успех без использования PDO( JSON_OBJECT('new_field', 1)
), но у меня есть строковый тип с использованием заполнителей.
Комментарии:
1.
JSON_MERGE_PATCH(
данные, JSON_OBJECT(:key, :value 0))
2. Пожалуйста, покажите нам PHP-код.
Ответ №1:
Когда вы передаете массив в PDOStatement::execute()
метод, все значения будут переведены в строку. Если вы хотите, чтобы PDO сохранял их в виде целых чисел, вы должны связать их с помощью bindValue()
и указать подсказку типа, пометив ее как целое число.
$stmt = $pdo->prepare($sql);
$stmt->bindValue('key', 'new_field');
$stmt->bindValue('value', 1, PDO::PARAM_INT);
$stmt->execute();
В качестве альтернативы вы можете привести значение к целому числу в SQL, либо добавив к нему ноль, либо используя CAST(:value AS SIGNED)
.