PHP,pdo,当输入为空时如何向mysql插入NULL,否则输入值为空

PHP,pdo,当输入为空时如何向mysql插入NULL,否则输入值为空,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 (i

这是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可以在unique上设置null,但不能设置为零

$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;

首先,将
id
列设置为自动递增,其次,将语句更改为

"INSERT INTO tbl_temp (name) values (:name);"
如果不使用id,为什么不自动递增它

最后,像这样使用它:

$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)

MySQL(5.6+)有一个函数
NULL如果(a,b)
其中如果a=b则返回NULL,否则返回
a

INSERT INTO table (a,b,c) VALUES (123,NULLIF('$field',''),'xyz')
如果$field变量为空(
'
),它将返回NULL,否则返回$field

您可以手动执行此操作,就像在“$field”=''时手动执行一样,然后在其他“$field”结束时手动执行空操作
甚至

$stmt->bindValue(':name', $this->name?:null, PDO::PARAM_NULL);

(请注意,上述示例并非转义的、不安全的,只是一个使用示例)

-1,为什么??你能解释一下这不是真正的代码吗。1.它包含语法错误。2.它不包含为名称变量指定0的代码。请检查字段是否为空,否则请插入值或插入空值。这是您的网站,我的意思是它属于您。??当我告诉您发布真实代码时,这不是我个人的心血来潮。我只是告诉你网站规则。你愿意自己读吗?这个自动递增的东西和这个问题有什么关系?我同意迪玛的观点。问题中的id列是:
id(pri-unique)
。似乎没有理由不自动递增。@misterManSam如果它只是来自其他表的外键呢?不管怎样,id和这个关于名称字段的问题有什么关系?这只是一个建议,如果它的外键,它不应该被命名为
id
,我在回答的最后说,这只是一个建议,我相信OP会在需要时澄清。令人惊讶的是,还有一些人仍在学习,可以通过额外的建议来提高;)