一,首先,先來看一下php.ini的兩個(gè)配置參數(shù)
magic_quotes_gpc "1" PHP_INI_PERDIR PHP_INI_ALL in PHP <= 4.2.3. Removed in PHP 6.0.0.
作用范圍是:WEB客戶服務(wù)端;
作用時(shí)間:請(qǐng)求開始是,例如當(dāng)腳本運(yùn)行時(shí)
magic_quotes_runtime "0" PHP_INI_ALL Removed in PHP 6.0.0.
作用范圍是:影響從文件中讀取的數(shù)據(jù)或從數(shù)據(jù)庫查詢得到的數(shù)據(jù)。
以下是一些常用到的方法:
get_magic_quotes_gpc(void)
本函數(shù)取得 PHP 環(huán)境配置的變量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。
返回 0 表示關(guān)閉本功能;
返回 1 表示本功能打開。
當(dāng) magic_quotes_gpc 打開時(shí),所有的 ' (單引號(hào)), " (雙引號(hào)), \ (反斜線) and 空字符會(huì)自動(dòng)轉(zhuǎn)為含有反斜線的溢出字符。
應(yīng)用:
由于該參數(shù)不支持在php文件進(jìn)行設(shè)置,如果通過本函數(shù)取得的變量magic_quotes_gpc 的值為false,我們可以
利用addslashes()人工使用反斜線引用字符串
$var = get_magic_quotes_gpc()?$var:addslashes($var);
相反,如果通過本函數(shù)取得的變量magic_quotes_gpc 的值為true,我們希望字符串不被轉(zhuǎn)義,那么可以利用stripslashes()去除自動(dòng)添加的反斜杠
get_magic_quotes_runtime()
一般情況下,應(yīng)當(dāng)將其關(guān)閉,否則從數(shù)據(jù)庫讀取出來的數(shù)據(jù)單引號(hào)、雙引號(hào)和反斜杠都會(huì)被加上\,導(dǎo)致顯示不正常。像Discuz,PHPWind都在公共文件的頭部加上一句
set_magic_quotes_runtime(0)
// Check if magic_quotes_runtime is active
if(get_magic_quotes_runtime())
{
// Deactive
set_magic_quotes_runtime(false);
}
二、對(duì)于magic_quotes_runtime,我們統(tǒng)一關(guān)閉它,即set_magic_quotes_runtime(0);不讓從數(shù)據(jù)庫讀取出來的數(shù)據(jù)的單引號(hào)、雙引號(hào)和反斜杠都自動(dòng)被加上\。這樣,對(duì)數(shù)據(jù)庫的操作如下:添加數(shù)據(jù)到數(shù)據(jù)庫之前,我們手動(dòng)對(duì)數(shù)據(jù)進(jìn)行addslashes(),而從數(shù)據(jù)庫取出數(shù)據(jù)時(shí),則作相反操作,即stripslashes()。
三、對(duì)于要序列化的內(nèi)容,要保持裸數(shù)據(jù),即要去掉轉(zhuǎn)義,stripslashes(),然后在把序列化過的內(nèi)容保存到數(shù)據(jù)庫當(dāng)中(注意,序列化過的內(nèi)容是不帶單引號(hào)(')、雙引號(hào)(")、反斜線(\)的),示例如下:
$feedarr['body_data'] = serialize(stripslashes($body_data));