PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入
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 文件进行查看:
<?php
phpinfo();
如图:
或者通过打印 pdo_drivers() 函数来查看:
<?phpprint_r(pdo_drivers());
页面显示:
Array
(
[0] => mysql
[1] => sqlite2
)
2.创建 PDO 对象
PDO 对象中的成员方法是统一各种数据库的访问接口,在使用 PDO 与数据库交互之前,要创建 PDO 对象。在 PDO 的构造方法中,有 4 个参数:
1. 数据源名 DSN,用来定义一个确定的数据库和必须用到的驱动程序
2. 连接数据库的用户名
3. 连接数据库的密码,是可选参数
4. 连接所需的所有额外选项,是可选参数
以 MySQL 为例,创建一个 PDO 对象:
//数据源名(DSN)
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = "root";
$pwd = "";
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8");
$dbh = new PDO($dsn,$user,$pwd,$opt);
这里的第四个参数表示:向客户端发送的 SQL 语句中使用 UTF8 字符集,同时服务器发送回客户端的结果也是用 UTF8 字符集。
3. 调用构造方法
第一种方法是将参数嵌入到构造函数中,上面的例子用的就是这种方法:
<?php //数据源名(DSN)
$dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = "root";
$pwd = "";
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"); try{ $dbh = new PDO($dsn,$user,$pwd,$opt); }catch(PDOException $e){ echo "数据库连接失败: ".$e->getMessage();
exit;
}
第二种方法是将 DSN 字符串存放在文件中,例如放在 d 盘相应目录的 dsn.txt 中:
<?php $user = "root";
$pwd = ""; try{ $dbh = new PDO('uri:file:///d:\\practise\php\pdo\dsn.txt',$user,$pwd);
}catch(PDOException $e){ echo "数据库连接失败: ".$e->getMessage();
}
这里使用了 uri ( 统一资源标识符 ) 来定位文件的位置。使用 PHP 的语句可以获得当前 uri:
$uri = $_SERVER['REQUEST_URI'];
echo $uri;
第三种方法是在 PHP 服务器的配置文件中维护 DSN 信息。
4.执行 SQL 语句
① 当执行 insert、update、delete 等没有结果集的查询时,使用 PDO 的 exec() 方法执行,执行成功后将返回受影响的行数。该方法不能用于 select 查询:
<?php //数据源名(DSN)
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = "root";
$pwd = "";
//第4个参数
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"); try{ $dbh = new PDO($dsn,$user,$pwd,$opt); }catch(PDOException $e){ echo "数据库连接失败: ".$e->getMessage();
exit;
} $query = "update archives set title = '白夜行' where title = '花的圆舞曲_3'"; //使用exec()方法执行insert,update,delete等
$affected = $dbh->exec($query); if($affected){ echo '数据表archives中受影响的行数为:'.$affected; }else{ print_r($dbh->errorInfo());
}
② 当执行返回结果集的 select 查询时,或者所影响的行数无关紧要时,应当使用 PDO 对象中的 query() 方法,如果该方法成功执行所制定的查询,则返回一个 PDOStatement 对象,并且可以使用 PDOStatement 对象的 rowCount() 方法获取获取的数据行数:
<?php //数据源名(DSN)
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = "root";
$pwd = "";
//第4个参数
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"); try{ $dbh = new PDO($dsn,$user,$pwd,$opt);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo "数据库连接失败: ".$e->getMessage();
exit;
} $query = "select * from archives where title='白夜行'"; try{ //执行select查询,并返回PDOstatement对象
$pdostatement = $dbh->query($query);
echo "一共从表中获取到".$pdostatement->rowCount()." 条记录:<br>";
foreach($pdostatement as $row){ echo $row['aid']."<br>";
}
}catch(PDOException $e){ echo $e->getMessage();
}
页面显示:
一共从表中获取到11 条记录:
540
541
544
547
550
553
556
559
562
565
568
5. 使用 PDO 过滤特殊字符,防止 SQL 注入,可以使用 PDO 的 quote() 方法:
$query = "select * from user where uname=".$dbh->quote($_POST['uname'])." and pwd=".$dbh->quote($_POST['pwd']);
参考资料:《细说PHP》第2版
PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入的更多相关文章
- PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
以数据库 msg 为例,说明 PDO 的数据提取.预处理语句: mysql> show tables;+---------------+| Tables_in_msg |+----------- ...
- PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项
我们都知道,只要合理正确使用PDO(PDO一是PHP数据对象(PHP Data Object)的缩写),可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_ ...
- 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项
我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...
- PDO防sql注入原理分析
使用pdo的预处理方式可以避免sql注入. 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的 ...
- JavaSE入门学习12: Java面相对象之static使用方法
我们能够基于一个类创建多个该类的对象,每一个对象都拥有自己的成员,互相独立. 然而在某些时候,我们更希 望该类全部的对象共享同一个成员. 此时就是static大显身手的时候了. Java中被stati ...
- pdo防sql注入
http://blog.csdn.net/qq635785620/article/details/11284591
- 5月11日 python学习总结 子查询、pymysql模块增删改查、防止sql注入问题
一.子查询 子查询:把一个查询语句用括号括起来,当做另外一条查询语句的条件去用,称为子查询 select emp.name from emp inner join dep on emp.dep_id ...
- 使用PDO执行SQL语句exec()、query()
在PHP脚本中,通过PDO执行SQL查询与数据库进行交互,可以分为三种不同的策略,使用哪一种方法取决于你要做什么操作. 1.使用PDO::exec()方法 当执行INSERT.UPDATE和DELET ...
- 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!
当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...
随机推荐
- linux下跳板机跟客户端之间无密码登陆
创建证书: [root@lnmp src]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which ...
- .net学习笔记---HttpHandle与HttpModule
问题1:什么是HttpHandler? 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什么时候使用HttpModule? 答案1:HttpHandler,Http ...
- 每个人都应该知晓的8项Resharper快捷键
(此文章同时发表在本人微信公众号“dotNET每日精华文章”) 如果你已经在用Resharper这个编程神器(机器杀手)的话,那么为了进一步提高工作效率熟悉它的一些特殊特性和快捷键那是必须的. Res ...
- 人人都可以开发高可用高伸缩应用——论Azure Service Fabric的意义
今天推荐的文章其实是微软的一篇官方公告,宣布其即将发布的一个支撑高可用高伸缩云服务的框架--Azure Service Fabric. 前两天,微软Azure平台的CTO Mark Russinovi ...
- Android快捷键
Android快捷键ALT+/ :在布局文件中,提示输入的内容Shift + Ctrl + / :注释Shift + Ctrl + \ :解除注释
- C++Premer Plus学习(五)——函数探幽
一.内联函数 1.优点: 内联函数就是比较省资源,然后一般就是将简短,使用频率高的函数作为内联函数会比较合适. 2.一个demo #include "stdafx.h" #incl ...
- Android SeekBar自定义使用图片和颜色显示
案例使用的图片如下: 1.在res/drawable目录下新增一个xml风格文件,seekbar_define_style.xml ? 1 2 3 ...
- Android RelativeLayout 实现左右中布局
效果图如下: 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...
- JQuery LazyLoad实现图片延迟加载-探究
对于大量图片的网站,图片延迟加载是提高速度和性能的好方法. 目前图片延迟加载主要分两大块,一是触发加载(根据滚动条位置加载图片):二是自动预加载(加载完首屏后n秒后自动加载其他位置的图片).大体常用的 ...
- Float Equal Problem
Understand limitations of floating point representations.Never check for equality with ==. Instead, ...