一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

mysql PDO 操作类的例子

时间:2014-03-14 编辑:简简单单 来源:一聚教程网

介绍:

1、只有在执行select、update、delete、insert等操作时才会连接数据库

2、采用PDO预处理方式

3、事务处理

4、错误输出

 

 代码如下 复制代码

/**
 * mysql PDO 操作类
 * Created by PhpStorm.
 * User: sumiaowen
 * Date: 14-3-12
 * Time: 下午4:57
 * To change this template use File | Settings | File Templates.
 */
class MyMysql
{
 //pdo 链接 mysql dns
 static $dns = null;

 //mysql 用户名
 static $username = null;

 //mysql 密码
 static $password = null;

 //pdo 链接实例
 static $pdo = null;

 //调试
 public $debug = null;

 //开始事务
 private $_begin_transaction = false;

 /**
  * @param bool   $debug    是否开启调试,错误信息输出
  * @param string $database 数据库类别
  */
 public function __construct($debug = true, $database = 'default')
 {
  $this->debug    = $debug;
  self::$dns      = Yaf_Registry::get('config')->db->$database->dns;
  self::$username = Yaf_Registry::get('config')->db->$database->username;
  self::$password = Yaf_Registry::get('config')->db->$database->password;
 }

 /**
  * PDO对象实例化
  * @return null|PDO
  */
 static function instance()
 {
  if(is_null(self::$pdo))
  {
   try
   {
    self::$pdo = new PDO(self::$dns, self::$username, self::$password);
    self::$pdo->query('set names utf8');
   }
   catch(PDOException $e)
   {
    exit('PDOException: ' . $e->getMessage());
   }
  }

  return self::$pdo;
 }

 /**
  * 预处理执行 select sql语句
  * @param string $sql
  * @param array  $parameters
  * @param int    $option
  * @return array
  */
 public function query($sql, $parameters = array(), $option = PDO::FETCH_ASSOC)
 {
  self::$pdo || self::instance();

  $stmt = self::$pdo->prepare($sql);
  $stmt->execute($parameters);

  $tmp = array();
  while($row = $stmt->fetch($option))
  {
   $tmp[] = $row;
  }

  if($this->debug)
  {
   $this->error($stmt);
  }

  return $tmp;
 }

 /**
  * 预处理执行 update、delete、insert SQL语句
  * @param sting $sql
  * @param array $parameters
  * @return int 返回影响行数
  */
 public function execute($sql, $parameters = array())
 {
  self::$pdo || self::instance();

  $stmt = self::$pdo->prepare($sql);
  $stmt->execute($parameters);

  if($this->debug)
  {
   $this->error($stmt);
  }

  return $stmt->rowCount();
 }

 /**
  * 执行一条SQL语句
  * @param string $sql
  * @return int 返回影响行数
  */
 public function exec($sql)
 {
  self::$pdo || self::instance();

  $rows = self::$pdo->exec($sql);

  if($this->debug)
  {
   $this->error();
  }

  return $rows;
 }

 /**
  * 添加一条记录
  * @param string $tableName 数据库表名
  * @param array  $data      需要添加的数据,一个 key|value 对应的数组,其中key为表字段名称,value为插入的值,如:$data = array('keyword'=>'关键词')
  * @return int 返回插入行的ID
  */
 public function insert($tableName, $data)
 {
  self::$pdo || self::instance();

  $fields = '`' . implode('`,`', array_keys($data)) . '`';

  $values = "'" . implode("','", $data) . "'";

  $sql = "INSERT INTO `{$tableName}`({$fields}) VALUES ({$values})";

  self::$pdo->exec($sql);

  if($this->debug)
  {
   $this->error();
  }

  return $this->getLastInsertId();
 }

