2011-05-04 283 views
2

我沒有看到任何區別使用單引號或雙引號。何時或爲什麼我應該使用第一個而不是後者?PHP和mySQL單引號或雙引號?

我讀過一些地方,對於SQL我應該使用單身 - 爲什麼?

+0

很確定SQL中的ANSI標準是單引號。尋找一個參考 – Phil 2011-05-04 02:45:31

+0

可能重複[在SQL中的單引號和雙引號之間的區別是什麼?](http://stackoverflow.com/questions/1992314/what-is-the-difference-between-single-and-double -quotes-in-sql) – 2011-05-04 02:45:42

+0

@Phil Brown:ANSI-92支持對象名稱的雙引號 - 大多數數據庫都支持雙引號,以便指定非標準字符。 – 2011-05-04 02:47:07

回答

6

您應該使用單引號和mysql_real_escape_string的組合或移至PDO

的mysql_real_escape_string將帶您清潔制要存儲數據庫和單引號上會阻止它裏面的任何執行任何不潔變量的照顧。

下面是一個例子:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
      mysql_real_escape_string($user), 
      mysql_real_escape_string($password)); 

PDO的例子:

$dbh = new PDO('mysql:dbname=your_database;host=your_host', $user, $password); 
$stmt = $dbh->prepare('SELECT * FROM users WHERE user = :username AND password = :password'); 
$stmt->execute(array('username' => $user, 'password' => $password)); 

如果沒有適當的清潔制數據,你將要保存你可以從SQL注入受損。

例如正常查詢

SELECT * FROM users WHERE user = 'test' 

注入查詢:

SELECT * FROM users WHERE user = 'anything' OR 'x'='x' 

另一個例子:

SELECT * FROM users WHERE user = ' '; DROP TABLE users 

More about SQL injection attackSQL injection preventionMySQL Injection

Why you should be using php's PDO for database access

+0

忘掉整套「mysql_ *」函數並移至PDO。 – Phil 2011-05-04 03:03:09

+0

@Phil是的PDO也是另一種安全的方式。 – Prix 2011-05-04 03:03:46

+0

此外,PHP的MySQL擴展可防止執行多個查詢,因此「Bobby Tables」用例通常不適用於 – Phil 2011-05-04 03:04:36

2

使用哪一個更容易或更方便。如果它們對你來說都是一樣的話,那麼單引號是更便攜的,至少是理論。

如果正在生成查詢從-例如-PHP,然後單引號都比較方便寫作的SQL查詢,因爲雙引號允許PHP表達式來代替變量。

$query = "SELECT * FROM $sometable WHERE somefield = '1'"; 

根據PHP的規則,單引號(如果他們被使用)防止$sometable擴張。

至於理論便攜性,我已經使用了Oracle,MySQL和MS SQL服務器,SQL精簡版,以及一些本土口味,和從未有過的問題,無論是引號字符。

1

單引號是PHP更加嚴格。例如,單引號不允許在字符串內部替換變量。

$myval = "world"; 
echo "Hello $myval"; // produces "Hello world" 
echo 'Hello $myval'; // produces "Hello $myval" 

此外,你會認爲,由於單引號更嚴格,他們也會更有效,但事實並非如此。 PHP字符串操作的表現是一個有趣的(和記錄)的事情as seen here

1

字符串包含在雙引號是在PHP腳本中最常用的,因爲它們提供了最大的靈活性。這是因爲變量和轉義序列都將被相應地解析。

當字符串應完全按照陳述進行解釋時,在單引號內包含一個字符串非常有用。這意味着當解析字符串時,變量和轉義序列都不會被解釋。

雙引號派上用場,當你在你的MySQL語法

$query = "SELECT * FROM tableName WHERE columnName = '{$value}'"; 
+0

這是來自一本書,認爲它可能有幫助 – Brett 2011-05-04 02:55:02

+2

PHP與SQL有什麼關係? – 2011-05-04 03:11:58

+0

除了PHP在標題中,我假設你正在用PHP寫你的查詢。我會添加到我的答案... – Brett 2011-05-04 03:15:54

2

單引號如果你的MySQL服務器與--ansi標誌運行,則"雙引號"將停止工作。 SQL字符串必須包含在單引號'中。

或更具體地說,雙引號實際上表現得像反引號。它們可以用於列名稱:

SELECT "colum&name", `x&y` FROM "fictional-query" 
WHERE strcolumn = 'text' OR "column&name" = 'string' 

但是,如果mysqld沒有在ansi兼容模式下運行,那麼也會失敗。只有這樣的話,雙引號才能相當於字符串的單引號。這就是爲什麼他們應該避免。