2013-07-03 73 views
1

我想格式化mysql插入語句使用php sprintf,但這樣做插入0而不是NULL到記錄列。我在尋找解決此同時仍使用sprintf格式化的方式:試圖插入NULL,因爲它是空的時候MySQL插入到NULL INT列與PHP sprintf

$query = sprintf("INSERT INTO `efix_lines` 
        (EventID, Serial, SerialRequired, PartNumber, 
         MfgRev, DefectID, CircuitReference, CreatorID, 
         CreatorName, Created) 
        VALUES (%d, '%s', %d, '%s', '%s', %d, '%s', %d, '%s', '%s')", 
         $oSubmitData['EventID'], 
         EVL($oSubmitData['Serial'], NULL), 
         EVL($oSubmitData['SerialRequired'], NULL), 
         EVL($oSubmitData['PartNumber'], NULL), 
         EVL($oSubmitData['MfgRev'], NULL), 
         EVL($oSubmitData['DefectID'], NULL), 
         EVL($oSubmitData['CircuitReference'], NULL), 
         $oSubmitData['CreatorID'], 
         $oSubmitData['CreatorName'], 
         $pDate); 

//I made this quick EVL function to help with shorthand ternary operators within my actual syntax 
function EVL($var1, $var2){ 
    return (empty($var1) ? $var2 : $var1); 
}; 

問題是發生在DefectID列。 sprintf想插入一個整數作爲%d指令,所以它插入0而不是NULL。我能做什麼?

回答

2

您將需要使用%s,原因是,對於PHP null不是整數的有效價值,同時爲MySQL它完美的(假設列不聲明NOT NULL)。

你可能想要做這樣的事情

function NVLint($var) { 
    if (empty($var)) return 'NULL'; 
    else if (!is_numeric(!$var)) return 'NULL'; 
    else return round($var); 
} 

... sprintf ... 
    NVLint($oSubmitData['DefectID']), 
+0

絕對太棒了!我剛剛結束了使用'%s',然後從我的EVL()函數傳遞'NULL',你的函數似乎也有效! – sadmicrowave