【问题标题】:ON DUPLICATE KEY UPDATE with 0 value使用 0 值进行重复密钥更新
【发布时间】:2014-10-01 07:12:10
【问题描述】:

我有一个无法解决的大问题。

我有一个表格,可以将一些数据插入到 mysql 数据库中。如果我要插入一个重复的键,一些字段将会被更新。但如果表单包含空数据,则查询不会触及旧数据。 下一个查询有效,但如果我插入“0”,则查询不会使用新值(在本例中为“0”)升级该行,而其他数字则有效。

这是查询:

INSERT INTO booking_prices (Data, Room, Disponibilita) 
VALUES ($data, $room, $_POST['Disponibilita']) 
ON DUPLICATE KEY UPDATE Disponibilita = IF(VALUES(Disponibilita) <> '', VALUES(Disponibilita), Disponibilita)

【问题讨论】:

  • 您是否收到任何错误消息?

标签: php mysql null key duplicates


【解决方案1】:

你被 MySQL 的自动类型转换所困扰:

> select 0 = '', 0 <> '';
+--------+---------+
| 0 = '' | 0 <> '' |
+--------+---------+
|      1 |       0 |
+--------+---------+
1 row in set (0.00 sec)

请注意这两个测试实际上是如何成功的。 0 等于 ''

如果您允许将数字输入文本类型字段,您可能应该进行一些更严格的测试:

> select BINARY 0 = '', BINARY 0 <> '';
+---------------+----------------+
| BINARY 0 = '' | BINARY 0 <> '' |
+---------------+----------------+
|             0 |              1 |
+---------------+----------------+

【讨论】:

  • 那为什么要把它和一个字符串('')比较呢?
  • 如何检查表单中插入的值是否不等于空值?
  • 您将 $_POST 值直接插入到 yoru 查询中,因此您很容易受到SQL injection attacks 的攻击,如果该帖子字段确实完全为空(字符串长度为 0),您的查询将如下所示(data, room, )(注意 disponibilita 的空白处)并且是语法错误。
  • 不,实际上我之前检查过,例如我发布了该查询。如果字符串为空 $disponibilita = 'NULL',那么我将其改为 Disponibilita = IF(VALUES(Disponibilita) NULL, VALUES(Disponibilita), Disponibilita),
  • if (length(VALUES(disponsibilita)) = 0, ...) 可能会更好。真正的“空”值的长度为零。
猜你喜欢
  • 2015-12-11
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2018-06-24
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多