mysql語句如何插入含單引號或反斜杠的值詳解
前言
本文主要給大家介紹了關(guān)于mysql語句插入含單引號或反斜杠值的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧
比如說有個表,它的結(jié)構(gòu)是這個樣子的
CREATE TABLE `activity` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `title` varchar(255) NOT NULL COMMENT '活動標(biāo)題', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='活動表';
比如說往里面插入記錄,示例代碼如下:
$servername = "xxxxservername";
$port = 3306;
$username = "xxxusername";
$password = "xxxpwd";
$dbname = "xxxxxxdb";
// 創(chuàng)建連接
$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();
這一段代碼執(zhí)行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
因?yàn)?code>INSERT INTO activity (title) VALUES ( 'happy valentine's day!');這個sql語句里面單引號不是成對的。
有時候會往數(shù)據(jù)庫里面插入一些用戶給的數(shù)據(jù),很可能會出現(xiàn)上面這種情況,那么該如何避免呢?
要對sql里面的特殊字符進(jìn)行轉(zhuǎn)義??梢园?sql的那一行代碼改成如下這樣:
$sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", mysqli_real_escape_string($conn, $item['title']));
整個sql字符串實(shí)際上是這樣的:
INSERT INTO activity (title) VALUES ( 'happy valentine\'s day!');"
有時候還會出現(xiàn)一種問題: json_encode之后,里面的中文被轉(zhuǎn)成unicode碼,插入到mysql里面發(fā)現(xiàn)\被吃掉了。
比如說中文這兩個字的unicode碼是\u4e2d\u6587,但是有時候插到數(shù)據(jù)庫里反斜杠被吃掉了變成了u4e2du6587
看如下示例代碼:
$item['title'] = json_encode([
'balbalbla' => '中文'
]);
$sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", $item['title']);
整個sql字符串實(shí)際上是這樣的:
INSERT INTO activity (title) VALUES ( '{"balbalbla":"\u4e2d\u6587"}');
插入到數(shù)據(jù)庫里面,title這個字段的值就變成了{"balbalbla":"u4e2du6587"} 。
那是因?yàn)檫@里的\被當(dāng)成轉(zhuǎn)義符了,實(shí)際上要對unicode碼的\再次轉(zhuǎn)義,這樣插入數(shù)據(jù)庫的才是對的
$item['title'] = json_encode([
'balbalbla' => '中文'
]);
$sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", mysqli_real_escape_string($conn, $item['title']));
整個sql字符串實(shí)際上是這樣的:
INSERT INTO activity (title) VALUES ( '{\"balbalbla\":\"\\u4e2d\\u6587\"}');
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
關(guān)于MySQL數(shù)據(jù)庫死鎖的案例和解決方案
MySQL Update語句防止死鎖是指在修改MySQL數(shù)據(jù)庫的數(shù)據(jù)時,為避免多個進(jìn)程同時修改同一數(shù)據(jù)行而造成死鎖的情況,引入了一些機(jī)制來防止死鎖的產(chǎn)生,本文介紹了一個 MySQL 數(shù)據(jù)庫死鎖的案例和解決方案,需要的朋友可以參考下2023-09-09
Mysql5.7.11在windows10上的安裝與配置(解壓版)
本文分為三大步給大家介紹Mysql5.7.11解壓版在windows10上的安裝與配置,另外還給大家?guī)砹薽ysql5.7.11服務(wù)無法啟動,錯誤代碼3534的解決方案,非常不錯,有需要的朋友參考下2016-08-08
mysql 5.7.21解壓版本安裝 Navicat數(shù)據(jù)庫操作工具安裝
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.21解壓版本安裝,Navicat數(shù)據(jù)庫操作工具安裝,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02

