简单的php写入数据库类代码分享

  不知道原创要写到随笔里。

  All right ,第一篇博文。

  有三个类:

  1 . 过滤输入(轻量级的)

  class input_filter

  负责将参数,如$_GET,$_POST 这些过滤

  返回值类型为 数组,用作 made_sql 类的参数

  2 . 转换成SQL语句

  class made_sql

  参数的类型为数组和表名(字符串),数组的键名为表的列名,值为插入值

  返回值类型为 字符串 ,用作 mysql ->query方法 的参数

  3 . 数据库查询

  class mysql

  用到了单列模式,用静态方法来获取对象,具体参看 instanceof操作符的作用

  

复制代码 代码如下:

  class input_filter

  {

  private $input_all; // 要过滤的数组

  private $rustle; // 过滤后的结果

  //构造函数 参数可以是$_GET or $_POST 这些

  public function __construct($input_C)

  {

  if(is_array($input_C))

  $this->input_all = $input_C ;

  else

  echo 'Parameter is not valid';

  //初始化,不然后面第一次合并数组PHP不知道这是什么类型

  $this->rustle = array();

  }

  private function filter_arr() // 主函数

  {

  foreach ($this->input_all as $key_input => $val_input)

  {

  //如果键名不是字符串,那么返回错误信息

  // for key

  if(!is_string($key_input)) // error

  {

  echo 'This key is not string';

  return false;

  }

  // The # is mysql Note .

  $key_one = str_replace('#','',$key_input);

  $key = htmlspecialchars($key_one,ENT_QUOTES,'UTF-8');

  // 我没找 # 的HTML转义符,所以用空代替

  $val_one = str_replace('#','',$val_input);

  // 这个函数只转化 < > ' " ,还有个类似函数会转义所有符号

  $val = htmlspecialchars($val_one,ENT_QUOTES,'UTF-8');

  // merger

  $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) ; // or $_POST

  $input_data = $filter->get_filter();

  转换成SQL语句:

  

复制代码 代码如下:

  class madesql

  {

  private $Cnow_ary; // type array 传入的参数

  private $Cname_str;

  private $insert_sql; //最终的sql语句 string type

  public function __construct($Cary,$Cname)

  {

  //检查传入参数类型是否为数组

  if (! is_array($Cary))

  return false;

  else

  $this->Cnow_ary = $Cary; // 写入的值

  $this->Cname_str = $Cname; // 数据库表名称

  25 }

  private function setSql() // 主函数 ,生产SQL语句

  {

  foreach ( $this->Cnow_ary as $key_ary => $val_ary )

  {

  $cols_sql = $cols_sql.','.$key_ary; //列名组合

  $vals_sql = $vals_sql.', \''.$val_ary.'\'' ; //值 组合

  }

  // 因为前面foreach的算法有点问题,第一个字符是逗号

  // 所以用sunstr_replace()删除 ,自第一位起(0),只替换一个字符(1)

  $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 . 数据库查询

  数据库查询类是参照书上的单列模式(用静态方法获取对象,这样在一个脚本里只有一个数据库查询类的实例)

  我想单例模式用于这个类还是有点用的

  

复制代码 代码如下:

  class mysql

  {

  private $connect;

  static $objectMysql; // 存放对象

  private function __construct() 7 {

  // 创建对象的时候这个构造函数会被调用,用来初始化

  $connect = mysql_connect('db address','password','dbname');

  $this->db = mysql_select_db('db',$connect);

  }

  public static function Mysql_object()

  {

  //instanceof 操作符用于检查对象是否属于某个类或者接口的实例。我说的不是很规范...

  //如果$objectMysql不是mysql(self)的实例,那么就创建一个

  if(! self::$objectMysql instanceof self)

  self::$objectMysql = new mysql();

  //这时候的$objectMysql就已经是一个对象

  return self::$objectMysql;

  }

  public function query($sql)

  {

  return mysql_query($sql,$this->db);

  }

  }

  

  All right ,归纳一下使用方法

  

复制代码 代码如下:

  $filter = new filter_input($_GET) ; // or $_POST

  $input_data = $filter->get_filter();

  $madeSql = new madesql($input_data,'tableName');

  $sql = $madeSql->getSql();

  $mysql = mysql::Mysql_object() ;

  if( $mysql->query($sql) )

  echo 'Ok';

  else

  echo 'failure';

  只需要这几行调用代码即可以完成写入数据库的操作

  另外再说一下构造函数的私有公有问题,书上的mysql单例模式中构造函数是声明为了private ,而没有单例模式的类如此则会产生编译错误,即 PHP 不能创建一个对象 ,查了下。

  原因在于创建对象往往在类外面进行,这样就产生了无法访问构造函数的问题。 而单列模式是在自身类中创建对象,因此访问private方法没有限制。

  原先以为单例模式只是防止创建相同的对象,现在看来单例模式可以将构造函数封装起来,确实提高了安全性

    filter_input类 的结果可以直接用作 madesql类 的参数的 前提是 :

  表单的name必须和数据库的列名相同,否则你就白看这么多