2011-03-13 44 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注入仍然是可能的,當然這種情況下,但是這是一個不同的問題。