随着php的快速发展与应用,php需要支持mysql,mssql,oracle等多种数据库,这个时候就需要一个跨数据库平台的统一接口。于是就有了“数据库抽象层”,把数据库连接与数据处理业务区分开,不管是什么数据库,都可以使用一样的接口。
PDO的安装
PDO类库是PHP自带的库,只需要把php.ini中的相关注释符号去掉。
extension=php_pdo.dll extension=php_mysql.dll extension=php_mssql.dll
使用PDO操作MySQL
new $conn=new PDO('mssql:host=127.0.0.1;dbname=test','root','root');
1,连接数据库
下里巴人
$con=new PDO('mysql:host=192.168.138.129;dbname=sql','root','shy014');
阳春白雪
$username='root';
$password='shy014';
$sql='mysql';
$host='192.168.138.129';
$dbname='sql';
$dsn="$sql:host=$host;dbname=$dbname";
$con=new PDO($dsn,$username,$password);
2,使用PDO时的try catch错误处理结构
使用PDO的时候常伴随着PHP中的try catch异常处理机制。这样PDO可以配合其他的对象属性获得更多的信息。
连接数据库时出错处理
//故意将数据库的密码写错,会出现如下报错
<?php
$username='root';
$password='shy0141';
$dbms='mysql';
$host='192.168.138.129';
$dbname='sql';
$dsn="$dbms:host=$host;dbname=$dbname";
try {
$con=new PDO($dsn,$username,$password);
} catch (PDOException $e) {
echo "connect error message:".$e->getmessage();
}
?>
分析:catch (PDOException $e)使用了PDOException类,实例化了一个对象$e;使用了PDOException类抛出错误信息,如果有错误,就会立马终止程序并抛出错误。
执行SQL过程中出错处理
查询一个不存在的表
<?php
$username='root';
$password='shy014';
$dbms='mysql';
$host='192.168.138.129';
$dbname='sql';
$dsn="$dbms:host=$host;dbname=$dbname";
try {
$con=new PDO($dsn,$username,$password);
} catch (PDOException $e) {
echo "connect error message:".$e->getmessage();
}
$sql='select * from use1';
$con->exec($sql);
echo "sqlexec error message:".$con->errorcode();
print_r($con->errorinfo());
?>
执行结果:
分析:
PDO通过调用对象的exec()方法执行SQL语句:$con->exec($sql);
通过调用对象的errorcode()方法输出错误代码:$con->errorcode();
通过调用对象的errorinfo()方法输出报错的详细信息:$con->errorinfo();
3,使用PDO执行SQL的查询语句
PDO执行SQL的选择语句会返回结果对象。可以通过foreach来遍历对象内容。
<?php
$username='root';
$password='shy014';
$dbms='mysql';
$host='192.168.138.129';
$dbname='sql';
$dsn="$dbms:host=$host;dbname=$dbname";
try {
$con=new PDO($dsn,$username,$password);
} catch (PDOException $e) {
echo "connect error message:".$e->getmessage();
}
$sql="select * from user";
$result=$con->query($sql);
print_r($result);
foreach ($result as $row) {
$id=$row['id'];
$name=$row['name'];
$age=$row['age'];
echo "id is $id name is $name age is $age";
echo PHP_EOL;
}
echo "sqlexec error message:".$con->errorcode();
print_r($con->errorinfo());
?>
执行结果:
PDOStatement Object
(
[queryString] => select * from user
)
id is 1 name is wangxiaoming age is 32
id is 2 name is lilili age is 23
id is 3 name is fangfanfang age is 18
id is 4 name is liuxiaoyong age is 17
sqlexec error message:00000Array
(
[0] => 00000
[1] =>
[2] =>
)
[Finished in 1.4s]
分析:$sql定义了select语句,$con->query()实例化了的对象$con调用了类当中的query()方法,执行了SQL语句。foreach ($result as $row)语句以默认的方法获取$result这一返回数据对象的所有数据,并且以关联数组的形式表现出来。
4,使用PDO获取返回数据的类方法
fetch()方法
当使用select语句向数据库请求数据以后,query()方法会返回一个包含所有请求数据的对象。通过fetch()方法读取请求所返回的数据对象的一条记录。
<?php
$username='root';
$password='shy014';
$dbms='mysql';
$host='192.168.138.129';
$dbname='sql';
$dsn="$dbms:host=$host;dbname=$dbname";
try {
$con=new PDO($dsn,$username,$password);
} catch (PDOException $e) {
echo "connect error message:".$e->getmessage();
}
$sql="select * from user";
$result=$con->query($sql);
$resultnum=$result->rowcount();
echo "一共有'$resultnum'个人";
echo PHP_EOL;
while ($row=$result->fetch(PDO::FETCH_OBJ)) {
$id=$row->id;
$name=$row->name;
$age=$row->age;
echo "id is $id name is $name age is $age";
echo PHP_EOL;
}
echo "sqlexec error message:".$con->errorcode();
print_r($con->errorinfo());
?>
运行结果:
一共有'4'个人
id is 1 name is wangxiaoming age is 32
id is 2 name is lilili age is 23
id is 3 name is fangfanfang age is 18
id is 4 name is liuxiaoyong age is 17
sqlexec error message:00000Array
(
[0] => 00000
[1] =>
[2] =>
)
[Finished in 1.4s]
分析:$row=$result->fetch(PDO::FETCH_OBJ)语句直接以对象的方式取得$result的一条记录并赋值给$row。然后利用while循环按照输出格式进行打印
$result->fetch(PDO::FETCH_OBJ)将查询结果中的一条数据变成对象赋值给$row。然后使用while循环一条一条的把所有查询结果都打印出来。
fetchAll()方法
$rowall=$result->fetchAll():获取$result的所有记录。
fetchAll()方法获取到的结果为数字数组和关联数组。
<?php
$username='root';
$password='shy014';
$dbms='mysql';
$host='192.168.138.129';
$dbname='sql';
$dsn="$dbms:host=$host;dbname=$dbname";
try {
$con=new PDO($dsn,$username,$password);
} catch (PDOException $e) {
echo "connect error message:".$e->getmessage();
}
$sql="select * from user";
$result=$con->query($sql);
$resultall=$result->fetchall();
foreach ($resultall as $row) {
$id=$row[0];
$name=$row['name'];
$age=$row[2];
$male=$row[3];
echo "id is $id name is $name age is $age male shi $male";
echo PHP_EOL;
}
echo "sqlexec error message:".$con->errorcode();
print_r($con->errorinfo());
?>
运行结果:
分析:
$result=$con->query($sql);将查询结果保存在$result当中
$resultall=$result->fetchall();调用fetchall方法将查询结果全部变成数组
foreach ($resultall as $row) { 然后使用foreach遍历这个数组。
$id=$row[0];
5,使用PDO执行SQL的添加、修改语句