2011-03-13 81 views
3

我注意到,当我INSERTSELECT值,并从数据库中,我有包围单引号的领域,像这样:何时用撇号包围SQL字段?

mysql_query("INSERT INTO employees (name, age) VALUES ('$name', '$age')");

不过,如果我是更新的时候,我会不使用单引号:

mysql_query("UPDATE employees SET age = age + 1 WHERE name = '$name'");

而且,它似乎加入的日期到SQL数据库,我没有用单引号要么围绕着它:

mysql_query("INSERT INTO employees (name, date) VALUES ('$name', NOW())");

此外,使用运营商如CONCAT时,似乎没有必要之一:

mysql_query("UPDATE employees SET name=CONCAT(name,$lastName) WHERE id='$id'");

也许我只是编码很差,但我似乎记得,如果我没有围绕一个领域在插入和选择它时操作失败时使用单引号。

+0

虽然不同的主题,也请阅读逃脱你把查询值:字符串只是把'$ name'是不安全的。搜索例如'mysql_real_escape_string()'和“sql-injection”。 – mvds 2011-03-13 15:45:11

+0

是啊,我总是这样做,没有后顾之忧^ _ ^ – 2011-03-13 15:47:18

回答

3

你需要用引号包围的值时,字段数据类型为textcharvarchar等或日期类型,如datetimedatetime的。

对于数值类型,例如intbigintdecimal等或SQL功能,如now()current_date,你不需要引号。

0

字符串值(包括单个字符)必须用单引号引起来。这包括使用字符串表示的日期常量。数字值不需要引号。

1

你必须让你的查询看到什么样的事物之间的区别:

  • 保留的SQL关键字:SELECTUPDATEWHERENULL,...(不区分大小写,但大多大写)
  • (sql)操作符和语法标记:+ -/*。 ()等等等等
  • SQL函数:NOW()CONCAT(),...
  • 领域,表名,数据库名:员工,年龄,姓名,日期,...这应该使用反引号被引用,比如`字段“,以避免混淆例如如果你命名一个栏ORDER

最后一组的值,可以是字符串文字像“约翰”或“约翰”,或号码,如1,10,1E9,1.005。 NULL是一个特殊的值,您可以将其粗略地描述为“未设置”。

数字不必用引号括起来,但字符串文字做。

这说明还远远没有完成或完美,但它应该给你的理解开始。

3

“时代”存在的问题既是一个PHP变量($岁)和作为MySQL的列名。列名不应被引用(一般来说),但是在select或insert语句中使用的列的内容应该被引用。

特别是,如果一个PHP变量的内容尚未确定,变量本身将消失,这会破坏你的语法。用单引号括起php变量将至少保护变量消失时的语法。

SELECT * from something where age = $age; 

如果由于某种原因$年龄还没有设置,如用户没有输入进入它,它将会完全消失,并因为它成为该行代码会产生在运行时语法错误"where age = ;"

SELECT * from something where age = '$age'; 

如果由于某种原因$年龄还没有设置,它会消失,但不会产生错误,因为它会成为“凡年龄=‘’;”并且仍然是很好的语法。

SQL注入仍然是可能的,当然这种情况下,但是这是一个不同的问题。