前言
本文主要給大家介紹了關于mysql語句插入含單引號或反斜杠值的相關內容,下面話不多說了,來一起看看詳細的介紹吧
比如說有個表,它的結構是這個樣子的
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\"}');
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。