php pdo 简单使用 (一)

简介:

PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。

即提供了一个数据库访问抽象层能使得我们通过一致的函数和写法来操作不同数据库,有利于日后对数据库的迁移,当然也有安全方面的提升。

对比:

php 操作数据库以mysql 为例常用的方法有 php_mysql , php_mysqli , pdo

1.php_mysql 和 php_mysqli 都是不可以移植的,只能应用于mysql 数据库, 而pdo 是可以轻易移植的。

2.php_mysql 是我们初学php 学的操作数据库的函数,但是其实他基本上很少使用了,其中最重要的一点就是容易造成安全问题。

    存在SQL注入,于是php 提供了函数mysql_real_escape_string 如果存在很多的变量每一个都要经过 mysql_real_escape_string

    反而变的很麻烦。

3.pdo 支持预处理,预处理功能可以有效的避免sql注入,并提高效率。

4.php_mysqli 和 pdo 都支持面向对象。

5.pdo 长连接方式性能上优于php_mysqli (参考网上资料)

php_mysql 方式优势已经不大了,php_mysqli 最致命的就是不能移植到其它数据库,除非你很确定不会更换数据库。显然 pdo方式连接数据库将会是一种趋势。

pdo简单操作数据库:

首先php 要启用php-pdo 相关扩展

<?php

$dbType = 'mysql';
$dbUser = 'root';
$dbPass = 'simael';
$dbhost = 'localhost';
$dbName = 'pdotest';
$dsn="$dbType:host=$dbhost;dbname=$dbName";
try{
    $pdo = new PDO($dsn, $dbUser, $dbPass); 
    echo "PDO成功连接MySQL数据库!";
}catch(PDOException $exception){
    echo $exception->getMessage();
}

插入 数据

<?php
//$pdo->query('set names utf8');
$sql = "INSERT INTO la_comments SET nick_name='formPdo',email='pdo@pdo.com',comment='中文comment',page_id='11',created_at=NOW(),updated_at=NOW()";
$res1 = $pdo->exec($sql);
var_dump($res1);

此时去数据库看到中文 可能是乱码,是因为编码问题各种错乱的原因

添加代码

$pdo->query('set names utf8');

数据存储仍存在错误,是因为有可能你的header 是gbk 编码

网上总结的 编码需要注意的问题如下:

一、服务端程序声明编码,比如header("Content-type: text/html; charset=utf-8");
二、客户端声明编码,比如 <META http-equiv="content-type" content="text/html; charset=utf-8">
三、数据库编码、表以及字段的编码
四、文件本身编码属性
五、连接数据库时请声明编码,比如$pdo->query('set names utf8');

只要上述都一致了编码问题一般都会解决的。

完整示例代码:(文件本身也应该使用utf8 编码)

<?php
header("Content-type: text/html; charset=utf-8");

