程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 字符串在傳遞過程中發生了變化,字符串傳遞

字符串在傳遞過程中發生了變化,字符串傳遞

編輯:關於PHP編程

字符串在傳遞過程中發生了變化,字符串傳遞


情況描述:

  前端輸入的內容是:;?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));

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved