(1)exec
php手册中对其的描述是:执行一条 SQL 语句,并返回受影响的行数。
从中可以看出,execute可应用于“增删改查”中的增删改。因为查询操作会返回一个结果集,而exec函数只能返回受影响的函数。
(2)query
对应于“增删改查”中的“查”。用于执行一次的sql语句,返回一个PDOStatement结果集。此结果可认为是多维数组,可以直接使用。
(3)prepare
对于重复执行的语句,可以使用prepare作预处理(优化)。因为每次的查询语句执行之前都需要编译,通过prepare之后,可节省重复编译查询语句的开销。先prepare再execute。此时返回一个PDOStatement结果集,PDOStatement是一个对象,可以使用它的成员方法来处理结果集。视结果集类型的不同,也可直接将其作为多维数组使用。
如果prepare传入的sql语句是可变的话,可以通过bindParam来为其绑定参数,然后execute。
PS:prepare+execute的组合,可以适用于于“增删改查”所有的操作。
下面来看具体的使用例子:
<?php
$dsn = "mysql:dbname=pdo;host=localhost";
$user = "root";
$password = "root";
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//使用exec进行增删改
$sqlcmd = "insert into userinfo values (rand(),rand())";
$dbh->exec($sqlcmd);
//使用query进行查询操作
$sqlcmd = "select * from userinfo";
try {
$data = $dbh->query($sqlcmd);
foreach ($data as $row) {
print_r($row);
echo '<br>';
}
}
catch (PDOException $e) {
echo $e->getMessage();
}
//prepare先预处理,然后绑定参数,然后execute
$sqlcmd = 'select password from userinfo where username = :pname';
$res = $dbh->prepare($sqlcmd);
$puser_name = "aaa";
$res->bindParam(':pname', $puser_name, PDO::PARAM_STR, 200);
$res->execute();
foreach ($res as $row) {
print_r($row);
echo "<br>";
}
?>
这只是最基本的使用例子。一般来说,在具体的项目中都会使用一个PDO封装类,有的框架如zendframework还自带了数据库处理类。