標籤:

為什麼php在向mysql提交數據時變數外要用單引號?

$s="ss";
mysql_query("INSERT INTO Comment (comment,date,username,signature)
VALUES ("$s",NOW(),"111",$signature)");

正常情況變數外不是不能用引號嗎,我也試了其他情況,用引號都是無效的。

這裡需要用單引號是什麼原理?

還有沒有其它情況變數外需要加單引號的?


$s="ss";
mysql_query("
INSERT INTO Comment (comment, date, username, signature)
VALUES ("$s", NOW(), "111", $signature)
");

對SQL語句中 "$s" 的解釋:

因為$s變數對應comment欄位,而該欄位的類型是字元串.

在SQL語法中,字元串賦值,就應該用單引號或雙引號括起來.

又因為PHP中整個SQL語句使用了雙引號,所以裡面的變數$s會被解析.

題外話:

PHP7已經不支持mysql擴展,建議使用mysqli或者pdo擴展.

防禦SQL注入應該使用預處理參數化查詢,比如:

$db = new mysqli($host, $user, $pass, $name, $port);
$db-&>set_charset("utf8"); // 指定編碼(重要)
$sql = "
INSERT INTO `comment` (comment, date, username, signature)
VALUES (?, ?, ?, ?)
";
$stmt = $db-&>prepare($sql); // 預處理
$stmt-&>bind_param("ssss", $var1, $var2, $var3, $var4); // 參數化
$stmt-&>execute(); // 查詢
var_export(
($stmt-&>affected_rows === -1 || $stmt-&>affected_rows === 0) ? false : $stmt-&>insert_id
); // INSERT操作結果


字元串肯定要加引號啊,你得告訴mysql你傳遞的數據類型啊。

這裡的單引號原理很好理解,就是外圍使用了雙引號,所以PHP的編譯器會把雙引號內部的單引號視為普通字元串,而不會視為語言中的字元串定義。


$s = "ss";

mysql_query("INSERT INTO Comment (comment, date, username, signature) VALUES ("$s", NOW(), "111", $signature)");

等於

$s = "ss";

$s1 = "INSERT INTO Comment (comment, date, username, signature) VALUES ("$s", NOW(), "111", $signature)";

mysql_query($s1);

PHP 在string內可以使用變數,變數會在賦值時合併在裡面,但是建議這樣使用{$s}。

也就是說進入 mysql_query 內的值是:

INSERT INTO Comment (comment, date, username, signature) VALUES ("ss", NOW(), "111", $signature)

mysql_query 方法傳入的值是一個SQL,SQL對於string類型要加引號,這是SQL的規範,與PHP無關。


MixPHP —— 基於 Swoole 的常駐內存型 PHP 框架

mixstart/mixphp


評論肯定是字元串,存資料庫的時候當然得加引號。

明天上具體例子,先佔個位置


簡單粗暴,那樣才能識別啊。


推薦閱讀:

SQL Server 與 MySQL 性能相差多大?
產品DBA、開發DBA、運維DBA的區別?
MySQL多表關聯查詢效率高點還是多次單表查詢效率高,為什麼?
如何才能招到優秀的 MySQL DBA?
分散式系統架構實戰--簡易版支付系統怎麼部署?

TAG:PHP | SQL | MySQL |