@Chiang
2020-04-12T18:13:48.000000Z
字数 2981
阅读 584
doitphp
2020-04
/**
* 构造方法
*
* 用于初始化本类的运行环境,或对基本变量进行赋值
*
* @access public
* @return boolean
*/
public function __construct() {
//时区设置,默认为中国(北京时区)
date_default_timezone_set(Configure::get('application.defaultTimeZone'));
//设置异常处理
set_exception_handler(array($this, '_exception'));
//关闭魔术变量,提高PHP运行效率
if (get_magic_quotes_runtime()) {
@set_magic_quotes_runtime(0);
}
//将全局变量进行魔术变量处理,过滤掉系统自动加上的'\'.
if (get_magic_quotes_gpc()) {
$_POST = ($_POST) ? $this->_stripSlashes($_POST) : array();
$_GET = ($_GET) ? $this->_stripSlashes($_GET) : array();
$_SESSION = ($_SESSION) ? $this->_stripSlashes($_SESSION) : array();
$_COOKIE = ($_COOKIE) ? $this->_stripSlashes($_COOKIE) : array();
}
//实例化视图对象
self::$_viewObject = $this->initView();
//回调函数,实例化控制器(Controller)时,执行所要补充的程序
$this->init();
return true;
}
get_magic_quotes_gpc()
你到底是做什么的?在php的配置文件中,有个布尔值的设置,就是magic_quotes_runtime,当它打开时,
php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反
斜线。 当然如果重复给溢出字符加反斜线,那么字符串中就会有多个反斜线,所以这时
就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini
文件中magic_quotes_runtime状态。 为了使自己的程序不管服务器是什么设置都能正常
执行。可以在程序开始用get_magic_quotes_runtime检测该设置的状态决定是否要手工处理
,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉该设置。
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的\'\"\加上反斜
线。可以用get_magic_quotes_gpc()检测系统设置。如果没有打开这项设置,可以使用
addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反
斜线。这些字符是单引号(\')、双引号(\")、反斜线(\)与 NUL(NULL 字符)。
一般用法如下;
if(!get_magic_quotes_gpc())
{
addslashes($prot);
}
php addslashes函数的作用是在预定义的字符前面加上反斜杠,这些预定义字符包括:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
addslashes函数经常使用在向数据库插入数据时,比如有一个字符串
$str="my name's wxp";
现在要将这个字符串插入到数据库表中,由于该字符串有单引号',这样很可能与mysql拼接字符串的单引号'冲突,导致SQL语句不正确,也就无法正常执行插入操作,此时我们需要使用addslashes函数处理这个字符串。如:
$str="my name's wxp";
echo addslashes($str);//输出my name\'s wxp
然后在拼接mysql字符串:
$sql="insert into student(student_name)values('".addslashes($str)."')";
mysql_query($sql);
此时字符串被插入到数据库,那么大家是否知道插入的字符串是带反斜杠还是不带反斜杠呢?恐怕很多人都会认为肯定是带反斜杠的字符串。其实这个答案是错误的,插入的字符串是没有带反斜杠。至于为什么插入的字符串在数据库中是没有加反斜杠,请大家继续看下面讲解。
如果字符串$str="my name's wxp"是使用POST和GET提交的数据,这个时候插入数据库中的数据是带反斜杠的,由此可知addslashes只是在POST和GET数据插入数据库时才会把反斜杠同时插入到数据库,其他情况下不会将反斜杠插入到数据库。
注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测
php addslashes 函数使用反斜线引用字符串
addslashes(string)
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
一个使用 addslashes() 的例子是当你要往数据库中输入数据时。 例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。 强烈建议使用 DBMS 指定的转义函数 (比如 MySQL 是 mysqli_real_escape_string() ,PostgreSQL 是 pg_escape_string() ),但是如果你使用的 DBMS 没有一个转义函数,并且使用 \ 来转义特殊字符,你可以使用这个函数。 仅仅是为了获取插入数据库的数据,额外的 \ 并不会插入。 当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。
PHP 5.4 之前 PHP 指令 magic_quotes_gpc 默认是 on, 实际上所有的 GET、POST 和 COOKIE 数据都用被 addslashes() 了。 不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes() ,因为这样会导致双层转义。 遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
<?php
$str = "Is your name O'reilly?" ;
// 输出: Is your name O\'reilly?
echo addslashes ( $str );
?>
参考资料:
get_magic_quotes_gpc() 你到底是做什么的?
php 深入理解addslashes函数
php addslashes 在预定义字符之前添加反斜杠