php--PDO操作数据库
2019独角兽企业重金招聘Python工程师标准>>>
--PDO的含义
PDO是PhP Date Object的简称,它是一个数据库访问抽象层,可以访问各种数据库。以后发展趋势是使用统一的接口替代各种单独的模块。
PDO借助于驱动,连接各个数据库。
--安装PDO (windows下)
版本要求:
修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个php.ini)
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
Driver name | Supported databases |
---|---|
PDO_DBLIB | FreeTDS / Microsoft SQL Server / Sybase |
PDO_FIREBIRD | Firebird/Interbase 6 |
PDO_INFORMIX | IBM Informix Dynamic Server |
PDO_MYSQL | MySQL 3.x/4.x |
PDO_OCI | Oracle Call Interface |
PDO_ODBC | ODBC v3 (IBM DB2, unixODBC and win32 ODBC) |
PDO_PGSQL | PostgreSQL |
PDO_SQLITE | SQLite 3 and SQLite 2 |
你要使用哪种数据库,只要把相应的扩展前的注释符号";"去掉就可以了。
--PDO相关的类
PDO有3个类:
- PDO类,与数据库连接,数据库执行相关。
- PDOStatement类,预处理类,处理结果集类。
- PDOException类,处理异常。
PDO的方法比mysqli少,但实现的功能一样。要使用好PDO,需要用好PDO中的常量。
----------------PDO类----------------
--PDO中连接MySQL(或其他DBMS),选择数据库
PDO连接数据库的方法:创建一个PDO对象,在构造函数中连接MySQL。
class PDO { PDO __construct ( string dsn [, string username [, string password [, array driver_options]]] ) }
dsn(data source name)数据源名,包含主机位置,数据库名,所连接的哪种数据库的驱动名。在PDO所支持的各个驱动里面有dsn的详细说明,比如mysql的驱动,他的dsn是:
The PDO_MYSQL Data Source Name (DSN) is composed of the following elements: DSN prefix The DSN prefix is mysql:. host The hostname on which the database server resides. port The port number where the database server is listening. dbname The name of the database. unix_socket The MySQL Unix socket (shouldn't be used with host or port).
举例:
$pdo = new PDO("mysql:host=localhost;port=3307;dbname=testdb","root","123456");
红色的部分就是dsn,驱动是mysql,主机位置是localhost,端口是3307,数据库名是testdb。
数据库连接的例子:
$dbms='mysql'; //数据库类型mysql对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了 $host='localhost'; //数据库主机名 $dbName='test'; //使用的数据库 $user='root'; //数据库连接用户名 $pass=''; //对应的密码 $dsn="$dbms:host=$host;dbname=$dbName"; // try { $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象,就是创建了数据库连接对象$dbh echo "连接成功<br/>"; /*你还可以进行一次搜索操作 foreach ($dbh->query('SELECT * from FOO') as $row) { print_r($row); //你可以用 echo($GLOBAL); 来看到这些值 } */ $dbh = null; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "<br/>"); } //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样: $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true)); 参考:http://www.phpv.net/html/1579.html
--预定义常量
PDO中的成员函数没有mysqli那么多,主要因为它有很多预定义常量,借助于预定义常量一个函数可以完成许多功能。如:使用 PDO::ATTR_SERVER_VERSION,PDO::ATTR_SERVER_INFO可以用getAttribute(int attribute)获得服务器版本,服务器信息。这些信息保存在成员属性中。
--读取成员属性
借助预定义常量,向
向class PDO {
mixed getAttribute ( int attribute )
}
函数传值,可以获得成员属性,获取如服务器版本,服务器信息等信息。
--设置成员属性
借助预定义常量,向
class PDO { bool setAttribute ( int attribute, mixed value ) }
函数传值,可以设置成员属性。
--PDO的执行语句
PDO有3个方法执行SQL语句:exec(),query(),prepare()。
- exec()用来执行能影响行数的语句。如update,delete语句。
- query()用来执行有返回结果集的语句。如SELECT语句。
- prepare()执行预处理语句。
--exec()语句
class PDO { int exec ( string statement ) }
用来执行能影响行数的语句,返回 影响的行数。statement为SQL语句。
--获取自动增长的ID
class PDO { string lastInsertId ( [string name] ) }
参数name指出了哪个列应该被返回,如果数据库只有1个自动增长的列,该参数可以省略。
--query()语句
class PDO { PDOStatement query ( string statement ) }
返回预处理对象。
--PDO处理预处理
确定是否为InnoDB表(MYISAM不支持事务处理)。
- 首先在建立PDO对象,或者使用setattribute(int attribute)方法,关闭自动提交。
- 使用PDO方法beginTransaction()开启事务处理。
class PDO { bool beginTransaction ( void ) }
- 在try{}中包含事务语句,如果任何一条语句出错,则抛出异常,跳转到catch。在每条SELECT语句后判断是否影响到行数,如果没有影响到1行,则抛出异常。
- 在try{}的最后1句,使用PDO方法commit(),提交事务;
- 在catch(){}中包含异常处理语句,处理异常。
- 使用setattribute(int attribute)方法,开启自动提交。
----------------PDOStatement类----------------
--PDOStatement类的作用
许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。它们是什么东西?你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。预处理语句具有两个主要的优点:
- 查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要 执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预 处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。
- 传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。(然而,如果你仍然在用基于不受信任的输入来构建查询的其他部分,这仍然是具有风险的)
- 准备一个语句。
- 处理结果集。
预处理类执行SQL的效率高,安全性高,是推荐使用的方法。
--获得预处理对象
class PDO { PDOStatement prepare ( string statement [, array driver_options] ) }
使用PDO对象的prepare(string statement)方法,获得预处理对象。statement是SQL语句。执行完该方法,在数据库端就已经接受到SQL语句并编译完成,等待分配数据。
--PDOStatement中的占位符
- 索引形式的:'?参数',此占位符按索引顺序使用。
- 关联形式的:'名字参数',此占位符与顺序无关。
名字参数的格式是 ':参数名称'(冒号+参数名称)
--绑定参数
使用PDOStatement中的bindParam(mixed parameter)方法,绑定参数。
class PDOStatement { bool bindParam ( mixed parameter, mixed &variable [, int data_type [, int length [, mixed driver_options]]] ) }
例如:
$sth->bindParam(':calories', $calo);
sth是PDOStatement类的对象,$calo是用于绑定的变量,:calories是prepare所准备的参数。每次只绑定一个变量。有几个 参数需要绑定,就执行几次bindParam(mixed parameter,mixed $variable)。
--执行准备语句
使用PDOStatement中的execute()方法,执行准备语句。
class PDOStatement { bool execute ( [array input_parameters] ) }
成功返回true,失败返回false。
- 如果在前面绑定了参数,execute的参数为空。
- 如果前面没有绑定参数,也可以在execute里面的数组放参数对应关系,形式如下:
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->execute(array(':calories' => $calories, ':colour' => $colour));
甚至可以把表单中的变量名字起成参数名,然后直接execute($_POST)
--获取结果集
使用PDOStatement中的fetch([int fetch_style [, int cursor_orientation [, int cursor_offset]]] )方法,获取结果集中的1行。
class PDOStatement { mixed fetch ( [int fetch_style [, int cursor_orientation [, int cursor_offset]]] ) }
成功返回true,失败返回false,常配合while()使用。
默认情况下以关联数组、索引数组两种方式返回数据,可以通过在参数中设置返回方式:
- 如果参数为PDO::FETCH_ASSOC,只返回关联数组;
- 如果参数为PDO::FETCH_NUM,返回索引数组;
- 如果参数为PDO::FETCH_BOTH,两种都返回(默认方式)
可以使用PDOStatement中的setFetchMode()方法,设置获取模式,这样不用在每个fetch()函数中设置了。
class PDOStatement { bool setFetchMode ( int PDO::FETCH_CLASS, string classname, array ctorargs ) }
还可以使用PDOStatement中fetchAll([int fetch_style [, int column_index]] )方法,一次获取结果集的所有数据,以二维数组的方式返回。
--绑定列
使用PDOStatement的bindColumn ( mixed column, mixed ¶m [, int type] )方法绑定列,绑定列不影响绑定参数,实际上绑定列只是在结果集上绑定的(可以execute()后再绑定)。
class PDOStatement { bool bindColumn ( mixed column, mixed ¶m [, int type] ) }
绑定的列可以用列名,也可以用列的序号,如下:
$sql = 'SELECT name, colour, calories FROM fruit'; try { $stmt = $dbh->prepare($sql); $stmt->execute(); /* Bind by column number */ $stmt->bindColumn(1, $name); $stmt->bindColumn(2, $colour); /* Bind by column name */ $stmt->bindColumn('calories', $cals); while ($row = $stmt->fetch(PDO::FETCH_BOUND)) { $data = $name . "\t" . $colour . "\t" . $cals . "\n"; print $data; } } catch (PDOException $e) { print $e->getMessage(); }
输出结果如下:
apple red 150 banana yellow 175 kiwi green 75 orange orange 150 mango red 200 strawberry red 25
--获取结果集行数
使用PDOStatement的rowCount(void)方法,可以获取结果集的行数。
class PDOStatement { int rowCount ( void ) }
--获取字段数
使用PDOStatement的columnCount( void )方法,可以获取结果集的字段数。
class PDOStatement { int columnCount ( void ) }
--获取字段信息
使用PDOStatement的getColumnMeta( int column )方法,可以获取字段信息。
class PDOStatement { mixed getColumnMeta ( int column ) }
每次执行返回1个数组,包含某1列的信息,到最后1列返回false。
转载于:https://my.oschina.net/yoyo1987/blog/159140
php--PDO操作数据库相关推荐
- pdo mysql 建库_一帖让PHP小白彻底了解PDO操作数据库的方法
php与mysql的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) .在这三种方法中,"民间"很多是倾向于使用PDO, ...
- php pdo操作数据库
POD扩展是在PHP5中加入,该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题. PDO的特点: 性能.PDO 从一开始就吸取了现有数据库扩展成 ...
- php pdo 方法,PHP之pdo操作数据库
PDO概述 1.PDO简介 PDO是PHP数据对象(PHP Data Object)的缩写. PDO扩展为PHP访问不同数据库定义了一个轻量级的.一致性的接口: PDO作用是统一各种数据库的访问接口, ...
- yaf mysql pdo 封装_PDO 操作数据库
# PDO 操作数据库 *** Yaf 框架(3.0.5版本)目前并没有提供数据库 ORM 类,据鸟哥的博客来说,以后或许会提供.使用了 ORM 类为团队带来的便捷和规范,但是带来了性能的下降.直接使 ...
- PHP数据库扩展 - PDO操作
PDO操作 PDO操作 描述:odp是php对数据库操作统一化的操作 语法:$pdo = new PDO("DB名:host=主机名;dbname=DB名","DB账号& ...
- php使用pdo操作mysql数据库实例_php5使用pdo连接数据库实例
本文为大家介绍下php pdo的用法. 一,pdo简介 pdo(php data object) 是php 5 中加入的东西,是php 5新加入的一个重大功能,因为在php 5以前的php4/php3 ...
- php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP
本文实例讲述了php使用PDO操作MySQL数据库的方法.分享给大家供大家参考.具体分析如下: PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在p ...
- php pdo操作mysql_PHP操作数据库详细(PDO)
PHP 5.1 发布时将附带一个全新的数据库连接层,即 PHP Data Objects (PDO).虽然 PHP 一直都拥有很好的数据库连接,但 PDO 让 PHP的数据库操作 达到一个新的高度.P ...
- PHP操作数据库,不推荐使用mysql函数,而推荐使用mysqli和PDO函数
PHP操作数据库,不推荐使用mysql函数,推荐使用mysqli和PDO函数. 转载于:https://www.cnblogs.com/npk19195global/p/4550013.html
- PHP pdo查询sqlite,PHP PDO 操作 sqlite数据库 案例
PHP PDO 操作 sqlite数据库 案例 1.需求: 已知: 1).一个json文件,里面是一个二维数组,数组解析出来为: array ( 0 => array ( 'title' =&g ...
最新文章
- python输出print(x+y)_Python语句序列“x='car';y=2; print(x+y)”的输出结果是_学小易找答案...
- 【原创】大数据基础之Ambari(1)简介、编译安装、使用
- Java GregorianCalendar computeTime()方法与示例
- mimemultipart java_最佳实践 – 发送javamail mime multipart电子邮件和gmail
- 随想录(符号数据与无符号数据)
- 数据处理利器python与scala基本数据结构对比分析1-大数据ML样本集案例实战
- 《redis设计与实现:第一部分》
- 转载 elm中文手册
- 如何选择DDoS防御服务器
- linux内核 自旋锁示例,自旋锁(示例代码)
- 蓝色——Love is Blue
- 解析解【闭式解(closed-form solution)】和数值解
- The server time zone value ‘�й���ʱ��’ is unrecognized or represents more than one time zone. You mu
- php斯芬克斯,找回自我 走出斯芬克斯之谜
- 最详细的整套模具设计思路与流程 !
- 滤芯怎么换 石头机器人_石头扫地机滤网怎么洗_小米扫地机滤网更换步骤_小米扫地机滤网...
- 当再多大公司慢慢的放弃微软的技术时, 不知大家怎想?
- 软件定义安全的一点点理解
- 软考 - 软考软件设计师考试总结(2018上半年)
- 将WAR文件部署到Tomcat的5种方法
热门文章
- python魔法属性_python魔法方法-属性转换和类的表示详解
- 计算机系统操作工中级工试卷,计算机系统操作工中级理论试题及答案.doc
- python中矩阵除法_Python numpy矩阵处理运算工具用法汇总
- python-图书管理系统5-全部代码
- python-gui-pyqt5的使用方法-1
- ARM:让Mali带来更极致的移动VR体验
- python-78:对日期格式进行处理
- 【.bash_profile 与 .bashrc 的区别】
- windows xp下Apache2.2.11整合Tomcat6.0.20
- VC++动态链接库编程之DLL木马(转)