什么是PDO
- PDO就是一个数据库访问抽象层,作用是统一各种数据库的访问接口,能够轻松的在不同数据库之间进行切换
- 对于不同的数据库,PDO并不是通过PDO扩展本身来执行的,必须针对不同的数据库服务器使用特定的PDO驱动程序访问,切换数据库,只需要重新加载PDO驱动程序就可以了,以下是不同数据库的PDO驱动程序名称表
创建PDO对象
- 在使用构造方法创建PDO对象时,需要指定数据库服务器进行连接
- 第一个参数是数据源名(DSN),用来定义一个确定的的数据库和必须用到的驱动程序,DSN的PDO命名惯例为PDO驱动程序的名称,后面为一个冒号,在后面是可选的驱动程序的数据库连接变量信息,如主机名、端口、数据库名
- 第二个参数为连接数据库的用户名和密码,最后一个参数需要指定一个数组,从来指定连接所需的额外选项 ,传递附加调优的参数到PDO或底层驱动程序
以多种方式调用构造方法
- 利用数据库名称和主机名,连接MySQL数据库
<html>
<head><title>云端留言板</title></head>
<body>
<?php
$dsn="mysql:dbname=siqu;host=127.0.0.1";
$username="siqu";
$password="siqu123";
try{
$pdo_object=new PDO($dsn,$username,$password);
echo "连接成功";
}catch(PDOException $e){
echo "连接失败".$e->getMessage();
}
?>
</body>
</html>
- 将参数存放在文件中,并在构造函数中引用
- 引用php.ini文件
- 将DSN信息赋值给一个pdo.dsn.aliasname的配置参数,aliasname是构造函数中DSN的别名,在调用构造方法时,在第一个参数中使用别名即可
- PDO与连接有关的选项,将这些选项传递到构造方法的第四个参数中,附加调优参数
PDO对象中的成员方法
使用PDO对象
调整PDO的行为属性
- getAttribute():该方法只需要提供一个参数,传递一个参数的属性名称,如果成功执行,则返回该属性所指定的值
- setAttribute():第一个参数:属性名,第二个参数:属性值,
处理PHP程序和数据库之间的数据类型转换
PDO在某种程度上是对数据类型不可知的,因此它将任何数据都表示为字符串,如果集合资源中包含一个NULL值的数据,除了oracle与MySQL以外,其他的数据库都不会将空字符串转换为NULL,因此PDO提供了一个程序级属性PDO_ATTR_ORACLE_NULLS,该属性默认为False,设置为True后,会模拟这个行为,将空字符串转换为NULL值
PDO的错误处理
- PDO::ERRMODE_SILENT:默认模式,在发生错误时不会进行任何操作,PDO将只设置错误代码,开发人员可以通过errorCode()和errorInfo()方法对语句和数据库对象进行检查
- PDO::ERRMODE_WARNING:可以使常规的PHP错误处理程序捕获该警告
- PDO::ERRMODE_EXCEPTION:PDO会抛出一个PDOException,并设置,以反映错误代码和错误信息
使用PDO执行SQL语句
-
PD0::exec()方法,该方法主要应用于没有select语句的情况下,成功执行后,返回受影响的行数,
-
PD0::query()方法,该方法主要用于select语句,成功执行后,返回一个PDOStatent对象,如果想要了解获取数据总行数,则可以使用PDOStatement对象当中的rowCount()方法获得
<html> <head><title>使用PDO</title></head> <body> <?php $dsn="mysql:dbname=siqu;host=127.0.0.1"; $username="siqu"; $password="siqu123"; try{ $pdo_object=new PDO($dsn,$username,$password); echo "连接成功"."<br/>"; }catch(PDOException $e){ echo "连接失败".$e->getMessage(); } $select="select * from users"; #运行sql语句 $pdoStatement_object=$pdo_object->query($select); #输出结果 foreach ($pdoStatement_object as $row) { echo "id:".$row["id"]."<br/>"; echo "username:".$row["username"]."<br/>"; } ?> </body> </html>
-
可以使用PDO过滤掉一些特殊字符,可以使用quote()方法来实现
PDO对预处理语句的支持
- 在有的时候,PHP经常会执行除了参数以外,其他部分都相同的SQL语句,对于这种情况PDO提供了一种名为预处理语句的机制,能够大大节省开销,提高速度
了解PDOStatement对象
- 该对象不是通过NEW关键字实例化出来的,而是通过prepare()方法返回得来的,与query()语句不同的是,query()语句返回的PDOStatement对象只是一个结果集对象,而prepare()方法返回的PDOStatement对象则能定义和执行参数化的SQL命令,
准备语句
- 使用占位符来替代具体的参数数据,先让PDO进行预处理,
- 命名参数作为占位符的INSERT查询如下:
2.使用“?”作为占位符
绑定参数
- 通过PDOStatement对象方法bindParam()方法来绑定参数替换占位符
- 第一个参数是必选项,如果使用名称参数,那么将名称字符串作为第一个参数提供,如果是问号占位符,则使用索引偏移量,索引偏移量从1开始,按整数方式递增
- 第二个参数也是必选项,提供给所指定占位符的值,由于该参数是按引用传递的,所以不能给具体的数值
- 第三个参数是可选项,显示的为当前绑定的参数设置数据类型
- 第四个参数length是可选项,用于指定数据类型的长度
- 第五个参数是driver_options是可选项,通过该参数提供任何数据库驱动程序特定的选项
执行准备好的语句
- 在绑定参数之后,使用PDOStatement对象的extcute()方法,执行语句即可
PDO应用
";
}catch(PDOException $e){
echo "连接失败".$e->getMessage();
}
#设置预处理语句
$pdostatement_object=$pdo_object->prepare("INSERT INTO users (username) VALUES (?)");
$name_array=array("ling","li","yang","wang");
for($i=0;$ibindParam(1,$name);
#设置参数内容
$name=$name_array[$i];
#执行语句
$pdostatement_object->execute();
}
echo "执行完成";
?>
- 如果有多个占位符需要输入,那么可以使用索引数组的方式进行,省去绑定环节
PDO应用
";
}catch(PDOException $e){
echo "连接失败".$e->getMessage();
}
#设置预处理语句
$pdostatement_object=$pdo_object->prepare("INSERT INTO user (name,age) VALUES (?,?)");
#执行语句,如果使用命名参数,则使用关联索引,如:"name"=>"siqu"
#如果使用问号占位符,则一一对应即可
$pdostatement_object->execute(array("siqu",25));
$pdostatement_object->execute(array("yang",34));
echo "执行完成";
?>
获取数据
- fetch()方法,PDOStatement类中的fetch()方法,可以将结果集中当前记录以某种方式返回,并将指针移向下一行,当达到末尾时返回False
- 第一个参数设置
- 第二个参数,可选,用来确定当对象是一个可滚动的游标时应该获取哪一行
- 第三个参数,可选,提供一个整数,表示要获取的行相对于当前游标位置的偏移
PDO应用
";
}catch(PDOException $e){
echo "连接失败".$e->getMessage();
}
#设置预处理语句
$pdostatement_object=$pdo_object->query("SELECT * FROM user");
while($array=$pdostatement_object->fetch(PDO::FETCH_NUM)){
echo "id:".$array[0]."
";
echo "name:".$array[1]."
";
echo "age:".$array[2]."
";
}
// 运行结果:
// 连接成功
// id:1
// name:siqu
// age:25
// id:2
// name:yang
// age:34
?>
- fetchAll(),只需要调用一次,就获取所有行,返回一个二维数组
- 第一个参数,与上一个函数一直
- 第二个参数,需要提供一个整数索引,当在fetchALL中第一个参数指定PDO::FETCH_COLUMN值时,从结果集中返回通过该参数提供的索引所指定列的所有值
PDO应用
";
}catch(PDOException $e){
echo "连接失败".$e->getMessage();
}
#设置预处理语句
$pdostatement_object=$pdo_object->query("SELECT * FROM user");
$array=$pdostatement_object->fetchAll(PDO::FETCH_NUM);
foreach ($array as $key => $value) {
echo "id:".$array[$key][0]."
";
echo "name:".$array[$key][1]."
";
echo "age:".$array[$key][2]."
";
}
// 运行结果:
// 连接成功
// id:1
// name:siqu
// age:25
// id:2
// name:yang
// age:34
?>
- setFetchModel()方法,一次性设置以上两个函数的输出模式
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容