如何在PHP PDO中插入空字符串而不是null

时间:2015-12-16 12:15:33

标签: php mysql pdo null constraints

我正在重构代码,从mysql扩展名到pdo's。现有的db模式是这样的,即100个脉冲表中的几乎所有列都具有NOT NULL约束。由于这种限制,我在insertingupdating数据时经常面临以下错误。

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

义务:

  1. 无法更改数据库模式,删除NOT NULL约束。
  2. 在插入每一列之前,很难检查值是否为null。
  3. 所以,我正在寻找一个通用的解决方案,其中插入了空字符串而不是NULL,将针对所有PDO语句进行处理。我正在使用this PDO助手类。

2 个答案:

答案 0 :(得分:1)

声明列时,请使用NOT NULL DEFAULT ''。这样,MySQL将用空字符串替换NULL值。

答案 1 :(得分:0)

在网上搜索后,最后通过扩展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();

插入或更新时,我正在这样做

removeNulls

通过将array作为参数传递给execute()来避免对DateRange绑定值进行过多检查。

通过引用以下来源获得这个想法

  1. Extending PDO class
  2. Extending PDOStatement classthis
  3. 其他网络来源。