$dbType = 'mysql';
$dbUser = 'root';
$dbPass = 'simael';
$dbhost = 'localhost';
$dbName = 'pdotest';
$dsn="$dbType:host=$dbhost;dbname=$dbName";
try{
	$pdo = new PDO($dsn, $dbUser, $dbPass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES'utf8';")); 
	//$pdo = new PDO($dsn, $dbUser, $dbPass); 
    echo "PDO成功连接MySQL数据库!";
}catch(PDOException $exception){
	echo $exception->getMessage();
}

$pdo->query('set names utf8');
$sql = "INSERT INTO la_comments SET nick_name='formPdo',email='pdo@pdo.com',comment='中文comment',page_id='11',created_at=NOW(),updated_at=NOW()";
$res1 = $pdo->exec($sql);
var_dump($res1);

$sql = "SELECT * FROM la_comments";
$res2 = $pdo->query($sql);
while($row = $res2->fetch()){
	print_r($row);
	echo '<br>';
}



$pdo = null;
?>



此文章通过 python 爬虫创建,原文是自己的csdn 地址: php pdo 简单使用 (一)

php pdo 简单使用 (二)

通过上一节内容 php pdo 简单使用(一)了解了链接的创建和简单的操作。
通过 pdo 有三种方式执行sql语句: exec, query, prepared statement
1. exec() 函数适用于执行一次sql 操作,并且不适用于select语句 参见:http://php.net/manual/zh/pdo.exec.php
2. query() 函数适用于执行一次sql操作,并且在下一次query之前要fetch 出所有的结果否则执行将会失败 参见:http://php.net/manual/zh/pdo.query.php
3. 如果一类查询(查询结构相似而具体的参数不一)需要一次解析而执行使用很多次,可以先用prepared statement,这样可以为具体的查询的执行做好准备,避免了分析、编译、优化的循环,将减少资源占用率,从而提高运行效率。通过对数据库进行prepare操作,便会返回PDOStatement数据类型,从而在其基础上展开execute、fetch等进一步的操作。
使用prepared statement还可以防止SQL注入。查询语句里可以使用包含命名(:name)和问号(?)的参数占位符,分别将用associated array 和indexed array传入数值。
代码示例:

<?php
header("Content-type: text/html; charset=utf-8");

$dbType = 'mysql';
$dbUser = 'root';
$dbPass = 'simael';
$dbhost = 'localhost';
$dbName = 'pdotest';
$dsn="$dbType:host=$dbhost;dbname=$dbName";
try{
    $pdo = new PDO($dsn, $dbUser, $dbPass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';")); 
    echo "PDO成功连接MySQL数据库!<br>";
}catch(PDOException $exception){
    echo $exception->getMessage();
}
$pdo->query('set names utf8');

$name = '';
$text = '';

// 用问号占位符传入参数 
$stmt = $pdo->prepare("INSERT INTO users (name, text) VALUES (?, ?)");
//$stmt->bindParam(1, $name); // 这里只能传入变量,不能是常量例如 $stmt->bindParam(1, 'simael'); 报错
//$stmt->bindParam(2, $text);

$stmt->bindValue(1, 'bindValue');
$stmt->bindValue(2, 'bindValue 's text');

$name = 'again name';
$text = 'again text text';
$stmt->execute();
//$stmt->execute(array('mike','mike text'));
// 用命名占位符传入参数
$stmt2 = $pdo->prepare("SELECT * FROM users WHERE name like :name");
//$stmt2->bindParam(':name',$name);
$stmt2->execute(array(':name'=>'%mike%'));

/*while($row = $stmt2->fetch(PDO::FETCH_ASSOC)){       
 print_r($row);    
 echo '<br>';
}*/ 

//print_r($stmt2->fetchAll(PDO::FETCH_BOTH));
//print_r($stmt2->fetchAll(PDO::FETCH_ASSOC));
print_r($stmt2->fetchAll(PDO::FETCH_OBJ));

注意注释的代码,都可以测试一下。
例如,我们使用问号占位符,通过bindParam()函数传入参数的时候,第二个参数必须是变量,想使用常量应当使用函数bindValue()
参见:
http://php.net/manual/zh/pdostatement.bindparam.php
http://php.net/manual/en/pdostatement.bindvalue.php
当然我们也可以直接在 execute()函数中直接传入参数。
上面的例子还包含了使用Pdo 的插入和查询操作,其它操作类似。

最后打印结果有多种方式:

$row=$dbh->fetchAll(PDO::FETCH_BOTH); //FETCH_BOTH是默认的,可省,返回关联和索引。
$row=$dbh->fetchAll(PDO::FETCH_ASSOC); //FETCH_ASSOC参数决定返回的只有关联数组。
$row=$dbh->fetchAll(PDO::FETCH_NUM); //返回索引数组
$row=$dbh->fetchAll(PDO::FETCH_OBJ); //如果fetch()则返回对象,如果是fetchall(),返回由对象组成的二维数组

错误处理:
静默模式(默认模式)

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT); //不显示错误

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);//显示警告错误,并继续执行

$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//产生致命错误,PDOException

事务:

try{
$dbh->beginTransaction();    
$dbh->exec("Insert INTO `test`.`table` (`name` ,`text`)VALUES ('mick', 'text1');");    
$dbh->exec("Insert INTO `test`.`table` (`name` ,`text`)VALUES ('lily', 'text2');");   
$dbh->exec("Insert INTO `test`.`table` (`name` ,`text`)VALUES ('susan', 'text3');");    
$dbh->commit();   
 } catch (Exception $e) {    
$dbh->rollBack();    
echo "Failed: " . $e->getMessage();    
 } 

使用pdo 建立一个持久连接:

<?php
$db = new PDO('mysql:host=localhost;dbname=testpdo', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>

持久的连接能够跨越代码,在一个代码执行完毕时并未被关闭,而是被缓存起来,
以供另一段拥有同样权限的代码重复使用。这样便不必每次都新建一个连接,省了不少事不说,还能够加快网站速度。

$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('n').length;
var $numbering = $('

    ').addClass('pre-numbering').hide();
    $(this).addClass('has-numbering').parent().append($numbering);
    for (i = 1; i <= lines; i++) {
    $numbering.append($('
  • ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

此文章通过 python 爬虫创建,原文是自己的csdn 地址: php pdo 简单使用 (二)