有三个类:
1,过滤输入,轻量级的 class input_filter,负责将参数,如$_GET,$_POST 这些过滤,返回值类型为 数组,用作 made_sql 类的参数.
2,转换成SQL语句 class made_sql,参数的类型为数组和表名(字符串),数组的键名为表的列名,值为插入值.返回值类型为 字符串,用作 mysql ->query方法的参数.
3,数据库查询 class mysql 用到了单列模式,用静态方法来获取对象,具体参看 instanceof操作符的作用.
1,过滤输入 class input_filter 类代码如下:
- class input_filter
- {
-
- private $input_all;
- private $rustle;
-
-
- public function __construct($input_C)
- {
- if(is_array($input_C))
- $this->input_all = $input_C ;
- else
- echo 'Parameter is not valid';
-
-
- $this->rustle = array();
- }
-
- private function filter_arr()
- {
-
- foreach ($this->input_all as $key_input => $val_input)
- {
-
-
- if(!is_string($key_input))
- {
- echo 'This key is not string';
- return false;
- }
-
- $key_one = str_replace('#','',$key_input);
- $key = htmlspecialchars($key_one,ENT_QUOTES,'UTF-8');
-
-
- $val_one = str_replace('#','',$val_input);
-
- $val = htmlspecialchars($val_one,ENT_QUOTES,'UTF-8');
-
-
- $rustle_one = array($key=>$val);
-
- $this->rustle = array_merge($this->rustle,$rustle_one);
- }
-
- }
-
-
- public function get_filter_rustle()
- {
- $this->filter_arr();
- return $this->rustle ;
- }
-
- }
-
- 调用方法:
-
- $filter = new filter_input($_GET) ;
- $input_data = $filter->get_filter();
2,转换成SQL语句,class madesql类代码如下:
- class madesql
- {
- private $Cnow_ary;
- private $Cname_str;
-
- private $insert_sql;
-
-
-
-
-
- public function __construct($Cary,$Cname)
- {
-
- if (! is_array($Cary))
- return false;
- else
- $this->Cnow_ary = $Cary;
-
- $this->Cname_str = $Cname;
-
-
- }
-
- private function setSql()
- {
-
- foreach ( $this->Cnow_ary as $key_ary => $val_ary )
- {
- $cols_sql = $cols_sql.','.$key_ary;
- $vals_sql = $vals_sql.', ''.$val_ary.''' ;
- }
-
-
- $cols_sql = substr_replace($vals_sql,'',0,1);
- $vals_sql = substr_replace($vals_sql,'',0,1);
-
- $this->insert_sql =
- 'INSERT INTO '.$this->Cname_str.' ( '
- .$cols_sql.' ) VALUES ( '.$vals_sql.' )';
- }
-
- public function getSql()
- {
- $this->setSql();
- return $this->insert_sql;
- }
- }
3,数据库查询,mysql类代码如下:
数据库查询类是参照书上的单列模式,用静态方法获取对象,这样在一个脚本里只有一个数据库查询类的实例.我想单例模式用于这个类还是有点用的.
- class mysql
- {
- private $connect;
- static $objectMysql;
-
- private function __construct()
-
- {
-
- $connect = mysql_connect('db address','password','dbname');
- $this->db = mysql_select_db('db',$connect);
- }
-
- public static function Mysql_object()
- {
-
-
- if(! self::$objectMysql instanceof self)
- self::$objectMysql = new mysql();
-
-
- return self::$objectMysql;
- }
- public function query($sql)
- {
- return mysql_query($sql,$this->db);
- }
-
- }
归纳一下使用方法:
- $filter = new filter_input($_GET) ;
- $input_data = $filter->get_filter();
-
- $madeSql = new madesql($input_data,'tableName');
- $sql = $madeSql->getSql();
-
- $mysql = mysql::Mysql_object() ;
- if( $mysql->query($sql) )
- echo 'Ok';
- lse
- echo 'failure';
只需要这几行调用代码即可以完成写入数据库的操作.
另外再说一下构造函数的私有公有问题,书上的mysql单例模式中构造函数是声明为了private,而没有单例模式的类如此则会产生编译错误,即 PHP 不能创建一个对象,查了下.
原因在于创建对象往往在类外面进行,这样就产生了无法访问构造函数的问题,而单列模式是在自身类中创建对象,因此访问private方法没有限制.
原先以为单例模式只是防止创建相同的对象,现在看来单例模式可以将构造函数封装起来,确实提高了安全性. |