PDO(PHP Data Object) 是PHP5新到场的一个严重功用,由于在PHP 5之前的php4/php3都是一堆的数据库扩大来跟各个数据库的衔接和处置惩罚,如 php_mysql.dll。 PHP6中也将默许运用PDO的体式格局衔接,mysql扩大将被作为辅佐 。官方地点:http://php.net/manual/en/book.pdo.php
1. PDO设置
运用PDO扩大之前,先要启用这个扩大,php.ini中,去掉"extension=php_pdo.dll"前面的";"号,若要衔接数据库,还须要去掉与PDO相干的数据库扩大前面的";"号(平经常使用的是php_pdo_mysql.dll),然后重启Apache服务器即可。
extension=php_pdo.dll extension=php_pdo_mysql.dll
2. PDO衔接mysql数据库
$dbh = new PDO("mysql:host=localhost;dbname=mydb","root","password");
默许不是长衔接,若要运用数据库长衔接,能够在末了加以下参数:
$dbh = new PDO("mysql:host=localhost;dbname=mydb","root","password","array(PDO::ATTR_PERSISTENT => true) "); $dbh = null; //(开释)
3. PDO设置属性
PDO有三种毛病处置惩罚体式格局:
PDO::ERrmODE_SILENT不显现毛病信息,只设置毛病码
PDO::ERrmODE_WARNING显现正告错
PDO::ERrmODE_EXCEPTION抛出非常
可经由过程以下语句来设置毛病处置惩罚体式格局为抛出非常
$db->setAttribute(PDO::ATTR_ERrmODE, PDO::ERrmODE_EXCEPTION);
由于差别数据库对返回的字段称号大小写处置惩罚差别,所以PDO供应了PDO::ATTR_CASE设置项(包含PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER),来肯定返回的字段称号的大小写。
经由过程设置PDO::ATTR_ORACLE_NULLS范例(包含PDO::NULL_NATURAL,PDO::NULL_EmpTY_STRING,PDO::NULL_TO_STRING)来指定数据库返回的NULL值在php中对应的数值。
4. PDO经常使用要领及其运用
PDO::query() 主如果用于有纪录结果返回的操纵,特别是SELECT操纵
PDO::exec() 主如果针对没有结果鸠合返回的操纵,如INSERT、UPDATE等操纵
PDO::prepare() 主如果预处置惩罚操纵,须要经由过程$rs->execute()来实行预处置惩罚内里的SQL语句,这个要领能够绑定参数,功用比较壮大(防备sql注入就靠这个)
PDO::lastInsertId() 返回上次插进去操纵,主键列范例是自增的末了的自增ID
PDOStatement::fetch() 是用来猎取一条纪录
PDOStatement::fetchAll() 是猎取一切纪录集到一个鸠合
PDOStatement::fetchColumn() 是猎取结果指定第一条纪录的某个字段,缺省是第一个字段
PDOStatement::rowCount() :主如果用于PDO::query()和PDO::prepare()举行DELETE、INSERT、UPDATE操纵影响的结果集,对PDO::exec()要领和SELECT操纵无效。
5.PDO操纵MYSQL数据库实例
<?php $pdo = new PDO("mysql:host=localhost;dbname=mydb","root",""); if($pdo -> exec("insert into mytable(name,content) values('fdipzone','123456')")){ echo "insert success"; echo $pdo -> lastinsertid(); } ?>
<?php $pdo = new PDO("mysql:host=localhost;dbname=mydb","root",""); $rs = $pdo -> query("select * from table"); $rs->setFetchMode(PDO::FETCH_ASSOC); //关联数组情势 //$rs->setFetchMode(PDO::FETCH_NUM); //数字索引数组情势 while($row = $rs -> fetch()){ print_r($row); } ?>
<?php foreach( $db->query( "SELECT * FROM table" ) as $row ) { print_r( $row ); } ?>
统计有若干行数据:
<?php $sql="select count(*) from table"; $num = $dbh->query($sql)->fetchColumn(); ?>
prepare体式格局:
<?php $query = $dbh->prepare("select * from table"); if ($query->execute()) { while ($row = $query->fetch()) { print_r($row); } } ?>
prepare参数化查询:
<?php $query = $dbh->prepare("select * from table where id = ?"); if ($query->execute(array(1000))) { while ($row = $query->fetch(PDO::FETCH_ASSOC)) { print_r($row); } } ?>
运用PDO接见MySQL数据库时,真正的real prepared statements 默许状况下是不运用的。为了处理这个题目,你必需禁用 prepared statements的仿真结果。下面是运用PDO建立链接的例子:
<?php $dbh = new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8', 'root', 'pass'); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); ?>
setAttribute()这一行是强制性的,它会通知 PDO 禁用模仿预处置惩罚语句,并运用 real parepared statements 。这能够确保SQL语句和响应的值在通报到mysql服务器之前是不会被PHP剖析的(制止了一切能够的歹意SQL注入进击)。
虽然你能够设置文件中设置字符集的属性(charset=utf8),然则须要分外注重的是,老版本的 PHP( < 5.3.6)在DSN中是疏忽字符参数的。
完全的代码运用实例:
<?php $dbh = new PDO("mysql:host=localhost; dbname=mydb", "root", "pass"); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真结果 $dbh->exec("set names 'utf8'"); $sql="select * from table where username = ? and password = ?"; $query = $dbh->prepare($sql); $exeres = $query->execute(array($username, $pass)); if ($exeres) { while ($row = $query->fetch(PDO::FETCH_ASSOC)) { print_r($row); } } $dbh = null; ?>
上面这段代码就能够提防sql注入。为何呢?
当挪用 prepare() 时,查询语句已发送给了数据库服务器,此时只要占位符 ? 发送过去,没有用户提交的数据;当挪用到 execute()时,用户提交过来的值才会传送给数据库,它们是离开传送的,二者自力的,SQL进击者没有一点时机。
然则我们须要注重的是以下几种状况,PDO并不能协助你提防SQL注入。
不能让占位符 ? 替代一组值,如许只会猎取到这组数据的第一个值,如:
select * from table where userid in ( ? );
假如要用in來查找,能够改用find_in_set()完成
$ids = '1,2,3,4,5,6'; select * from table where find_in_set(userid, ?);
不能让占位符替代数据表名或列名,如:
select * from table order by ?;
不能让占位符 ? 替代任何其他SQL语法,如:
select extract( ? from addtime) as mytime from table;
本篇文章怎样运用PDO查询mysql防备SQL注入的要领,更多相干内容请关注ki4网。
相干引荐:
关于php 双向行列类的解说
php heredoc 与 nowdoc之间的区分与特性
关于HTML5 localStorage and sessionStorage 之间的区分
以上就是怎样运用PDO查询mysql防备SQL注入的要领的细致内容,更多请关注ki4网别的相干文章!