mysql json转义字符_转义字符:html、mysql、postgresql、json、php

结论:

2、使用php addslashes是错误的。因为它不对应mysql或pgsql。PHP官方强烈建议使用对应mysql的mysqli_real_escape_string()和对应PostgreSQL的pg_escape_string()。http://php.net/manual/en/function.addslashes.php

3、保存到数据库之前使用htmlspecialchars是错误的。应直接保存到数据库。通过API提供给手机app看,C++不需要转义HTML。通过web看时,才需要转义。见下图。

4、使用phpmysql_escape_string是错误的,已废弃,应使用mysqli::real_escape_string。http://php.net/manual/en/function.mysql-escape-string.php

5、数据入库前根据不同数据库进行不同的转义,这放在dao层。controller、model都不应该知道。

错误的转义方式:

d424f7206eb32d537cc33e70eade2f6e.png

正确的转义方式:

3e61a1ba2fb644a0d91c2c8df989c84e.png

详细分析如下。

为什么要转义:

1、字符与保留字冲突,比如HTML中的小与号

2、ASCII字符集中没有此字符,比如HTML中©以前经常写成©

第2种情况现在已经无需考虑,因为 Windows 从 XP 开始、Linux 从 GNU glibc 2.2 开始,操作系统都支持Unicode字符集了,目前开发程序主流是使用Unicode的utf-8编码。

本文只讨论第1种情况。

需要转义的内容:

需要转义

不需要转义的字符(常见错误)

HTML

>

mysql

换行、回车等

换页、空格、、&

postgresql

换页、换行、回车等

JSON

"、\和控制字符

PHP常见转义方法:

转义范围

不应使用addslashes

单引号'、双引号"、反斜线\与 NUL

htmlspecialchars

&、'、"、

不应使用mysql_escape_string

对应mysql 4

mysqli::real_escape_string

对应mysql 5+

pg_escape_string

对应PostgreSQL

php PDO::quote

自动判断数据库是Mysql还是PostgreSQL等

PDO::prepare()

自动判断数据库是Mysql还是PostgreSQL等

对字符串"hello world\fjim\n\r"进行转义,结果如下:

mysqli::real_escape_string

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView Code

<?php $mysqli = new mysqli('localhost', 'root', '1', 'test');$a = "hello world\fjim\n\r";var_dump($mysqli->real_escape_string($a));$sql = "INSERT INTO user VALUES ('2','lucy','". $mysqli->real_escape_string($a) . '\');';var_dump($sql);$mysqli->query($sql);?>

986fbbf6e7a52cb9a04a1cb5a02a1db1.png

9d48edf5d77b573b46277c98b3aae471.png

PDO::quote mysql 与 mysqli::real_escape_string 结果一样。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView Code

<?php $dsn = 'mysql:dbname=test;host=localhost';$user = 'root';$password = '1';$dbh = new PDO($dsn, $user, $password);$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$a = "hello world\fjim\n\r";var_dump($dbh->quote($a));$sql = "INSERT INTO user VALUES ('2','lucy',". $dbh->quote($a) . ');';var_dump($sql);$stmt = $dbh->query($sql);exit;?>

pg_escape_string

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView Code

pg_query($db, $sql);exit;?>

8757e356ac59d2a6b7cd37e756b36e82.png

c807b0c10a132e7c37bad96ec4606543.png

PDO::quote pgsql 与pg_escape_string 结果相同。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView Code

<?php $dsn = 'pgsql:host=localhost;port=5432;dbname=test;user=root;password=1';$dbh = new PDO($dsn);$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$a = "hello world\fjim\n\r";var_dump($dbh->quote($a));//$stmt = $dbh->query('SELECT "id","name","desc" FROM schema1."user"');

//$sql = "INSERT INTO schema1.user VALUES ('1','jim','hello world\fjim\n\r');";

$sql = "INSERT INTO schema1.user VALUES ('2','lucy',". $dbh->quote($a) . ');';var_dump($sql);$stmt = $dbh->query($sql);exit;?>

HTML:

HTML标签使用小与号不用转义。官方文档:http://www.w3.org/TR/xhtml1/#h-4.8

mysql:

这里以默认的空sql-mode为例。

如果string使用双引号引起来,那么string中的单引号无需转义。如果string使用单引号引起来,那么string中的双引号无需转义。

使用musqldump导出sql就会看到,mysql的string使用单引号'引起来,而双引号一定被转义。

比如INSERT INTO `asdf` VALUES ('a\"b'); 和 INSERT INTO `asdf` VALUES ('a"b'); 结果是一样的。

postgresql:

value的string使用单引号'引起来或者不引。

识别符(列名等)使用双引号"引起来或者不引。

JSON:

JSON的string,必须使用双引号"引起来,不能使用单引号'引起来。如果字符串中出现双引号,需要转义,比如{"name" : "John \"Cliff\" Barxter"}。

string.gif

参考资料:

采用支持 Unicode 的单源代码库使开发时间得以缩短,Unicode 为 Microsoft 带来的好处是显而易见的。就 Windows®2000 来说,在发布英文产品后需要花费几个月的时间来准备其本地化版本。而对于 Windows XP,这一周期已缩短为几周时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值