一、魔術引號的做用是什麼?php
魔術引號設計的初衷是爲了讓從數據庫或文件中讀取數據和從請求中接收參數時,對單引號、雙引號、反斜線、NULL加上一個一個反斜線進行轉義,這個的做用跟addslashes()的做用徹底相同。sql
二、轉義的做用?數據庫
正確地接收和讀取數據,從而正確地執行SQL語句。好比從前臺接收一個參數,假定爲$para,後臺接收到參數後要執行一條查詢的SQL語句,拼接sql語句時,把參數傳進入,相似於編程
」SELECT * FROM
TABLEWHERE
FIELD1= $para AND
FILED2= ‘xxx’」的形式。
ruby
若是參數中含有雙引號如」value,那SQL語句就會變成markdown
「SELECT * FROM
TABLEWHERE
FIELD1= 「value AND
FIELD2= ‘xxx’」
app
原本是執行上面的紅色語句,結果變成下面的紅色語句,並非咱們想要的,須要讓系統可以認清真正地SQL語句起始符和結束符,這就須要轉義了,轉義完變成函數
「SELECT * FROM
TABLEWHERE
FIELD1= \「value AND
FIELD2= ‘xxx’」;
post
真正執行的SQL語句如上,達到想要的查詢表中,字段FIELD1爲」value和字段FIELD2爲xxx的數據。性能
三、爲何在PHP5.4.0以後取消了魔術引號特性?
(1)可移植性
編程時認爲其打開或並閉都會影響到移植性。能夠用 get_magic_quotes_gpc() 來檢查是否打開,並據此編程。
(2)性能
因爲並非每一段被轉義的數據都要插入數據庫的,若是全部進入 PHP 的數據都被轉義的話,那麼會對程序的執行效率產生必定的影響。在運行時調用轉義函數(如 addslashes())更有效率。 儘管 php.ini-dist 默認打開了這個選項,可是 php.ini-recommended 默認卻關閉了它,主要是出於性能的考慮。
(3)方便
因爲不是全部數據都須要轉義,在不須要轉義的地方看到轉義的數據就很煩。好比說經過表單發送郵件,結果看到一大堆的 '。針對這個問題,可使用 stripslashes() 函數處理。
四、php.ini相關配置
魔術引號配置選項 |
描述 |
運行時改變 |
PHP中的默認值 |
magic_quotes_gpc |
若是打開的話,影響 到 HTTP 請求數據(GET,POST 和 COOKIE)。 |
NO |
ON |
magic_quotes_runtime |
若是打開的話,大部 份從外部來源取得數據並返回的函數,包括從數據庫和文本文件,所返回的數據都會被反斜線轉義。(前提是magic_quotes_gpc = On) |
NO |
OFF |
Magic_quotes_sybase |
當關閉時,全部的 (單引號),"(雙引號),(反斜線)和 NULL 字符都會被自動加上一個反斜線進行轉義。這和 addslashes() 做用徹底相同。 若是打開的話,將會使用單引號對單引號進行轉義而非反斜線。此選項會徹底覆蓋 magic_quotes_gpc。若是同時打開兩個選項的話,單引號將會被轉義成 。而雙引號、反斜線 和 NULL 字符將不會進行轉義。 (前提是magic_quotes_gpc = On) |
YES |
OFF |
set_magic_quotes_runtime(),設置當前magic_quotes_runtime 配置選項的激活狀態,0爲關閉,1爲開啓。啥意思呢?這樣理解,如是set_magic_quotes_runtime(1)或是配置文件中magic_quotes_runtime爲true(這個在php.ini中配置),那麼php腳本讀取文件或是從數據庫中讀取數據,遇到反斜線(\)、單引號(')、雙引號(")、NULL時,會在前面自動加上轉義字符,變成\\、\'、\」、\NULL;如果關閉的話,也就是set_magic_quotes_runtime(0)magic_quotes_runtime爲false,那麼便會轉義,此時能夠藉助addslashes進行轉義。
magic_quotes_gpc(),當此值爲1時,會對HTTP請求中的G($_GET)、P($_POST)、C($_COOKIE)單雙引號和反斜線進行轉義;反之則不會。該操做通常見於表單提交的數據庫操做,如果值爲0時,便用addslashes進行轉義存入數據庫中,取出時再用stripslashes函數把反斜線給去掉。
PS.在PHP 5.4版本時,魔術引號被移除了,所以轉義都須要加上addslashes函數。