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


Posted in PHP onJuly 26, 2011

不知道原创要写到随笔里。
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必须和数据库的列名相同,否则你就白看这么多

PHP 相关文章推荐
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
写php分页时出现的Fatal error的解决方法
Apr 18 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
php读取文件内容到数组的方法
Mar 16 PHP
PHP实现QQ空间自动回复说说的方法
Dec 02 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
php数组指针操作详解
Feb 14 PHP
laravel5.1框架model类查询的实现方法
Oct 08 PHP
Yii Framework框架开发微信公众平台示例
Apr 26 PHP
PHP7原生MySQL数据库操作实现代码
Jul 03 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 #PHP
PHP里的中文变量说明
Jul 23 #PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 #PHP
php文档更新介绍
Jul 22 #PHP
php 数据库字段复用的基本原理与示例
Jul 22 #PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 #PHP
PHP性能优化 产生高度优化代码
Jul 22 #PHP
You might like
一个PHP模板,主要想体现一下思路
2006/12/25 PHP
PHP中读写文件实现代码
2011/10/20 PHP
PHP导入导出Excel代码
2015/07/07 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
JavaScript 调试器简介
2009/02/21 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
js控制input输入字符解析
2013/12/27 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
vue实现计算器功能
2020/02/22 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
Python设计模式之建造者模式实例详解
2019/01/17 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
给同学的道歉信
2014/01/16 职场文书
企业总经理职责
2014/02/02 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
安全生产宣传标语
2014/06/06 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
JavaScript实现简单拖拽效果
2021/09/15 Javascript