PDO获取数据

zxh5566  2016-07-17 15:10   Hits: 

 
PDO的数据获取方法与其他数据库扩展都非常类似,只要成功执行SELECT查询,都会有结果集对象生成,不管是使用PDO对象中的query方法,还是使用prepare()和execute()等方法结合预处理语句,执行select查询都会得到相同的结果集对象PDOStatement,都需要通过该类对象中的方法将数据遍历出来。
 
1、fetch()
PDOStatement类中的fetch()方法可以将结果集中当前行的记录以某种方式返回,并将结果集指针移到下一行,当到达结果集末尾时返回FALSE,该方法的原型如下:
fetch([int fetch_style[,int cursor_orientation[,int cursor_offset]]]);
第一个参数fetch_style是必选,获取的一行数据记录中,各列的引用方式取决于这个参数如何设置,可以使用的设置有以下六种
PDO::FETCH_ASSOC
PDO::FETCH_NUM
PDO::FETCH_BOTH
PDO::FETCH_OBJ
PDO::FETCH_BOUND
PDO::FETCH_LAZY
第二个参数cursor_orientation是可选项,用来确定当对象是一个可滚动的游标时应当获取哪一行
第三个参数cursor_offset也是可选项,需要提供一个整数,表示要获取的行相对于当前游标位置的偏移。
在下面的示例中,使用PDO对象中的query()方法执行select查询,获取联系人信息表contactInfo中的信息,并返回PDOStatement类对象作为结果集,然后通过fetch()方法结合while循环遍历数据,并以html表格输出。代码如下:
<?php
echo '<table border="1" align="center" width="90%">';
echo '<caption><h1>联系人</h1></caption>';
echo '<tr bgcolor="#cccccc"'>;
echo '<th>UID</th><th>姓名</th><th>地址</th><th>电话</th></tr>';
$stmt = $dbh->query("select id ,name,address,phone from contactinfo");
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
echo '<tr>';
echo '<td>'. $row['id'] . '</td>';
echo '<td>'. $row['name'] . '</td>';
echo '<td>'. $row['address'] . '</td>';
echo '<td>'. $row['phone'] . '</td>';
echo '</tr>';
}
echo '</table>';
 
2、fetchAll()
 
fetchAll()方法与上一个方法类似,但是该方法只需要调用一次就可以获取结果集中的所有行,并赋给返回的数组,该方法原型如下:
fetchAll([int fetch_style[,int column_index]]);
第一个参数fetch_style是必选项,以何种方式引用所获取的列取决于该参数,默认值PDO::FETCH_BOTH,所有可以用的值可以参考在fetch()方法中介绍的第一个参数列表,还可以指定PDO::FETCH_COLUMN值,从结果集中返回一个包含单列的所有值。
第二个参数column_index是可选项,需要提供一个整数索引,当在fetchAll()方法的第一个参数中指定PDO::FETCH_COLUMN值,从结果集中返回通过该参数提供的索引所指定列的所有值。
<?php
echo '<table border="1" align="center" width="90%">';
echo '<caption><h1>联系人信息表</h1></caption>';
echo '<tr bgcolor="#cccccc"'>;
echo '<th>UID</th><th>姓名</th><th>地址</th><th>电话</th></tr>';
$stmt = $dbh->prepare("select uid,name,address,phone from contactinfo");
$stmt->execute();
$allRows = $stmt->fetchAll(PDO::FETCH_NUM);
foreach($allRows as $row){
echo '<tr>';
echo '<td>'. $row[0] . '</td>';
echo '<td>'. $row[1] . '</td>';
echo '<td>'. $row[2] . '</td>';
echo '<td>'. $row[3] . '</td>';
echo '</tr>';
}
echo '</table>';
$stmt->execute();
$row = $stmt->fetchAll(PDO::FETCH_COLUMN,1);
echo '所有联系人的姓名';
print_r($row);
 
?>
 
3、setFetchMode()
PDOStatemnet对象中的fetch()和fetchAll()两个方法,获取结果数据的引用方式默认都是一样的,即按列名索引又按列在行中的数值偏移索引的值数组,因为它们的默认模式都被设置为PDO::FETCH_BOTH值,如果计划使用其他模式来改变这个默认设置,可以在fetch(),fetchAll()方法中提供需要的模式参数,但如果多次使用这两个方法,在每次调用时都需要设置新的模式来改变默认的模式,这时就可以使用PDOStatement类对象中的setFetchMode()方法,在脚本页面的顶部设置一次模式,以后所有fetch()fetchAll()方法的调用都将生成相应的结果集,减少了多次在调用时的参数录入。
 
4、bindColumn()
使用该方法可以将一个列和一个指定的变量名绑定,这样在每次使用fetch()方法获取各行记录时,会自动将相应的列值赋给该变量,但必须是在fetch()方法的第一个参数设置为PDO::FETCH_BOTH值时,bindColumn()第一个参数为必选项,可以使用整数的列偏移位置索引,或是列的名称字符串,第二个参数也是必选项,需要传递一个引用,所以必须提供一个相应的变量名,第三个参数type是可选项,通过设置变量的类型来限制变量值,该参数支持的值和介绍bindParam()方法时提供的一样。
 
<?php
try{
$dbh = new PDO('mysql:dbname=testdb;host=localhost','mysql_user','mysql_pwd');
}catch(PDOException $e){
echo "数据库连接失败".$e->getMessage();
exit;
}
$query = "select uid,name,phone from contactinfo where departmentid = 'd01'";
try{
$stmt = $dbh->prepare($query);
$stmt->execute();
$stmt->bindColumn(1,$uid);
$stmt->bindColumn(2,$name);
$stmt->bindColumn(phone,$phone);
while($row = $stmt->fetch(PDO::FETCH_BOUND)){
echo $uid.'\t'.$name.'\t'.$phone.'\n';
}
}catch(PDOException $e){
echo $e->getMessage();
}
上一篇:PDO对预处理语句的支持
下一篇:PDO大数据对象的存取与PDO事务处理