情況描述:
前端輸入的內容是:;?9W/U\|"s6u|:M
然而傳遞到後端再保存到數據庫時就成了:;?9W/U|"s6u|:M
這是為什麼呢?
這是怎麼回事呢?
1:我發現在insert到數據庫之前都還是正確的
2:然後單獨使用heidisql工具去更改這個值,它顯示的sql語句是:
UPDATE `bitstorm_http_node`.`config_user_pwd` SET `Password`=';?9W/U\\|"s6u|:M' WHERE `Id`=14;
我們發現程序在insert操作之前,它在值中添加了轉義付去轉義特殊符號'\'
可以究竟為什麼會轉義?難道是字符串的單引號雙引號在作祟嗎?
如果把字符放在單引號'之間,除了單引號本身'之外的絕大多數字符會解釋成和寫在代碼中一樣的形式。
放在雙引號之間的字符串支持插入替換(內嵌在字符串中的變量會被替換成其內容),而且也會替換轉義字符,例如用換行符替換\n,用tab替換\t,\換成\\。同樣,\|它會解釋成|
如果把上面的PHP中的代碼的sql置於單引號中,則會是無效的sql語句:
Invalid query
INSERT INTO `bitstorm_http_node`.`config_user_pwd` (`Id`, `Domain_Name`, `Username`, `Password`) VALUES (0, "mdc-mon-tg-zabvip01.ubisoft.onbe", "cheng.wang", ";?9W/U\|"s6u|:M");
解決辦法:
在PHP中:並不是每一段被轉義的數據都要插入數據庫的,如果所有進入 PHP 的數據都被轉義的話,那麼會對程序的執行效率產生一定的影響,會產生性能問題。
在運行時調用轉義函數(如 addslashes())更有效率。
所以很明顯,這裡插入數據庫我們需要轉義,所以在需要轉義的地方調用addslashes()函數來手動轉義即可
$pwd = addslashes($pwd);//加這行代碼後保存到數據庫就對了,OK,解決問題 if($zabbixHelper==false){ return $this->returnError("Invalid input: Can not login zabbix using this username and password."); } $sql = "INSERT INTO `bitstorm_http_node`.`config_user_pwd` (`Id`, `Domain_Name`, `Username`, `Password`) VALUES (0, '" . $domainName . "', '" . $username . "', '" . $pwd . "');"; $this->callSqlQuery($sql));
最後,在PHP中,有時候json編碼後也需要轉義:
$parameters = addslashes(json_encode($args));