Как я могу обновить столбец json с правильным типом данных с помощью PDO?

#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) .