如何在可空列中插入实际的NULL值?

9
function save($gmt, $name, $address, $phone, $remark)
{
    $query= "INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('$gmt', '$name', '$address', '$phone', '$remark')";
    mysql_query($query);
}

在这里,“address”,“phone”和“remark”可以是 NULL 。每当变量设置为 NULL 并且列可为空时,我需要它保存 NULL ,而不是插入空字符串。

如何使用PHP向数据库插入 NULL 值?


6
请不要在新的代码中使用mysql_*函数。它们已经不再受到维护并被正式弃用。看到���个红框框了吗?请学习prepared statements,然后使用PDOMySQLi。这篇文章(http://j.mp/QEx8IB)将帮助您决定哪种方法更适合您。如果您选择使用PDO,请看一下这篇好的教程(http://j.mp/PoWehJ)。 - tereško
好文章 http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls562.htm - NullPoiиteя
这回答您的问题吗?如何在MySQL语句中包含PHP变量 - Dharman
5个回答

10

This is PHP solution, but you have to use mysqli because mysql deprecated, please read more about mysqli. Also, you must consider SQL injection

function save($gmt, $name, $address, $phone, $remark)
{
  if(empty($phone)){
   $phone = 'NULL';
  }else{
   $phone = "'".$phone."'";
  }
  if(empty($remark)){
   $remark = 'NULL';
  }else{
   $remark = "'".$remark."'";
  }
    $query= "INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('$gmt', '$name', '$address', $phone, $remark)";
    mysql_query($query);
}
//tests
save("a", "b", "c", "", "")."<br>";
save("a", "b", "c", "d", "")."<br>";
save("a", "b", "c", "d", "e")."<br>";
/*
INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', NULL, NULL)
INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', 'd', NULL)
INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', 'd', 'e')
*/
?>

DEMO


使用三元运算符:$phone = ($phone == '' ? NULL : $phone); 可以减少很多代码。 - TheCarver
如果$phone是一个字符串值呢? - candlejack

5
尝试切换到预处理语句(这样还可以减少 SQL 注入的风险)。
function save($gmt, $name, $address, $phone, $remark)
{
    if(!isset($phone) || empty($phone)) { $phone = null; }
    if(!isset($remark) || empty($remark) { $remark = null; }

    $db = new PDO(...);

    $stmt = $db->prepare("INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES (:gmt, :name, :address, :phone, :remark)");
    $stmt->bindValue("gmt", $gmt, PDO::PARAM_STR);
    $stmt->bindValue("name", $name, PDO::PARAM_STR);
    $stmt->bindValue("address", $address, PDO::PARAM_STR);
    $stmt->bindValue("phone", $phone, PDO::PARAM_STR);
    $stmt->bindValue("remark", $remark, PDO::PARAM_STR);
    $stmt->execute();
}

这将在MySQL中正确处理null


1
这对他来说可能看起来非常复杂...你能否发布一个仅使用 mysqli_ 的解决方案? - IROEGBU
1
我认为使用 mysqli_* 不会更容易。 - Gerald Schneider
1
我想这只是我的偏见。由于我非常熟悉使用 mysql_*,所以将我的项目迁移到 mysqli_* 更容易。这就是为什么我认为新用户更容易掌握 mysqli_* - IROEGBU

4

PHP不会输出NULL - 它只是一个空字符串。因此,在您的示例中,您将尝试插入'',在SQL中又是一个空字符串。

您必须使用NULL(不带引号)。

而实现这个最佳实践的方法是使用ORM或具有数据库抽象层的PHP框架,它会为您执行此操作。


1
但是,我认为他需要检查变量是否为空... 他不能仅仅将变量替换为 NULL - IROEGBU
1
他必须使用非废弃函数(最好通过包装器),转义值,并仅在实际存在值时才使用引号...所以是的,有很多事情要做。 - Karoly Horvath
假设他是一个初学者...例如看看杰拉尔德的答案,它很有道理,但对于不使用面向对象编程的任何人来说仍然很复杂。 - IROEGBU

2
使用三目运算符,您也可以这样使用
$add = ($address == '' ? NULL : $address);
$phn = ($phone == '' ? NULL : $phone);
$rmk = ($remark == '' ? NULL : $remark);

-1

字段可以为NULL

-> 预计课程数量

-> 实际课程数量

$qtd_aulas_previstas = ( empty($qtd_aulas_previstas) ? 'NULL' : "'".$qtd_aulas_previstas."'");
$qtd_aulas_dadas     = ( empty($qtd_aulas_dadas)     ? 'NULL' : "'".$qtd_aulas_dadas."'");


//insere os dados na tabela
$inserir_tb = mysqli_query($conexao, "INSERT INTO tb_turma_bimestre VALUES('', '$cod_turma', '$cod_bimestre', $qtd_aulas_previstas, $qtd_aulas_dadas, '$data_abertura', '$data_encerramento', '$date_time', '$nome_login')")or die("Error2: " .mysqli_error($conexao));



在你的代码中使用 die(mysqli_error($conn)); 是一个非常糟糕的想法,因为它可能会泄露敏感信息。请参阅此帖子以获取更多解释:mysqli or die, does it have to die? - Dharman
谢谢!@Dharman,我将使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);代替die - rafaelspfonseca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接