2014-09-29 83 views
0

我知道有關於此主題的其他帖子,但他們不回答基本問題。以前的答案都說使用PDO :: PARAM_NULL,但是這並不能消除使用PDO的全部原因嗎?無法設置NULL與PDO

這裏是我的代碼:

$sql = "INSERT INTO users_address (uid,street1,street2,city,state,region,postalcode,country) VALUES (?,?,?,?,?,?,?,?)"; 
    $stmt = $this->db->conn_id->prepare($sql); 
    $stmt->bindParam(1, $uid, PDO::PARAM_INT); 
    $stmt->bindParam(2, $street1, PDO::PARAM_STR); 
    $stmt->bindParam(3, $street2, PDO::PARAM_STR); 
    $stmt->bindParam(4, $city, PDO::PARAM_STR); 
    $stmt->bindParam(5, $state, PDO::PARAM_STR); 
    $stmt->bindParam(6, $region, PDO::PARAM_STR); 
    $stmt->bindParam(7, $postalcode, PDO::PARAM_STR); 
    $stmt->bindParam(8, $country, PDO::PARAM_STR); 
    $stmt->execute(); 

並非所有這些值都必需的,這樣有時候他們是空的。 varchar和int數據庫字段都有default = null。我怎樣才能做到這一點,以便如果變量恰好爲null,那麼null會被插入?我見過的所有其他答案都爲第二個參數傳遞了NULL,但是我怎麼知道它在運行時是空的?

要清楚。我不想隱式插入null。如果用戶沒有完成表單,我想要插入一個可能爲null的變量。並非所有字段都需要在表單上。例如,在這個例子中,$ street2。

+0

你究竟想要插入什麼(即'$ street1','$ city' ...包含什麼?),你會得到什麼? – 2014-09-29 14:22:01

+0

可能重複[如何使用PDO插入NULL值?](http://stackoverflow.com/questions/1391777/how-do-i-insert-null-values-using-pdo) – DanFromGermany 2014-09-29 14:24:09

+0

不是重複丹和我解釋了爲什麼。 :) 這些字段來自已發佈的表單。並非所有字段都是必需的,所以有些可能爲空。我收到一個錯誤,說不能處理空值。 – 2014-09-29 14:26:52

回答

3

在SQL,或者至少標準的SQL和是啊,我看你最SQL口味,Oracle- NULL是一個與空字符串完全不同的特殊值。在SQL代碼中,您使用關鍵字NULL來表示前者和後者的空引號。

您的輸入來自HTML表單。 HTML表單總是以純文本形式提交:您沒有其他任何東西,沒有數字,沒有日期......當然也沒有空值。每當你需要一個實際的NULL,你需要一些後處理。令人高興的是,PDO將PHP空值轉換爲SQL空值:

$stmt->bindValue(6, $region!='' ? $region : null, PDO::PARAM_STR); 

PDO(和SQL),只是不知道HTML和你不會做。

我也用bindValue()取代了bindParam(),使它更加簡潔。

+0

我這樣做,甚至設置$ mynull = null並將其作爲$ mynull傳遞,但得到此警告: 「只能通過引用傳遞變量」。 這只是一個警告,但我更喜歡更乾淨的代碼沒有警告。我是否需要在綁定之外完成所有的任務? – 2014-09-29 15:49:19

+1

是的,你正在使用bindParam(),所以你需要傳遞一個實際的變量。也許你只是想使用bindValue()。 – 2014-09-29 15:52:57

1

使用PARAM_NULL插入null值或其他PARAMS你已經有:

if (!isset($uid) || strlen($uid) == 0) { 
    $stmt->bindParam(1, null, PDO::PARAM_NULL); 
} else { 
    $stmt->bindParam(1, $uid, PDO::PARAM_INT); 
} 
+0

我可以在變量行上使用三元運算符嗎?我想這會起作用。 $ stmt-> bindParam(1,($ uid)?$ uid:null,PDO :: PARAM_INT); – 2014-09-29 14:30:03

+0

我認爲應該有效。我讀過'PARAM_INT'與空作品。 – DanFromGermany 2014-09-29 14:31:52

+0

爲什麼在沒有提供信息時不插入空字符串而不是空字符? – DanFromGermany 2014-09-29 14:34:15