#php #mysql #mysqli #prepared-statement
#php #mysql #mysqli #подготовленное заявление
Вопрос:
Я получаю сообщение об ошибке
Column 'fname' cannot be null
На самом деле это не null. Я думаю, что что-то не так с привязкой. Нужно ли мне также bind NOW ()?
$stmt = $db->prepare("INSERT INTO `users` (`fname`, `mname`, `lname`, `email`, `pass`, `reg_dt`) VALUES (?, ?, ?, ?, ?, NOW())") or die(htmlspecialchars($db->error));
$rc = $stmt->bind_param("sssss", $fname, $mname, $lname, $email, $pass) or die(htmlspecialchars($stmt->error));
??
Комментарии:
1. вы можете использовать не null в таблице, а временную метку. Кроме того, вам не нужно привязывать NOW ();
2. Я не хочу обновлять временную метку при обновлении строки
3. Можете ли вы предоставить содержимое переменных, которые вы привязываете?
4. 1 @Marcus, более конкретно, вы уверены, что
$fname
это переменная PHP с не-null
значением?
Ответ №1:
Ваша схема, вероятно, имеет NOT NULL
атрибут для fname, именно поэтому вы получаете ошибку null.
Согласно вашему коду, вы, похоже, правильно привязываете параметры, вы проверяли, действительно ли $ fname является значением?
Альтернативная конструкция, для ясности (лично мне не нравится привязка ?, ?, ?). Кроме того, позвольте мне уточнить следующий код, сказав, что это PDO, а не mysqli, в OP не указано, какой из них использовался, что это только для демонстрационных целей:
$sql =
"INSERT INTO `users` " .
"SET fname = :fname, " .
"mname = :mname, " .
"lname = :lname, " .
"email = :email, " .
"pass = :pass, " .
"reg_dt = NOW()";
$stmt = $db->prepare($sql);
$stmt->bindValue(':fname', $fname, PDO::PARAM_STRING);
$stmt->bindValue(':mname', $mname, PDO::PARAM_STRING);
$stmt->bindValue(':lname', $lname, PDO::PARAM_STRING);
$stmt->bindValue(':email', $email, PDO::PARAM_STRING);
$stmt->bindValue(':pass', $pass, PDO::PARAM_STRING);
Или, если вы не предпочитаете конструкцию, вы можете рассмотреть возможность добавления CURRENT_TIMESTAMP
атрибута к вашему столбцу временных меток:
`reg_dt` timestamp NULL default CURRENT_TIMESTAMP
Комментарии:
1. Для меня это было похоже на PDO. Sytax не был «полностью» неправильным, просто забыл удалить SET из последующих строк, когда я копировал / вставлял их.
2. @Phil: Видишь us3.php.net/manual/en/pdostatement.bindparam.php . Что конкретно не так с
INSERT
синтаксисом? Ваша ссылка на документы MySQL, пример # 2, подтверждает, что я могу создатьSET
список столбцов и значений, разделенных запятыми. Не говоря уже о том, что я просто запустил тот же запрос из командной строки, чтобы убедиться.3. Мои искренние извинения. Не был осведомлен о том, что MySQL изменил
INSERT
синтаксис. Если вы собираетесь запустить PDO (который получает от меня 1), возможно, вам потребуется объяснить, что он отличается от библиотеки mysqli, используемой в настоящее время OP