mysql语句插入含单引号或者反斜杠的值

栏目: 数据库 · 发布时间: 5年前

内容简介:比如说有个表,它的结构是这个样子的比如说往里面插入记录,示例代码如下:这一段代码执行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\"}');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

我在阿里做运营

我在阿里做运营

芮曦(@小马鱼) / 电子工业出版社 / 2018-7 / 59.00元

《我在阿里做运营》是一本散发着浓浓阿里味儿的运营书。作者进入互联网行业7年,曾就职于携程、阿里巴巴等大平台,也服务过小微企业、传统企业及诸多职场新人。不仅经历过各类运营岗,也经历过市场、品牌等岗位,对精细化运营、数据化运营和低成本运营有着深刻见解。 本书展示了在阿里这样的大平台做运营工作的真实场景,也提炼了适用于小微企业的经验,以及让运营新人快速上手的技能和自我修养、职业规划。一起来看看 《我在阿里做运营》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码