Я использую этот код, и меня больше не волнует:
try {
$dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
}
catch(PDOException $e)
{
...
}
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');
$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem
PDO::PARAM_NULL, null, '',
все они терпят неудачу и выдают эту ошибку:
Неустранимая ошибка : невозможно передать параметр 2 по ссылке в / opt / ...
bindValue()
overbindParam()
; для всего, а не только дляNULL
ценности. Я не могу придумать ни одного случая, когда вам нужно было бы привязать параметр к ссылке на переменную PHP, но это то, чтоbindParam()
нужно.При использовании
bindParam()
вы должны передать переменную, а не константу. Итак, перед этой строкой вам нужно создать переменную и установить для нее значениеnull
Вы получите такое же сообщение об ошибке, если попытаетесь:
источник
При использовании
INTEGER
столбцов (которые могут бытьNULL
) в MySQL PDO имеет (для меня) неожиданное поведение.Если вы используете
$stmt->execute(Array)
, вы должны указать литералNULL
и не можете указыватьNULL
ссылку на переменную. Так что это не сработает:Но это сработает:
Пробовал это в MySQL 5.5.15 с PHP 5.4.1
источник
isset()
соотносится лучшеNULL
. Пустая строка также является значением.Для тех, у кого все еще есть проблемы (невозможно передать параметр 2 по ссылке), определите переменную с нулевым значением, а не просто передавайте null в PDO:
Надеюсь это поможет.
источник
У меня была такая же проблема, и я нашел это решение, работающее с bindParam:
источник
Если вы хотите вставить,
NULL
только когдаvalue
естьempty
или''
, но вставляйте,value
когда он доступен.A) Получает данные формы с помощью метода POST и вызывает функцию insert с этими значениями.
Б) Оценивает, не было ли поле заполнено пользователем, и вставляет,
NULL
если это так.Например, если пользователь ничего не вводит в
productName
поле формы, тогда$productName
будет «SET
но»EMPTY
. Итак, вам нужно проверить, есть лиempty()
, а если есть, то вставитьNULL
.Протестировано на PHP 5.5.17
Удачи,
источник
IFNULL()
функцию MySQL в строке запроса. Как это:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
Попробуй это.
источник
На основе других ответов, но с немного большей ясностью относительно того, как на самом деле использовать это решение.
Если, например, у вас есть пустая строка для значения времени, но вы хотите сохранить ее как нулевое значение:
Обратите внимание, что для значений времени вы должны использовать PARAM_STR, поскольку время хранится в виде строк.
источник
В моем случае я использую:
SQLite,
подготовленные операторы с заполнителями для обработки неизвестного количества полей,
Запрос AJAX, отправленный пользователем, где все является строкой, и нет таких вещей, как
NULL
значение иМне отчаянно нужно вставить
NULL
s, так как это не нарушает ограничения внешнего ключа (приемлемое значение).Предположим, теперь пользователь отправляет сообщение:
$_POST[field1]
со значением,value1
которое может быть пустой строкой""
или"null"
или"NULL"
.Сначала я делаю заявление:
где
{$sColumns}
это что-то вродеfield1, field2, ...
и{$sValues}
мои заполнители?, ?, ...
.Затем я собираю
$_POST
данные, связанные с именами столбцов в массиве,$values
и заменяю их наNULL
s:Теперь я могу выполнить:
и среди прочего обходить ограничения внешнего ключа.
Если, с другой стороны, пустая строка имеет больше смысла, тогда вам нужно проверить, является ли это поле частью внешнего ключа или нет (более сложно).
источник