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

3
我正在重构代码,从mysql扩展到pdo。现有的db模式是这样的,几乎所有100个脉冲表中的列都有NOT NULL约束。由于这个约束,我经常在插入更新数据时遇到以下错误。

SQLSTATE [23000]:完整性约束违规:1048列'一些列名'不能为空

义务:

  1. 不可能更改db模式,即删除NOT NULL约束。
  2. 对每个列进行插入之前检查值是否为空很困难。

因此,我正在寻找一个通用解决方案,其中空字符串将被插入而不是NULL,这将适用于所有PDO语句。我正在使用PDO助手类。


你能提供一个如何插入数据的示例吗? - Ukuser32
2个回答

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

谢谢您的回复,但正如我在“义务”部分提到的那样,无法更改数据库架构。 - Mahesh.D

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();

为了避免在传递 execute() 的参数时过多地检查 removeNulls 绑定值,可以通过将 array 作为参数传递来实现。
参考以下来源得出这个想法:
  1. 扩展PDO类
  2. 扩展PDOStatement类this
  3. 其他网络来源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接