2017-05-11 58 views
0

我正在做一個基本的SQL字符串生成器,我試圖使用三元操作符有條件地提供一個空值或datetime的值到語句中。PHP三元操作符與MS SQL服務器的日期

如果存在所有值,則更新語句的基本語法。

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

我從Ajax後接受這些值,而且他們有效值在我的$ _ POST數據,所有的編碼和解碼被適當地進行。當表單上沒有指定日期時間並且用戶向表記錄提交更新時,我想要向數據庫寫入空值。我想在我的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服務器。
  • 我使用「和」正在這混亂

回答

1

另一種變型:

$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); 

    ... 
} 
+0

現在,我看它這樣我米ay有理由將其他值存儲爲空值,這使得foreach可能值得。經過一些測試後明天會回來。謝謝, – Lucretius

+0

另一種方法,一個輔助函數:'function null_or_val($ v){return $ v ==''|| is_null($ v)? 「NULL」:「'」。$ val。「'」; }'。你可以像'... SET myField =「.null_or_value($ myField)一樣使用它。」 ...' – ccKep

1

我喜歡用vsprintf對於這樣的事情,我認爲這使事情變得更好看。你可以閱讀更多有關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); 
+0

''「。 $ ScheduledTime。 「'」,我不知道爲什麼我沒有想到這樣寫 vsprintf看起來更乾淨。經過一些測試後明天會回來。謝謝, – Lucretius