 /**
  * 添加多条数据
  * @param string $tableName 数据库表名
  * @param array  $data      需要添加的数据,为一个二维数组,如:$data = array(array('fileld1'=>'value1','fileld2'=>'value2'),array('fileld1'=>'value1','fileld2'=>'value2'))
  * @return int 返回影响行数
  */
 public function insertBatch($tableName, $data)
 {
  self::$pdo || self::instance();

  $fields = '`' . implode('`,`', array_keys($data[0])) . '`';

  $tmp = array();
  foreach($data as $value)
  {
   $tmp[] = "'" . implode("','", $value) . "'";
  }

  $values = "(" . implode("),(", $tmp) . ")";

  $sql = "INSERT INTO `{$tableName}`({$fields}) VALUES {$values}";

  $rows = self::$pdo->exec($sql);

  if($this->debug)
  {
   $this->error();
  }

  return $rows;
 }

 /**
  * 根据主键更新数据
  * @param string $tableName 数据库表名
  * @param array  $where     更新条件,为 key|value 对应的数组,如:array('id'=>233)
  * @param array  $data      更新数据,为 key|value 对应的数组,如:array('field1'=>'value1','field12'=>'value2')
  * @return int 成功返回影响行数,失败返回错误信息
  */
 public function updateByPrimaryKey($tableName, $where, $data)
 {
  self::$pdo || self::instance();

  //条件
  $whereId    = array_keys($where);
  $whereValue = array_values($where);

  $tmp = array();
  foreach($data as $key => $value)
  {
   $tmp[] = "`{$key}`='{$value}'";
  }

  $data = implode(',', $tmp);

  $sql = "UPDATE `{$tableName}` SET {$data} WHERE `{$whereId[0]}`='{$whereValue[0]}'";

  $rows = self::$pdo->exec($sql);

  if($this->debug)
  {
   $this->error();
  }

  return $rows;
 }

 /**
  * 根据主键删除数据
  * @param string $tableName 数据库表名
  * @param array  $where     删除条件,为 key|value 对应的数组,如:array('id'=>233)
  * @return int 成功返回影响行数,失败返回错误信息
  */
 public function deleteByPrimaryKey($tableName, $where)
 {
  self::$pdo || self::instance();

  //条件
  $whereId    = array_keys($where);
  $whereValue = array_values($where);

  $sql = "DELETE FROM `{$tableName}` WHERE `{$whereId[0]}`='{$whereValue[0]}'";

  $rows = self::$pdo->exec($sql);

  if($this->debug)
  {
   $this->error();
  }

  return $rows;
 }

 /**
  * 返回最后插入行的ID或序列值
  * @return int
  */
 public function getLastInsertId()
 {
  self::$pdo || self::instance();

  return self::$pdo->lastInsertId();
 }

 /**
  * 设置错误信息
  */
 public function error($stmt = '')
 {
  $error = $stmt ? $stmt->errorInfo() : self::$pdo->errorInfo();

  $msg = "SQLSTATE:{$error[0]}";

  if($error[1])
  {
   $msg .= " - ERRORCODE:{$error[1]}";
  }

  if($error[2])
  {
   $msg .= " - ERROR:{$error[2]}";
  }

  if($error[1] || $error[2])
  {
   exit($msg);
  }
 }

 /**
  * 事务开始
  * @return bool
  */
 public function begin()
 {
  self::$pdo || self::instance();

  //已经有事务,退出事务
  $this->rollback();

  if(!self::$pdo->beginTransaction())
  {
   return false;
  }

  return $this->_begin_transaction = true;
 }

 /**
  * 事务提交
  * @return bool
  */
 public function commit()
 {
  if($this->_begin_transaction)
  {
   $this->_begin_transaction = false;
   self::$pdo->commit();
  }

  return true;
 }

 /**
  * 事务回滚
  * @return bool
  */
 public function rollback()
 {
  if($this->_begin_transaction)
  {
   $this->_begin_transaction = false;
   self::$pdo->rollback();
  }

  return false;
 }

 /**
  * 关闭链接
  */
 public function close()
 {
  self::$pdo = null;
 }
}

热门栏目