你如何正确地用 NULL 更新 mysql 字段?
Posted
技术标签:
【中文标题】你如何正确地用 NULL 更新 mysql 字段?【英文标题】:How do you properly update a mysql field with NULL? 【发布时间】:2011-12-21 16:21:37 【问题描述】:在 sql 查询中使用变量时如何正确更新 mysql 字段为 NULL 值?
我有一个名为 $timestamp 的变量。当它设置为date( Y-m-d h:i:s )
时,我必须将它用引号引起来,因为我在我的mysql 查询中传递了一个字符串。当 $timestamp 设置为 NULL 时,数据库查询包含 ''
作为 $timestamp 的值,并且字段更新为 0000-00-00 00:00:00
。将此字段保持为 NULL 以表明该进程以前从未运行过,这一点很重要。
我不想使用 now(),因为那时我的 sql 语句与我的类变量 $timestamp 不同步。
我不想将 $timestamp 设置为 'NULL',因为那个变量不准确。它不再是 NULL,它被设置为一个包含单词 NULL 的字符串。
我在这里错过了什么?
【问题讨论】:
嗯,问题 #1 是您正在使用 SQL 字符串构建进行查询。不要那样做(没有真正好的理由......然后,不要那样做)。使用占位符(或任何不需要构建 SQL 字符串的 ORM/框架)。不仅这个问题会“消失”,[许多意想不到的] 注入攻击漏洞也会“消失”。 我没有使用框架,但可以使用 php PDO。这会解决这个问题吗?我以前使用过活动记录,但从未使用过 PDO。 PDO does indeed support placeholders -- 和 mysqli 一样(虽然我不喜欢 mysqli 方法),所以至少有两个“标准”选项可用。 【参考方案1】:将列设置为 NULL 的正确 SQL 语法是:
UPDATE Table SET Column = NULL WHERE . . .
(注意文字 NULL 周围没有引号)。
您是使用 SQL 还是使用某种框架执行此更新?如果是一个框架,它应该识别 NULL 值并为您正确地将它们传递给数据库。
【讨论】:
【参考方案2】:经过大量研究,我发现如果您直接编写 sql 查询,这是一个众所周知的问题,没有好的解决方案。
正确的解决方案是使用数据库抽象层,如 PDO(用于 PHP)或 Active Record(用于 Codeignitor 和 Ruby on Rails 等框架)。
【讨论】:
以上是关于你如何正确地用 NULL 更新 mysql 字段?的主要内容,如果未能解决你的问题,请参考以下文章