1.安装 PDO

数据库抽象层 PDO - PHP Data Object 扩展类库为 PHP 访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,针对不同的数据库服务器使用特定的 PDO 驱动程序访问,如图:

Windows 环境下 PHP 5.1 以上版本通过编辑 php.ini文件来安装 PDO:去掉 extension=php_pdo.dll 前面的 ;

如果使用的数据库是 MySQL ,在 php.ini 文件中加载 MySQL 的 PDO 驱动:

添加 extension=php_pdo_mysql.dll 或者去掉该句前面的 ;

查看可用的 PDO 驱动程序,可以编写 php 文件进行查看:

  1. <?php
  2. phpinfo();

如图:

或者通过打印 pdo_drivers() 函数来查看:

  1. <?phpprint_r(pdo_drivers());

页面显示:

  1. Array
  2. (
  3. [0] => mysql
  4. [1] => sqlite2
  5. )

2.创建 PDO 对象

PDO 对象中的成员方法是统一各种数据库的访问接口,在使用 PDO 与数据库交互之前,要创建 PDO 对象。在 PDO 的构造方法中,有 4 个参数:

1. 数据源名 DSN,用来定义一个确定的数据库和必须用到的驱动程序

2. 连接数据库的用户名

3. 连接数据库的密码,是可选参数

4. 连接所需的所有额外选项,是可选参数

以 MySQL 为例,创建一个 PDO 对象:

  1. //数据源名(DSN)
  2. $dsn = 'mysql:dbname=test;host=127.0.0.1';
  3. $user = "root";
  4. $pwd = "";
  5. $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8");
  6. $dbh = new PDO($dsn,$user,$pwd,$opt);

这里的第四个参数表示:向客户端发送的 SQL 语句中使用 UTF8 字符集,同时服务器发送回客户端的结果也是用 UTF8 字符集。

3. 调用构造方法

第一种方法是将参数嵌入到构造函数中,上面的例子用的就是这种方法:

  1. <?php
  2.  
  3. //数据源名(DSN)
  4. $dsn = 'mysql:dbname=test;host=127.0.0.1';
  5.  
  6. $user = "root";
  7. $pwd = "";
  8. $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8");
  9.  
  10. try{
  11.  
  12. $dbh = new PDO($dsn,$user,$pwd,$opt);
  13.  
  14. }catch(PDOException $e){
  15.  
  16. echo "数据库连接失败: ".$e->getMessage();
  17. exit;
  18. }

第二种方法是将 DSN 字符串存放在文件中,例如放在 d 盘相应目录的 dsn.txt 中:

  1. <?php
  2.  
  3. $user = "root";
  4. $pwd = "";
  5.  
  6. try{
  7.  
  8. $dbh = new PDO('uri:file:///d:\\practise\php\pdo\dsn.txt',$user,$pwd);
  9. }catch(PDOException $e){
  10.  
  11. echo "数据库连接失败: ".$e->getMessage();
  12. }

这里使用了 uri ( 统一资源标识符 ) 来定位文件的位置。使用 PHP 的语句可以获得当前 uri:

  1. $uri = $_SERVER['REQUEST_URI'];
  2. echo $uri;

第三种方法是在 PHP 服务器的配置文件中维护 DSN 信息。

4.执行 SQL 语句

① 当执行 insert、update、delete 等没有结果集的查询时,使用 PDO 的 exec() 方法执行,执行成功后将返回受影响的行数。该方法不能用于 select 查询:

  1. <?php
  2.  
  3. //数据源名(DSN)
  4. $dsn = 'mysql:dbname=test;host=127.0.0.1';
  5. $user = "root";
  6. $pwd = "";
  7. //第4个参数
  8. $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8");
  9.  
  10. try{
  11.  
  12. $dbh = new PDO($dsn,$user,$pwd,$opt);
  13.  
  14. }catch(PDOException $e){
  15.  
  16. echo "数据库连接失败: ".$e->getMessage();
  17. exit;
  18. }
  19.  
  20. $query = "update archives set title = '白夜行' where title = '花的圆舞曲_3'";
  21.  
  22. //使用exec()方法执行insert,update,delete等
  23. $affected = $dbh->exec($query);
  24.  
  25. if($affected){
  26.  
  27. echo '数据表archives中受影响的行数为:'.$affected;
  28.  
  29. }else{
  30.  
  31. print_r($dbh->errorInfo());
  32. }

