pdo预处理类的改写问题

manbudezhu 发布于 2016/06/15 19:41
阅读 275
收藏 0
PHP

一直一个人自学php,对于代码的标准和安全性一直很担忧.最近练习写一个小框架,写了一个数据库操作类,总觉得不太安全.只用到了addslashes()稍微做了输入转义,觉得改成pdo预处理的话,防止恶意脚本和sql注入应该放心点,不知道怎么改写这个类,哪个高手能指点一下,谢谢.顺便能推荐一下代码标准化和安全性的资料,视频就最好了.

model.php

<?php 

namespace Hdphp\Tool{
use Pdo;
class Model{


private static $links=null;
protected $table;
private $opt;


// 构造函数初始化对象
public function __construct($table=null){
// 初始化$table变量
$this->table=is_null($table)?C('TABLE_NAME'):$table;
try {
// self::$links=new Pdo("mysql:host=127,0,0.1;dbname=c61",'root','welcome');
self::$links=new Pdo('mysql:host='.C('DB_HOST').';dbname='.C('DB_NAME'),C('DB_USER'),C('DB_PWD'));
// 设置字符编码
self::$links->query('SET NAMES UTF8');
// 设置错误抛出类型
self::$links->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$this->_opt();
} catch (PDOException $e) {
$e->getMessage();
}
}


// 定义opt属性
private function _opt(){
$this->opt=array(
'field'=>"*",
'where'=>'',
'group'=>'',
'having'=>'',
'order'=>'',
'limit'=>'',
);
}


//定义myquery方法
public function myquery($sql=null){


// 执行query方法,返回结果集对象
$result=self::$links->query("$sql");
// 取出结果集赋值给数组
$rows=$result->fetchAll(PDO::FETCH_ASSOC);


return $rows;
}
// 定义all方法
public function all(){
// 组合字符串
$sql="select ".$this->opt['field']." from ".$this->table.$this->opt['where'].$this->opt['group'].$this->opt['having'].$this->opt['order'].$this->opt['limit'];
echo $sql;


return $this->myquery($sql);
}
//定义field方法
public function field($sql='*'){
// 需要判断'' 的情况


// 给feild元素赋值
$this->opt['field']=$sql;
return $this;
}
public function where($sql=''){
$this->opt['where']=" where ".$sql;
return $this;
}
public function order($sql=''){
$this->opt['order']=" order by ".$sql;
return $this;
}
public function limit($sql=''){
$this->opt['limit']=" limit ".$sql;
return $this;
}


// 定义find()执行
public function find(){
$data=$this->limit(1)->all();
// current()返回数组中当前的元素
$data=current($data);
return $data;
}
// 别名函数one
public function one(){
return $this->find();
}




// 没有结果集的方法
public function myexec($sql){
// echo $sql;
$rows=self::$links->exec($sql);
if($rows){
echo "成功执行{$rows}条数据";
return $rows;
}else{
halt('执行失败');
return;
}
}
public  function delete(){
// 必须判断where存不存在
if(!empty($this->opt['where'])) {
$sql="delete from ".$this->table.$this->opt['where'];
return $this->myexec($sql);
}else{
halt('删除必须有where语句');
return;
}
}
//定义自动转义方法
private function _safe_str($str){
// 判断是否用户提交的数据,包括post,get,cookie.

// 如果值为1时为开启,则系统自动转义,如果不为1时,需要调用stripslashes函数转义.
if(!get_magic_quotes_gpc()){
$str=addslashes($str);
};
return $str;
}
// 创建添加方法
public function add($data=null){
// 如果没有传递参数,使用$_post的值
// 否则使用传递的值.
if(is_null($data)) $data=$_POST;
// 定义存储字段和值的变量
$field='';
$values='';
foreach ($data as $f => $v) {
$field.="`".$this->_safe_str($f)."`,";
$values.="'".$this->_safe_str($v)."',";
}
// 去除末尾的,号
$field=rtrim($field,',');
$values=rtrim($values,',');


// insert into message (title,cid) values('易建联回到中国',2);
// 组合$sql语句,使用myexec执行.
$sql="insert into ".$this->table.'('.$field.') values ('.$values.')';
echo $sql;
return $this->myexec($sql);
}
// 修改方法
public function update($data=null){
if(empty($_POST)) return;
if(is_null($data)) $data=$_POST;

// echo $sql;
// 如果没设置where语句
if(!empty($this->opt['where'])) {
// update arc set title='快学网',cid='2' where aid=14;
$values='';
foreach ($data as $f => $v) {
// 组合$sql语句
$values.='`'.$this->_safe_str($f)."`='".$this->_safe_str($v)."',";
}
// echo $values;
$values=rtrim($values,",");
echo $values;
$sql="update ".$this->table." set ".$values.$this->opt['where'];
return $this->myexec($sql);
}else{
halt('更新语句必须有where语句');
return;
}
}
}
}
 ?>
加载中
0
dy810810
dy810810

预处理语句与存储过程 ¶

很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处:

  • 查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。
  • 提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。

预处理语句如此有用,以至于它们唯一的特性是在驱动程序不支持的时PDO 将模拟处理。这样可以确保不管数据库是否具有这样的功能,都可以确保应用程序可以用相同的数据访问模式。

0
manbudezhu
manbudezhu
谁能提供一个简单易懂的pdo预处理类,包含链式操作的.谢谢
返回顶部
顶部