Значение INSERTing '000' с PDO приводит к NULL - PullRequest
0 голосов
/ 30 мая 2018

У меня небольшие проблемы с тем, чтобы заставить 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 (в зависимости от того, какую константу я объявляю в операторе bind).

Итак, предполагая:

$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?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

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

  • "" (пустая строка)
  • 0 (0 как целое число)
  • 0.0 (0 в виде числа с плавающей точкой)
  • "0" (0 в виде строки)
  • NULL
  • FALSE
  • массив() (пустой массив)

Это вернет true.

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

Попробуйте вместо этого использовать isset.

$stmt->bindValue(':final_status',       !isset($final_status)       ? $final_status     : NULL, PDO::PARAM_NULL);
0 голосов
/ 30 мая 2018

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

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

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

или

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...