Home  >  Article  >  Backend Development  >  字符串在传送过程中发生了变化

字符串在传送过程中发生了变化

WBOY
WBOYOriginal
2016-06-13 12:27:18871browse

字符串在传递过程中发生了变化

情况描述:

  前端输入的内容是:;?9W/U\|"s6u|:M

  然而传递到后端再保存到数据库时就成了:;?9W/U|"s6u|:M

这是为什么呢?

  这是怎么回事呢?

  1:我发现在insert到数据库之前都还是正确的

  2:然后单独使用heidisql工具去更改这个值,它显示的sql语句是:

<code><span class="sql1-reservedword">  UPDATE<span class="sql1-space"> <span class="sql1-delimitedidentifier">`bitstorm_http_node`<span class="sql1-symbol">.<span class="sql1-delimitedidentifier">`config_user_pwd`<span class="sql1-space"> <span class="sql1-reservedword">SET<span class="sql1-space"> <span class="sql1-delimitedidentifier">`Password`<span class="sql1-symbol">=<span class="sql1-string">';?9W/U\\|"s6u|:M'<span class="sql1-space"> <span class="sql1-reservedword">WHERE<span class="sql1-space">  <span class="sql1-delimitedidentifier">`Id`<span class="sql1-symbol">=<span class="sql1-number">14<span class="sql1-symbol">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

  我们发现程序在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()函数来手动转义即可

       <span style="color: #800080;">$pwd</span> = <span style="color: #008080;">addslashes</span>(<span style="color: #800080;">$pwd</span><span style="color: #000000;">);/<span style="font-size: 15px;"><strong><span style="color: #339966;">/加这行代码后保存到数据库就对了,OK,解决问题        </span></strong></span></span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$zabbixHelper</span>==<span style="color: #0000ff;">false</span><span style="color: #000000;">){            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->returnError("Invalid input: Can not login zabbix using this username and password."<span style="color: #000000;">);        }        </span><span style="color: #800080;">$sql</span> = "INSERT INTO `bitstorm_http_node`.`config_user_pwd` (`Id`, `Domain_Name`, `Username`, `Password`) VALUES (0, '" . <span style="color: #800080;">$domainName</span> . "', '" . <span style="color: #800080;">$username</span> . "', '" . <span style="color: #800080;">$pwd</span> . "');"<span style="color: #000000;">;        </span><span style="color: #800080;">$this</span>->callSqlQuery(<span style="color: #800080;">$sql</span>));

 

  最后,在PHP中,有时候json编码后也需要转义:

      $parameters = addslashes(json_encode($args));

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn