2015-12-16 117 views
3

我在重構代碼,從mysql擴展到pdo's。現有的db模式是這樣的,對於100個脈衝表中的幾乎所有列都具有約束條件NOT NULL。由於這個限制,我經常面臨以下錯誤,同時insertingupdating的數據。如何在PHP PDO中插入空字符串而不是null

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'some-column-name' cannot be null

義務:

  1. 它不可能改變DB模式I,E刪除NOT NULL約束。
  2. 在插入每列之前,很難檢查值是否爲空。

所以我想找一份空字符串被插入,而不是NULL,將所有PDO語句來解決一個通用的解決方案。我正在使用thisPDO助手類。

+0

你能提供一個你如何插入數據的例子嗎? – Ukuser32

回答

1

當您申報專欄時,請使用NOT NULL DEFAULT ''。這樣,MySQL將用空字符串替換NULL值。

+0

感謝您的回覆,但正如我在「義務」一節中所述,不可能更改數據庫模式。 –

0

在網絡搜索後,最終通過擴展PDOStatement類來解決以下問題。請記住這個學分在SE和其他網絡來源。

class CustomPDOStatement extends PDOStatement 
{ 

public $removeNulls = FALSE; 
public $dbh; 

protected function __construct($dbh) 
{ 
    $this->dbh = $dbh; 
} 

public function execute($input_parameters = null) 
{ 
    if ($this->removeNulls === TRUE && is_array($input_parameters)) { 
     foreach ($input_parameters as $key => $value) { 
      if (is_null($value)) { 
       $input_parameters[$key] = ''; 
      } 
     } 
    } 

    return parent::execute($input_parameters); 
} 

public function bindValue($parameter, $value, $data_type = PDO::PARAM_STR) 
{ 
    if ($this->removeNulls === TRUE && is_null($value)) { 
     $value = ''; 
    } 

    return parent::bindValue($parameter, $value, $data_type); 
} 

public function bindParam($parameter, &$variable, $data_type = PDO::PARAM_STR, $length = null, $driver_options = null) 
{ 
    if ($this->removeNulls === TRUE && is_null($variable)) { 
     $variable = ''; 
    } 

    parent::bindParam($parameter, $variable, $data_type, $length, $driver_options); 
} 
} 

雖然插入或更新我在做這樣的

$insertUser = $pdoDB->prepare("INSERT INTO users (id,email,name,age) VALUES (:id, :email, :name, :age)"); 
$insertUser->removeNulls = TRUE; 
$insertUser->bindValue(':id', $id); 
$insertUser->bindValue(':email', $email); 
$insertUser->bindValue(':name', $name); 
$insertUser->bindValue(':age', $age); // May be NULL 
$insertUser->execute(); 

通過傳遞array作爲參數傳遞給​​避免removeNulls值綁定了太多的檢查。

參照以下來源

  1. Extending PDO class得到這個想法。
  2. Extending PDOStatement classthis
  3. 網絡的其他來源。
相關問題