简单的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 相关文章推荐
PHP 程序员的调试技术小结
Nov 15 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
Oct 01 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
微信支付PHP SDK ―― 公众号支付代码详解
Sep 13 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 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批量删除数据
2007/01/18 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
python中pycurl库的用法实例
2014/09/30 Python
python psutil模块使用方法解析
2019/08/01 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
音乐教育感言
2014/03/05 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
资金申请报告范文
2015/05/14 职场文书
技能培训通讯稿
2015/07/18 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js