② 当执行返回结果集的 select 查询时,或者所影响的行数无关紧要时,应当使用 PDO 对象中的 query() 方法,如果该方法成功执行所制定的查询,则返回一个 PDOStatement 对象,并且可以使用 PDOStatement 对象的 rowCount() 方法获取获取的数据行数:

  1. <?php
  2.  
  3. //数据源名(DSN)
  4. $dsn = 'mysql:dbname=test;host=127.0.0.1';
  5. $user = "root";
  6. $pwd = "";
  7. //第4个参数
  8. $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8");
  9.  
  10. try{
  11.  
  12. $dbh = new PDO($dsn,$user,$pwd,$opt);
  13. $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  14.  
  15. }catch(PDOException $e){
  16.  
  17. echo "数据库连接失败: ".$e->getMessage();
  18. exit;
  19. }
  20.  
  21. $query = "select * from archives where title='白夜行'";
  22.  
  23. try{
  24.  
  25. //执行select查询,并返回PDOstatement对象
  26. $pdostatement = $dbh->query($query);
  27. echo "一共从表中获取到".$pdostatement->rowCount()." 条记录:<br>";
  28. foreach($pdostatement as $row){
  29.  
  30. echo $row['aid']."<br>";
  31. }
  32. }catch(PDOException $e){
  33.  
  34. echo $e->getMessage();
  35. }

页面显示:

一共从表中获取到11 条记录:
540
541
544
547
550
553
556
559
562
565
568

5. 使用 PDO 过滤特殊字符,防止 SQL 注入,可以使用 PDO 的 quote() 方法:

  1. $query = "select * from user where uname=".$dbh->quote($_POST['uname'])." and pwd=".$dbh->quote($_POST['pwd']);

参考资料:《细说PHP》第2版

PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入的更多相关文章

  1. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句

    以数据库 msg 为例,说明 PDO 的数据提取.预处理语句: mysql> show tables;+---------------+| Tables_in_msg |+----------- ...

  2. PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO(PDO一是PHP数据对象(PHP Data Object)的缩写),可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_ ...

  3. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  4. PDO防sql注入原理分析

    使用pdo的预处理方式可以避免sql注入. 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的 ...

  5. JavaSE入门学习12: Java面相对象之static使用方法

    我们能够基于一个类创建多个该类的对象,每一个对象都拥有自己的成员,互相独立. 然而在某些时候,我们更希 望该类全部的对象共享同一个成员. 此时就是static大显身手的时候了. Java中被stati ...

  6. pdo防sql注入

    http://blog.csdn.net/qq635785620/article/details/11284591

  7. 5月11日 python学习总结 子查询、pymysql模块增删改查、防止sql注入问题

    一.子查询 子查询:把一个查询语句用括号括起来,当做另外一条查询语句的条件去用,称为子查询 select emp.name from emp inner join dep on emp.dep_id ...

  8. 使用PDO执行SQL语句exec()、query()

    在PHP脚本中,通过PDO执行SQL查询与数据库进行交互,可以分为三种不同的策略,使用哪一种方法取决于你要做什么操作. 1.使用PDO::exec()方法 当执行INSERT.UPDATE和DELET ...

  9. 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

随机推荐

  1. 【HTML5】input类型

    * email <input type="email" name="user_email" /> * url <input type=&quo ...

  2. Intent实现页面跳转和传值

    *Intent称为意图,是Android各大组件连接的桥梁 1.Activity页面跳转 同一个包内 Intent intent = new Intent(); intent.setClass(Mai ...

  3. js拆分数组

    <script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new A ...

  4. 异步加载图片Universal-Image-Loader

    项目地址:https://github.com/nostra13/Android-Universal-Image-Loader

  5. VMware Tools安装

    不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少 ...

  6. SU Demos-04Deconvolution-02Wiener_Levinson

    本Demo共有4个脚本,我只看了第一个,后面的3个不熟悉,就不往这里贴图了,望谅解. 不足之处,欢迎批评指正. 先看readme 生成数据所需的c程序 make上述c程序时需要的makefile(本人 ...

  7. stack+DFS ZOJ 1004 Anagrams by Stack

    题目传送门 /* stack 容器的应用: 要求字典序升序输出,所以先搜索入栈的 然后逐个判断是否满足答案,若不满足,回溯继续搜索,输出所有符合的结果 */ #include <cstdio&g ...

  8. 水题 HDOJ 4727 The Number Off of FFF

    题目传送门 /* 水题:判断前后的差值是否为1,b[i]记录差值,若没有找到,则是第一个出错 */ #include <cstdio> #include <iostream> ...

  9. Java unicode中文编码转换和反转

    参考网址http://www.oschina.net/code/snippet_142385_4297 http://canofy.iteye.com/blog/718659 在java的很多配置文件 ...

  10. Hadoop虽然强大,但不是万能的(CSDN)

    Hadoop很强大,但企业在使用Hadoop或者大数据之前,首先要明确自己的目标,再确定是否选对了工具,毕竟Hadoop不是万能的!本文中列举了几种不适合使用Hadoop的场景. 随着 Hadoop  ...