PHP 日期为 MS SQL 服务器的三元运算符

PHP Ternary Operator with Dates to MS SQL Server

我正在做一个基本的 sql 字符串生成器,我正在尝试使用三元运算符有条件地将空值或日期时间的值提供给语句。

所有值都存在时更新语句的基本语法。

UPDATE tblRecvLog
SET ScheduledTime = 'datetime',
    ScaleInTime = 'datetime',
    SampleToLabTime = 'datetime',
    ScaleWeight = 'weight',
    SealTop = 'sealnumber',
    SealBottom = 'sealnumber'
 WHERE pkRecvLogID = 'uniqueid';

我从 ajax post 接收到这些值,它们是我的 $_POST 数据中的有效值,所有编码和解码都已正确完成。当表单上未指定日期时间并且用户提交对 table 记录的更新时,我想向数据库写入一个空值。我正在尝试在我的 sql 字符串生成器中正确使用三元运算符来完成这项工作。

$sql = "UPDATE tblRecvLog SET "
            . ($ScheduledTime == '') ? "ScheduledTime = NULL," : "ScheduledTime = '{$ScheduledTime}',"
            . ($ScaleInTime == '') ? "ScaleInTime = NULL," : "ScaleInTime = '{$ScaleInTime}',"
            . ($SampleToLabTime == '') ? "SampleToLabTime = NULL," : "SampleToLabTime = '{$SampleToLabTime}',"
            . "ScaleWeight = '{$ScaleWeight}',
            SealTop = '{$SealTop}',
            SealBottom = '{$SealBottom}'
        WHERE pkRecvLogID = '{$pkRecvLogID}'";

我没有考虑的部分:

另一个变体:

$vars = array(
    "ScheduledTime" => $ScheduledTime,
    "ScaleInTime" => $ScaleInTime,
    "SampleToLabTime" => $SampleToLabTime,
    "ScaleWeight" => $ScaleWeight
    "SealTop" => $SealTop,
    "SealBottom" => $SealBottom
);

$set = array();
foreach($vars as $k => $v)
{
    if ($v == '' || is_null($v))
    {
        $set[] = sprintf("`%s` = NULL", $k);
    } else {
        $set[] = sprintf("`%s` = '%s'", $k, $v);
    }
}

$set = implode(', ', $set);

if ($set != "")
{
    $sql = sprintf("UPDATE `tblRecvLog` SET %s WHERE `pkRecvLogID` = '%s'", $set, $pkRecvLogID);

    ...
}

我喜欢用vsprintf for this sort of thing, I think it makes things nicer to read. You can read more about the format specifiers。在此示例中,我仅使用 %s 来表示字符串。

<?php
$query = "
UPDATE 
  tblRecvLog 
SET 
  ScheduledTime = %s, 
  ScaleInTime = %s, 
  SampleToLabTime = %s, 
  ScaleWeight = '%s', 
  SealTop = '%s', 
  SealBottom = '%s'
WHERE 
  pkRecvLogID = '%s';";

$values = [
  ($ScheduledTime == '')  ? NULL : "'" . $ScheduledTime . "'",
  ($ScaleInTime == '')    ? NULL : "'" . $ScaleInTime . "'",
  ($SampleToLabTime = '') ? NULL : "'" . $SampleToLabTime . "'",
  $ScaleWeight,
  $SealTop,
  $SealBottom,
  $pkRecvLogID,
];

$sql = vsprintf($query, $values);