Как вставить пустую строку вместо нуля в PHP PDO

Я рефакторинг кода, от mysql расширение до pdo's, Существующий db Схема такова, что почти для всех столбцов в 100 импульсных таблицах есть NOT NULL ограничение. Из-за этого ограничения я очень часто сталкиваюсь со следующей ошибкой, пока inserting а также updating данные.

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

обязанности:

  1. Невозможно изменить схему БД, т. Е. Удалить ограничение NOT NULL.
  2. Трудно проверить, является ли значение нулевым или нет, перед вставкой для каждого столбца.

Поэтому я ищу общее решение, где вместо пустой строки вставляется NULL это будет адресовано всем PDO заявления. я использую этот PDO вспомогательный класс.

3

Решение

Когда вы объявите свою колонку, сделайте это с NOT NULL DEFAULT '', Таким образом, MySQL заменит значение NULL пустой строкой.

1

Другие решения

После поиска в сети, наконец, прийти к следующему решению, расширяя 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();

Чтобы избежать слишком много проверок для removeNulls связать значения, передав array в качестве аргумента execute(),

Получил эту идею, ссылаясь на следующие источники

  1. Расширение класса PDO.
  2. Расширение класса PDOStatement а также этот.
  3. Другие источники в Интернете.
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector