内容简介:比如说有个表,它的结构是这个样子的比如说往里面插入记录,示例代码如下:这一段代码执行OK,没啥问题。但是如果代码里面的
比如说有个表,它的结构是这个样子的
CREATE TABLE `activity` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `title` varchar(255) NOT NULL COMMENT '活动标题', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='活动表';
比如说往里面插入记录,示例代码如下:
$servername = "xxxxservername"; $port = 3306; $username = "xxxusername"; $password = "xxxpwd"; $dbname = "xxxxxxdb"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname, 8306); // 检测连接 if ($conn->connect_error) { die("connect failed: " . $conn->connect_error); } $item['title'] = 'happy new year!'; $sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", $item['title']); var_dump($sql); if ($conn->query($sql) === TRUE) { echo "insert success\n"; } else { echo "insert failed:" . $conn->error; } $conn->close();
这一段代码执行OK,没啥问题。但是如果代码里面的 title
变成 happy valentine's day!
就会报如下错误,提示你有语法错误:
insert failed:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's day!')' at line
因为 INSERT INTO activity (title) VALUES ( 'happy valentine's day!');
这个 sql 语句里面单引号不是成对的。
有时候会往数据库里面插入一些用户给的数据,很可能会出现上面这种情况,那么该如何避免呢?
要对sql里面的特殊字符进行转义。可以把 $sql
的那一行代码改成如下这样:
$sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", mysqli_real_escape_string($conn, $item['title']));
整个sql字符串实际上是这样的:
INSERT INTO activity (title) VALUES ( 'happy valentine\'s day!');"
有时候还会出现一种问题: json_encode之后,里面的中文被转成unicode码,插入到 mysql 里面发现 \
被吃掉了。
比如说 中文
这两个字的unicode码是 \u4e2d\u6587
,但是有时候插到数据库里反斜杠被吃掉了变成了 u4e2du6587
看如下示例代码:
$item['title'] = json_encode([ 'balbalbla' => '中文' ]); $sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", $item['title']);
整个sql字符串实际上是这样的:
INSERT INTO activity (title) VALUES ( '{"balbalbla":"\u4e2d\u6587"}');
插入到数据库里面, title
这个字段的值就变成了 {"balbalbla":"u4e2du6587"}
。
那是因为这里的 \
被当成转义符了,实际上要对unicode码的 \
再次转义,这样插入数据库的才是对的
$item['title'] = json_encode([ 'balbalbla' => '中文' ]); $sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", mysqli_real_escape_string($conn, $item['title']));
整个sql字符串实际上是这样的:
INSERT INTO activity (title) VALUES ( '{\"balbalbla\":\"\\u4e2d\\u6587\"}');
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Roslyn/MSBuild 在编译期间处理路径中的斜杠与反斜杠(\)
- Go中单引号和双引号和反引号(飘号)
- MySQL列名中包含斜杠或者空格的处理方法
- 通过Java连接mysql对反斜杠“\”转义的测试
- JS声明对象时属性名加引号与不加引号的问题及解决方法
- 如何设置 Visual Studio Code 格式化 React 时不要将单引号转为双引号?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Types and Programming Languages
Benjamin C. Pierce / The MIT Press / 2002-2-1 / USD 95.00
A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute. The study of typ......一起来看看 《Types and Programming Languages》 这本书的介绍吧!