mysql語(yǔ)句如何插入含單引號(hào)或反斜杠的值詳解
前言
本文主要給大家介紹了關(guān)于mysql語(yǔ)句插入含單引號(hào)或反斜杠值的相關(guān)內(nèi)容,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
比如說(shuō)有個(gè)表,它的結(jié)構(gòu)是這個(gè)樣子的
CREATE TABLE `activity` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `title` varchar(255) NOT NULL COMMENT '活動(dòng)標(biāo)題', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='活動(dòng)表';
比如說(shuō)往里面插入記錄,示例代碼如下:
$servername = "xxxxservername";
$port = 3306;
$username = "xxxusername";
$password = "xxxpwd";
$dbname = "xxxxxxdb";
// 創(chuàng)建連接
$conn = new mysqli($servername, $username, $password, $dbname, 8306);
// 檢測(cè)連接
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!就會(huì)報(bào)如下錯(cuò)誤,提示你有語(yǔ)法錯(cuò)誤:
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!');這個(gè)sql語(yǔ)句里面單引號(hào)不是成對(duì)的。
有時(shí)候會(huì)往數(shù)據(jù)庫(kù)里面插入一些用戶給的數(shù)據(jù),很可能會(huì)出現(xiàn)上面這種情況,那么該如何避免呢?
要對(duì)sql里面的特殊字符進(jìn)行轉(zhuǎn)義。可以把$sql的那一行代碼改成如下這樣:
$sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", mysqli_real_escape_string($conn, $item['title']));
整個(gè)sql字符串實(shí)際上是這樣的:
INSERT INTO activity (title) VALUES ( 'happy valentine\'s day!');"
有時(shí)候還會(huì)出現(xiàn)一種問題: json_encode之后,里面的中文被轉(zhuǎn)成unicode碼,插入到mysql里面發(fā)現(xiàn)\被吃掉了。
比如說(shuō)中文這兩個(gè)字的unicode碼是\u4e2d\u6587,但是有時(shí)候插到數(shù)據(jù)庫(kù)里反斜杠被吃掉了變成了u4e2du6587
看如下示例代碼:
$item['title'] = json_encode([
'balbalbla' => '中文'
]);
$sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", $item['title']);
整個(gè)sql字符串實(shí)際上是這樣的:
INSERT INTO activity (title) VALUES ( '{"balbalbla":"\u4e2d\u6587"}');
插入到數(shù)據(jù)庫(kù)里面,title這個(gè)字段的值就變成了{"balbalbla":"u4e2du6587"} 。
那是因?yàn)檫@里的\被當(dāng)成轉(zhuǎn)義符了,實(shí)際上要對(duì)unicode碼的\再次轉(zhuǎn)義,這樣插入數(shù)據(jù)庫(kù)的才是對(duì)的
$item['title'] = json_encode([
'balbalbla' => '中文'
]);
$sql = sprintf("INSERT INTO activity (title) VALUES ( '%s');", mysqli_real_escape_string($conn, $item['title']));
整個(gè)sql字符串實(shí)際上是這樣的:
INSERT INTO activity (title) VALUES ( '{\"balbalbla\":\"\\u4e2d\\u6587\"}');
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案詳析
- Mysql插入帶有引號(hào)的字符串?dāng)?shù)據(jù)最佳實(shí)踐
- MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解
- 在MySQL concat里面使用多個(gè)單引號(hào),三引號(hào)的問題
- 解決python3插入mysql時(shí)內(nèi)容帶有引號(hào)的問題
- python實(shí)現(xiàn)mysql的單引號(hào)字符串過(guò)濾方法
- 關(guān)于Mysql查詢帶單引號(hào)及插入帶單引號(hào)字符串問題
- mysql語(yǔ)法時(shí)采用了雙引號(hào)““的錯(cuò)誤問題
相關(guān)文章
MySQL實(shí)戰(zhàn)文章(非常全的基礎(chǔ)入門類教程)
半個(gè)月時(shí)間把MySQL重新鞏固了一遍,梳理了一篇幾萬(wàn)字超硬核文章,想學(xué)習(xí)mysql的朋友可以看看2023-05-05
詳解MySQL客戶端/服務(wù)器運(yùn)行架構(gòu)
這篇文章主要介紹了詳解MySQL客戶端/服務(wù)器運(yùn)行架構(gòu),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
MySQL 撤銷日志與重做日志(Undo Log與Redo Log)相關(guān)總結(jié)
這篇文章主要介紹了MySQL 撤銷日志與重做日志(Undo Log與Redo Log)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-03-03
mysql(5.6及以下)解析json的方法實(shí)例詳解
這篇文章主要介紹了mysql(5.6及以下)解析json的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(四)--BLOB數(shù)據(jù)類型
在MYSQL中BLOB是一個(gè)二進(jìn)制大對(duì)象,用來(lái)儲(chǔ)存可變數(shù)量的數(shù)據(jù),而MSSQL中并沒有BLOB數(shù)據(jù)類型,只有大型對(duì)象數(shù)據(jù)類型(LOB)2014-06-06

