PDO 对数据库的增删改查操作

2015-06-04 17:45:06   最后更新: 2015-06-04 17:53:28   访问数量:1822




预处理 SQL 操作(prepare)可以参看:

PDO 的事务操作与预处理语句

 

<?php $rs = $db->prepare("SELECT * FROM foo"); $rs->execute(); while($row = $rs->fetch()){ print_r($row); } ?>

 

 

预处理语句是一个非常有用的特性,常常用在一系列语句的连续执行,通过参数的变化获取不同的结果

 

<?php public function exec ( string $statement ); ?>

 

exec 函数用来执行一条 SQL 语句,返回受此语句影响的行数

 

由于他并不会返回一条 select 语句的查询结果,因此 exec 函数一般用于执行 insert、delete 和 update 操作

 

<?php $dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2'); /* 删除 FRUIT 数据表中满足条件的所有行 */ $count = $dbh->exec("DELETE FROM fruit WHERE colour = 'red'"); /* 返回被删除的行数 */ print("Deleted $count rows.\n"); ?>

 

 

方法

query 方法有以下几种调用方法

<?php // 执行 SQL 语句,返回查询结果 public function query ( string $statement ); // 返回所需的列 public function query ( string $statement , PDO::FETCH_COLUMN , int $colno ); // 返回一个所请求类的新实例,映射列到类中对应的属性名 public function query ( string $statement , PDO::FETCH_CLASS , string $classname , array $ctorargs ); // 更新一个请求类的现有实例,映射列到类中对应的属性名 public function query ( string $statement , PDO::FETCH_INTO , object $object ); ?>

 

返回一个 PDOStatement 对象,出错返回 false

 

第一种方式是单独调用的常用方式

而最后的两种方式则一般用在 ORM 中,比如 doctrine 的 entity 类对象作为参数,将查询结果返回至类对象对应的成员,而如果这个成员不存在,则会自动调用类对象的 __set 魔术方法

 

属性配置

可以在 query 执行前通过调用 setAttribute 方法设定函数的返回方式

query 函数执行前可设置的执行属性
属性意义
PDO::ATTR_CASE允许 PDO::CASE_* 的常量强制列名为指定的大小写
PDO::CASE_LOWER强制列名是小写
PDO::CASE_NATURAL列名按照原始的方式
PDO::CASE_UPPER强制列名为大写

 

也可以通过 setFetchMode 方法设置结果集的返回值类型

query 返回结果集类型
属性意义
PDO::FETCH_ASSOC关联数组形式
PDO::FETCH_NUM数值索引形式
PDO::FETCH_BOTH两种数组形式兼具
PDO::FETCH_OBJ以对象形式返回

默认情况下是 PDO::FETCH_BOTH,一般我们采用 PDO::FETCH_ASSOC

 

foreach

最简单的调用方式如下:

<?php function getFruit($conn) { $sql = 'SELECT name, color, calories FROM fruit ORDER BY name'; foreach ($conn->query($sql) as $row) { print $row['name'] . "\t"; print $row['color'] . "\t"; print $row['calories'] . "\n"; } } ?>

 

 

fetch

当然我们也可以接收 query 返回的 PDOStatement 对象并执行该对象的相应操作获取结果

 

<?php $rs = $db->query('select * from foo'); while($row = $rs->fetch()){ print_r($row); } ?>

 

 

fetchColumn

fetchColumn 方法用来返回某一列的值,参数是可选的,表示列的序号,默认为 0

<?php $rs = $db->query("SELECT COUNT(*) FROM foo"); $col = $rs->fetchColumn(0); echo $col; ?>

 

 

fetchAll

你也可以直接获取保存全部输出数据的数组

<?php $rs = $db->query('select * from foo'); $data = $rs->fetchAll(); ?>

 

 

fetchObject

fetchObject 则是以对象的方式返回,他是 PDO::FETCH_CLASS 或 PDO::FETCH_OBJ 风格的替代方式

 

nextRowset

也可以通过“下一行推进”的方式获取返回的数据

<?php $sql = 'CALL multiple_rowsets()'; $stmt = $conn->query($sql); $i = 1; do { $rowset = $stmt->fetchAll(PDO::FETCH_NUM); if ($rowset) { printResultSet($rowset, $i); } $i++; } while ($stmt->nextRowset()); function printResultSet(&$rowset, $i) { print "Result set $i:\n"; foreach ($rowset as $row) { foreach ($row as $col) { print $col . "\t"; } print "\n"; } print "\n"; } ?>

 

 

查看影响的行数 -- rowCount

exec 函数直接返回上一条语句影响的条数,那么 query 操作如何获取这个数值呢?

query 或 execute 操作后,可以调用 rowCount 返回由对应的 PDOStatement 对象执行DELETE、 INSERT、或 UPDATE 语句受影响的行数

如果上一条语句是 select 语句,则返回的数值依赖于具体的实现

 

<?php <?php /* 从 FRUIT 数据表中删除所有行 */ $del = $dbh->prepare('DELETE FROM fruit'); $del->execute(); /* 返回被删除的行数 */ print("Return number of rows that were deleted:\n"); $count = $del->rowCount(); print("Deleted $count rows.\n"); ?> ?>

 

 

返回结果集中的列数  -- columnCount

<?php $dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2'); $sth = $dbh->prepare("SELECT name, colour FROM fruit"); /* 计算一个(不存在)的结果集中的列数 */ $colcount = $sth->columnCount(); print("Before execute(), result set has $colcount columns (should be 0)\n"); $sth->execute(); /* 计算结果集中的列数 */ $colcount = $sth->columnCount(); print("After execute(), result set has $colcount columns (should be 2)\n"); ?>

 

 

获取上一次 insert 操作插入数据的ID -- lastInsertId

<?php try { $dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $dbh->prepare("INSERT INTO test (name, email) VALUES(?,?)"); try { $dbh->beginTransaction(); $tmt->execute( array('user', 'user@example.com')); $dbh->commit(); print $dbh->lastInsertId(); } catch(PDOExecption $e) { $dbh->rollback(); print "Error!: " . $e->getMessage() . "</br>"; } } catch( PDOExecption $e ) { print "Error!: " . $e->getMessage() . "</br>"; } ?>

 

 

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤

 






sql      database      龙潭书斋      技术分享      exec      db      oop      oo      pdo      orm      技术贴      data      pdostatement      fetch      fetchall      query     


京ICP备15018585号