php中pdo,PHP中PDO

PHP PDO 是什么?

PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口。PDO与mysqli曾经被建议用来取代原本PHP在用的mysql相关函数,基于数据库使用的安全性,因为后者欠缺对于SQL注入的防护。

PHP 数据对象(PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个具体数据库的 PDO 驱动来访问数据库服务。

相关mysql视频教程推荐:《mysql教程》

PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO不提供数据库抽象层;它不会重写 SQL,也不会模拟缺失的特性。如果需要的话,应该使用一个成熟的抽象层。

数据库支持:firebird

informix

mysql

mssql

odbc

pgsql

sqlite

PHP PDO 错误与错误处理

PDO 提供了三种不同的错误处理模式,以满足不同风格的应用开发:

PDO::ERRMODE_SILENT

此为默认模式。 PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法来检查语句和数据库对象。如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。如果错误是由于调用数据库对象而产生的,那么可以在数据库对象上调用上述两个方法。

PDO::ERRMODE_WARNING

除设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息。如果只是想看看发生了什么问题且不中断应用程序的流程,那么此设置在调试/测试期间非常有用。

PDO::ERRMODE_EXCEPTION

除设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息。此设置在调试期间也非常有用,因为它会有效地放大脚本中产生错误的点,从而可以非常快速地指出代码中有问题的潜在区域(记住:如果异常导致脚本终止,则事务被自动回滚)。

异常模式另一个非常有用的是,相比传统 PHP 风格的警告,可以更清晰地构建自己的错误处理,而且比起静默模式和显式地检查每种数据库调用的返回值,异常模式需要的代码/嵌套更少。

PHP PDO 使用

连接MySQL<?php

$type = 'mysql';

$hostname = 'localhost';

$dbname = 'test';

$username = 'root';

$password = 'root';

try {

$dsn = sprintf('%s:dbname=%s;host=%s', $type, $dbname, $dbname);

//初始化一个PDO对象

$pdo = new PDO($dsn, $username, $password, [

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION //开启异常模式

]);

} catch (PDOException $e) {

die ("Database error: " . $e->getMessage());

}

?>

查询数据$type = 'mysql';

$hostname = '127.0.0.1';

$dbname = 'test';

$username = 'root';

$password = 'root';

try {

$dsn = sprintf('%s:dbname=%s;host=%s;charset=utf8', $type, $dbname, $hostname);

//初始化一个PDO对象

$pdo = new PDO($dsn, $username, $password, [

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION //开启异常模式

]);

} catch (PDOException $e) {

die ("Database error: " . $e->getMessage());

}

$smt = $pdo->query('SELECT * FROM t_user');

$data = $smt->fetchAll(PDO::FETCH_ASSOC);

var_dump($data);

打印结果array(5) {

[0]=>

array(4) {

["password"]=>

string(8) "jidasdas"

["phone"]=>

string(9) "888888888"

["user_id"]=>

string(32) "402881e564c0da7b0164c11adc8f0006"

["user_name"]=>

string(5) "marry"

}

[1]=>

array(4) {

["password"]=>

string(4) "tiyv"

["phone"]=>

string(6) "000000"

["user_id"]=>

string(32) "402881e564c0da7b0164c1227c5d000b"

["user_name"]=>

string(6) "Bliabx"

}

[2]=>

array(4) {

["password"]=>

string(5) "dsada"

["phone"]=>

string(7) "3123123"

["user_id"]=>

string(32) "402881e764bbd6340164bbd6af4e0001"

["user_name"]=>

string(4) "Nusg"

}

[3]=>

array(4) {

["password"]=>

string(4) "kjhk"

["phone"]=>

string(6) "321312"

["user_id"]=>

string(32) "402881e764bbd7b60164bbd9c3cb0002"

["user_name"]=>

string(6) "XIoaji"

}

[4]=>

array(4) {

["password"]=>

string(3) "dsa"

["phone"]=>

string(3) "110"

["user_id"]=>

string(32) "402881e764bbed9f0164bbee12c70000"

["user_name"]=>

string(6) "Villig"

}

}

预处理/* 通过数组值向预处理语句传递值 */

$sql = 'SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour';

$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

$sth->execute([':calories' => 150, ':colour' => 'red']);

$red = $sth->fetchAll();

$sth->execute([':calories' => 175, ':colour' => 'yellow']);

$yellow = $sth->fetchAll();

基本 PDO 封装<?php

/**

* DAOPDO

* @authors by houzhyan

* @blog http://www.descartes.top/

* @version >5.1 utf8

*/

class DAOPDO

{

protected static $_instance = null;

protected $dbName = '';

protected $dsn;

protected $dbh;

/**

* 构造

*

* @return DAOPDO

*/

private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)

{

try {

$this->dsn = 'mysql:host='.$dbHost.';dbname='.$dbName;

$this->dbh = new PDO($this->dsn, $dbUser, $dbPasswd);

$this->dbh->exec('SET character_set_connection='.$dbCharset.', character_set_results='.$dbCharset.', character_set_client=binary');

} catch (PDOException $e) {

$this->outputError($e->getMessage());

}

}

/**

* 防止克隆

*

*/

private function __clone() {}

/**

* Singleton instance

*

* @return Object

*/

public static function getInstance($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)

{

if (self::$_instance === null) {

self::$_instance = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset);

}

return self::$_instance;

}

