2017-05-11 11 views
0

基本的なSQL文字列作成ツールを使用していますが、3値演算子を使用してNULL値または日付時間の値を条件付きで入力しようとしています。MS SQL Serverの日付付きPHP 3値演算子

すべての値が存在する場合のupdate文の基本構文です。

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

私はAjaxのポストからこれらの値を受けていますし、彼らは私の$ _POSTデータ内の有効な値だ、符号化と復号化のすべてが適切に行われています。フォームにdatetimeが指定されておらず、ユーザーがテーブルレコードへの更新を送信すると、データベースにNULL値を書きたいと思います。私は正しくこの作業を行うために私の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

今、私はそれで私はmはこの方法を探していますということ他の値をヌルとして格納する理由があり、foreachがそれに値する可能性があります。明日のテストの後に戻ってきます。ありがとう、 – Lucretius

+0

別の代替、ヘルパー関数: 'function null_or_val($ v){return $ v == '' || is_null($ v)? "NULL": "'"。$ val。 "'"; } '。 '... 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

関連する問題