Проблема с подготовленными операторами PHP

#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