字符串在传递过程中发生了变化,字符串传递情况描述:
前端输入的内容是:;?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));
http://www.bkjia.com/phpjc/1069124.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1069124.htmltecharticle字符串在传递过程中发生了变化,字符串传递 情况描述: 前端输入的内容是:;?9w/u\|s6u|:m 然而传递到后端再保存到数据库时就成了:;?9...