3 回答

TA貢獻1829條經驗 獲得超13個贊
因為在第一個中,您忘記連接,從而導致錯誤。但是等等...。
....您應該始終使用準備好的語句,這樣您就不必再擔心查詢中的引號了!
在第二個查詢中,PHP 將用單引號插入變量,因為整個查詢被雙引號包圍。
小鮑比說你的腳本有SQL注入攻擊的風險。即使逃避繩子也是不安全的!

TA貢獻2011條經驗 獲得超2個贊
要回答您的問題,而不是繼續糾纏于查詢參數...
https://www.php.net/manual/en/language.types.string.php 解釋了在帶引號的字符串中使用引號字符的機制。
基本上,如果您的PHP字符串由分隔,那么下一個字符是字符串的末尾。"
"
但是,您可能希望在字符串中使用文字雙引號字符,但不要結束字符串。為此,您可以在它前面放置一個反斜杠,如下所示:
$sql = "INSERT INTO accountlist VALUES (\"\", \"$user\", \"$pwd\", \"$mail\", \"$date\")";
然后,反斜杠雙引號字符將成為字符串內容的一部分,而不是字符串末尾的分隔符。
但是,雙引號字符串中的單引號字符不會導致相同的歧義,因此不需要反斜杠。因此,以下工作沒有錯誤:
$sql = "INSERT INTO accountlist VALUES ('', '$user', '$pwd', '$mail', '$date')";
解析器可以分辨出單引號不是它要用來結束雙引號字符串的字符。因此,這些單引號被解析為文字字符。
這在許多其他編程語言中的工作方式相同,例如Java,C,C++,Ruby,Python,Perl,甚至在SQL本身中。
這就是為什么有些人可能聽起來不耐煩你問這個問題。這是一個非常初級的問題,表明你對編程語言的閱讀還不夠,你希望社區能為你提供個性化的輔導,讓你了解你應該自己掌握的概念。

TA貢獻1906條經驗 獲得超3個贊
他們說的是死在錢上...而且也相當容易!
您的查詢變為:
INSERT INTO accountlist VALUES ("", ?, ?, ?, ?)
交易品種(請注意,它們沒有括在引號中)是參數。?
現在,每次執行查詢時,您都會提供一個數組,其中包含四個值,以便在語句中從左到右替換。這些值可以是任何東西,你不必關心引號等,因為它們不是SQL的一部分。相反,參數是輸入。
如果你必須做“很多這樣的”,比如幾千或幾百萬次,你只準備一次語句,然后根據需要多次執行準備好的語句,每次提供不同的值數組作為輸入。
還有很多庫可以讓你按名稱指定參數,給出命名值的哈希值,例如
INSERT INTO accountlist VALUES ("", :user:, :pwd:, :mail:, :date:) { 'user' => 'fred', 'pwd' => 'secret', 'mail' => '[email protected]', 'date' => today() }
...并且該庫會將其轉換為有效的 SQL 語句,如上所示。
更安全,更少頭痛,并且明顯更有效率。
- 3 回答
- 0 關注
- 167 瀏覽
添加回答
舉報