ВСТАВКА значения 000 с PDO приводит к NULL

У меня небольшие проблемы с тем, чтобы PDO работал, как мне нужно, чтобы он работал при обработке целочисленного значения 0.

В системе фиктивных заказов final_status 0 представляет собой успешно размещенный заказ. Ошибки в порядке приводят к ненулевому целому числу для final_status, например 14, 5 и т. д. Неполные заказы требуют фактического значения NULL final_status.

Вот пример структуры таблицы:

CREATE TABLE `order_status` (
  `order_id` int(10) NOT NULL,
  `final_status` int(10) DEFAULT NULL,
  `date_status` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Когда порядок обновляется, я сталкиваюсь с проблемой, когда PDO либо устанавливает final_status из 0 в NULL, либо устанавливает фактические значения NULL / blank в 0 (в зависимости от того, какую константу я объявляю в операторе связывания).

Итак, если предположить:

$final_status = 0000;
$order_id = 123456;

Запрос на обновление:

try
{
    $q = "
        UPDATE
            order_status 
        SET
            final_status = :final_status
        WHERE
            order_id = :order_id 
    ";
    $stmt = $dbx_pdo->prepare($q);
    $stmt->bindValue(':final_status',       !empty($final_status)       ? $final_status     : NULL, PDO::PARAM_NULL);   
    $stmt->bindValue(':order_id',           !empty($order_id)           ? $order_id         : NULL, PDO::PARAM_INT);
    $stmt->execute();
    $stmt->closeCursor();

} catch(PDOException $err) {
    error_handler();
}   

Если я использую PARAM_NULL для первой константы bindParam, значения «0000» или пустые значения преобразуются в NULL, что создает ложноотрицательный результат.

Если я использую PARAM_INT, значения «0000» или пустые значения переводятся в 0, что создает ложное срабатывание и является плохим.

Итак, виновато ли определение таблицы или есть способ сделать то, что я хочу, с INT?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю (не уверен), проблема в том, что вы используете !empty(). Это преобразует 0 в false, что сделает тернарное условие недействительным. Следовательно, если $final_status == 0, ваше тернарное условие вернет null.

Попробуйте изменить его на:

isset($final_status) && $final_status >= 0 ? $final_status : null

или же

is_null($final_status) ? null : (int) $final_status

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

Завтра во второй половине дня протестирую и продолжу.

a coder 30.05.2018 00:10

Вот строка bindValue, которая в итоге сработала. Он правильно обрабатывает значения final_status, равные 0, целые числа и пустые значения. $stmt->bindValue(':final_status', isset($final_status) ? $final_status : NULL, PDO::PARAM_INT);

a coder 30.05.2018 21:32

из официальной документации http://php.net/manual/en/function.empty.php Следующие значения считаются пустыми:

  • "" (пустая строка)
  • 0 (0 как целое число)
  • 0,0 (0 в виде числа с плавающей запятой)
  • «0» (0 в виде строки)
  • НОЛЬ
  • ЛОЖНЫЙ
  • array () (пустой массив)

Это вернет истину.

<?php
    $final_status = 000;
    echo empty($final_status);

Вместо этого рассмотрите возможность использования isset.

$stmt->bindValue(':final_status',       !isset($final_status)       ? $final_status     : NULL, PDO::PARAM_NULL);

Вот строка bindValue, которая в итоге сработала. Он правильно обрабатывает значения final_status, равные 0, целые числа и пустые значения. $stmt->bindValue(':final_status', isset($final_status) ? $final_status : NULL, PDO::PARAM_INT);

a coder 30.05.2018 21:33

Другие вопросы по теме