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}'";
我没有考虑的部分:
- SQL 服务器的日期需要用 '' 包装。
- 我对 ' 和 " 的使用让人感到困惑。
另一个变体:
$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);
我正在做一个基本的 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}'";
我没有考虑的部分:
- SQL 服务器的日期需要用 '' 包装。
- 我对 ' 和 " 的使用让人感到困惑。
另一个变体:
$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);