/**

* Query 查询

*

* @param String $strSql SQL语句

* @param String $queryMode 查询方式(All or Row)

* @param Boolean $debug

* @return Array

*/

public function query($strSql, $queryMode = 'All', $debug = false)

{

if ($debug === true) $this->debug($strSql);

$recordset = $this->dbh->query($strSql);

$this->getPDOError();

if ($recordset) {

$recordset->setFetchMode(PDO::FETCH_ASSOC);

if ($queryMode == 'All') {

$result = $recordset->fetchAll();

} elseif ($queryMode == 'Row') {

$result = $recordset->fetch();

}

} else {

$result = null;

}

return $result;

}

/**

* Update 更新

*

* @param String $table 表名

* @param Array $arrayDataValue 字段与值

* @param String $where 条件

* @param Boolean $debug

* @return Int

*/

public function update($table, $arrayDataValue, $where = '', $debug = false)

{

$this->checkFields($table, $arrayDataValue);

if ($where) {

$strSql = '';

foreach ($arrayDataValue as $key => $value) {

$strSql .= ", `$key`='$value'";

}

$strSql = substr($strSql, 1);

$strSql = "UPDATE `$table` SET $strSql WHERE $where";

} else {

$strSql = "REPLACE INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";

}

if ($debug === true) $this->debug($strSql);

$result = $this->dbh->exec($strSql);

$this->getPDOError();

return $result;

}

/**

* Insert 插入

*

* @param String $table 表名

* @param Array $arrayDataValue 字段与值

* @param Boolean $debug

* @return Int

*/

public function insert($table, $arrayDataValue, $debug = false)

{

$this->checkFields($table, $arrayDataValue);

$strSql = "INSERT INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";

if ($debug === true) $this->debug($strSql);

$result = $this->dbh->exec($strSql);

$this->getPDOError();

return $result;

}

/**

* Replace 覆盖方式插入

*

* @param String $table 表名

* @param Array $arrayDataValue 字段与值

* @param Boolean $debug

* @return Int

*/

public function replace($table, $arrayDataValue, $debug = false)

{

$this->checkFields($table, $arrayDataValue);

$strSql = "REPLACE INTO `$table`(`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";

if ($debug === true) $this->debug($strSql);

$result = $this->dbh->exec($strSql);

$this->getPDOError();

return $result;

}

/**

* Delete 删除

*

* @param String $table 表名

* @param String $where 条件

* @param Boolean $debug

* @return Int

*/

public function delete($table, $where = '', $debug = false)

{

if ($where == '') {

$this->outputError("'WHERE' is Null");

} else {

$strSql = "DELETE FROM `$table` WHERE $where";

if ($debug === true) $this->debug($strSql);

$result = $this->dbh->exec($strSql);

$this->getPDOError();

return $result;

}

}

/**

* execSql 执行SQL语句,debug=>true可打印sql调试

*

* @param String $strSql

* @param Boolean $debug

* @return Int

*/

public function execSql($strSql, $debug = false)

{

if ($debug === true) $this->debug($strSql);

$result = $this->dbh->exec($strSql);

$this->getPDOError();

return $result;

}

/**

* 获取字段最大值

*

* @param string $table 表名

* @param string $field_name 字段名

* @param string $where 条件

*/

public function getMaxValue($table, $field_name, $where = '', $debug = false)

{

$strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table";

if ($where != '') $strSql .= " WHERE $where";

if ($debug === true) $this->debug($strSql);

$arrTemp = $this->query($strSql, 'Row');

$maxValue = $arrTemp["MAX_VALUE"];

if ($maxValue == "" || $maxValue == null) {

$maxValue = 0;

}

return $maxValue;

}

/**

* 获取指定列的数量

*

* @param string $table

* @param string $field_name

* @param string $where

* @param bool $debug

* @return int

*/

public function getCount($table, $field_name, $where = '', $debug = false)

{

$strSql = "SELECT COUNT($field_name) AS NUM FROM $table";

if ($where != '') $strSql .= " WHERE $where";

if ($debug === true) $this->debug($strSql);

$arrTemp = $this->query($strSql, 'Row');

return $arrTemp['NUM'];

}

