#php #mysql #pdo
#php #mysql #pdo
Вопрос:
это таблица tbl_temp:
id(pri unique) name(unique, null able)
1 abc
2 null
3 eadf
4 null
5 null
это функция вставки:
$stmt = $this->conn->prepare("INSERT INTO tbl_temp (id, name) values (:id, :name);
$stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
$stmt->bindParam(':name', $this->name);
$stmt->execute();
это представление для функции вставки
<from action='' method='post'>
<input type='text' name='name'>
<input type='submit' />
</form>
теперь, если значение пусто для входного имени, оно должно присвоить null bindParam-> name, но здесь присваивается значение 0, которое выдает ошибку дублирования, если оно дает null, тогда все будет в порядке, потому что mysql может иметь null для unique, но не ноль
Комментарии:
1. -1, почему?? не могли бы вы объяснить, пожалуйста
2. Это не настоящий код. 1. Он содержит синтаксические ошибки. 2. он не содержит кода, который присваивает 0 переменной name.
3. проверьте, пусты ли поля, иначе вставьте значение или вставьте null
4. это ваш сайт, я имею в виду, что он принадлежит вам.????
5. Когда я говорю вам опубликовать реальный код, это не моя личная прихоть. Я просто рассказываю вам правила сайта. Хотите прочитать их самостоятельно?
Ответ №1:
Во-первых, установите для вашего id
столбца значение автоматического увеличения, во-вторых, измените ваше утверждение на
"INSERT INTO tbl_temp (name) values (:name);"
если вы не используете идентификатор, почему бы не увеличить его автоматически?
и, наконец, используйте его так:
$stmt = $this->conn->prepare("INSERT INTO tbl_temp (name) values (:name);")
$name = $this->name;
if($name == ""){
$stmt->bindValue(':name', null, PDO::PARAM_STR);
} else{
$stmt->bindParam(':name', $this->name, PDO::PARAM_STR);
}
$stmt->execute();
вам не нужно менять свою таблицу, если вы не хотите, я просто предлагаю это сделать, но в основном, если вы хотите установить null, просто используйте bindValue(':name', null, PDO::PARAM_STR);
Комментарии:
1. какое отношение имеет это автоинкрементное значение к вопросу?
2. Я согласен с Димой. В вопросе столбец id выглядит следующим образом:
id(pri unique)
. Похоже, нет причин не увеличивать значение автоматически.3. @misterManSam что, если это просто внешний ключ из другой таблицы? В любом случае, какое отношение id имеет к этому вопросу, который касается поля name?
4. это было просто предложение, если его внешний ключ, его не следует называть
id
, я сказал в конце моего ответа, что это просто предложение5. Я уверен, что OP уточнит, если это необходимо. Удивительно, но есть люди, которые все еще учатся и могут улучшить с помощью дополнительных советов 😉
Ответ №2:
Попробуйте это
$name = $this->name;
if(empty($name)){
$name = null;
}
$stmt = $this->conn->prepare("INSERT INTO tbl_temp (id, name) values (:id, :name)");
$stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
$stmt->bindParam(':name', $name);
$stmt->execute;
Ответ №3:
В MySQL (5.6 ) есть функция NULLIF(a,b)
, в которой, если a = b, она возвращает NULL, в противном случае она возвращает a
.
INSERT INTO table (a,b,c) VALUES (123,NULLIF('$field',''),'xyz')
если переменная $field пуста ( ''
), она вернет NULL, в противном случае $field
Вы можете сделать это вручную, например CASE WHEN '$field'='' THEN NULL ELSE '$field' END
, или даже
$stmt->bindValue(':name', $this->name?:null, PDO::PARAM_NULL);
(обратите внимание, что приведенные выше примеры не экранированы и небезопасны, а просто пример использования)