PHP, pdo, как вставить NULL в mysql, когда входные данные пусты, иначе входное значение

#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);
  

(обратите внимание, что приведенные выше примеры не экранированы и небезопасны, а просто пример использования)