/**

* 获取表引擎

*

* @param String $dbName 库名

* @param String $tableName 表名

* @param Boolean $debug

* @return String

*/

public function getTableEngine($dbName, $tableName)

{

$strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name='".$tableName."'";

$arrayTableInfo = $this->query($strSql);

$this->getPDOError();

return $arrayTableInfo[0]['Engine'];

}

//预处理执行

public function prepareSql($sql=''){

return $this->dbh->prepare($sql);

}

//执行预处理

public function execute($presql){

return $this->dbh->execute($presql);

}

/**

* pdo属性设置

*/

public function setAttribute($p,$d){

$this->dbh->setAttribute($p,$d);

}

/**

* beginTransaction 事务开始

*/

public function beginTransaction()

{

$this->dbh->beginTransaction();

}

/**

* commit 事务提交

*/

public function commit()

{

$this->dbh->commit();

}

/**

* rollback 事务回滚

*/

public function rollback()

{

$this->dbh->rollback();

}

/**

* transaction 通过事务处理多条SQL语句

* 调用前需通过getTableEngine判断表引擎是否支持事务

*

* @param array $arraySql

* @return Boolean

*/

public function execTransaction($arraySql)

{

$retval = 1;

$this->beginTransaction();

foreach ($arraySql as $strSql) {

if ($this->execSql($strSql) == 0) $retval = 0;

}

if ($retval == 0) {

$this->rollback();

return false;

} else {

$this->commit();

return true;

}

}

/**

* checkFields 检查指定字段是否在指定数据表中存在

*

* @param String $table

* @param array $arrayField

*/

private function checkFields($table, $arrayFields)

{

$fields = $this->getFields($table);

foreach ($arrayFields as $key => $value) {

if (!in_array($key, $fields)) {

$this->outputError("Unknown column `$key` in field list.");

}

}

}

/**

* getFields 获取指定数据表中的全部字段名

*

* @param String $table 表名

* @return array

*/

private function getFields($table)

{

$fields = array();

$recordset = $this->dbh->query("SHOW COLUMNS FROM $table");

$this->getPDOError();

$recordset->setFetchMode(PDO::FETCH_ASSOC);

$result = $recordset->fetchAll();

foreach ($result as $rows) {

$fields[] = $rows['Field'];

}

return $fields;

}

/**

* getPDOError 捕获PDO错误信息

*/

private function getPDOError()

{

if ($this->dbh->errorCode() != '00000') {

$arrayError = $this->dbh->errorInfo();

$this->outputError($arrayError[2]);

}

}

/**

* debug

*

* @param mixed $debuginfo

*/

private function debug($debuginfo)

{

var_dump($debuginfo);

exit();

}

/**

* 输出错误信息

*

* @param String $strErrMsg

*/

private function outputError($strErrMsg)

{

throw new Exception('MySQL Error: '.$strErrMsg);

}

/**

* destruct 关闭数据库连接

*/

public function destruct()

{

$this->dbh = null;

}

/**

*PDO执行sql语句,返回改变的条数

*如需调试可选用execSql($sql,true)

*/

public function exec($sql=''){

return $this->dbh->exec($sql);

}

}

?>

PHP PDO 详细说明

PDO 类

PDO::beginTransaction — 启动一个事务

PDO::commit — 提交一个事务

PDO::__construct — 创建一个表示数据库连接的 PDO 实例

PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE

PDO::errorInfo — 返回最后一次操作数据库的错误信息

PDO::exec — 执行一条 SQL 语句,并返回受影响的行数

PDO::getAttribute — 取回一个数据库连接的属性

PDO::getAvailableDrivers — 返回一个可用驱动的数组

PDO::inTransaction — 检查是否在一个事务内

PDO::lastInsertId — 返回最后插入行的ID或序列值

PDO::prepare — 备要执行的SQL语句并返回一个 PDOStatement 对象

PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集

PDO::quote — 为SQL语句中的字符串添加引号。

PDO::rollBack — 回滚一个事务

PDO::setAttribute — 设置属性

PDOStatement 类

PDOStatement::bindColumn — 绑定一列到一个 PHP 变量

PDOStatement::bindParam — 绑定一个参数到指定的变量名

PDOStatement::bindValue — 把一个值绑定到一个参数

PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。

PDOStatement::columnCount — 返回结果集中的列数

PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令

PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE

PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息

PDOStatement::execute — 执行一条预处理语句

PDOStatement::fetch — 从结果集中获取下一行

PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组

PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。

PDOStatement::fetchObject — 获取下一行并作为一个对象返回。

PDOStatement::getAttribute — 检索一个语句属性

PDOStatement::getColumnMeta — 返回结果集中一列的元数据

PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集

PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数

PDOStatement::setAttribute — 设置一个语句属性

PDOStatement::setFetchMode — 为语句设置默认的获取模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值