15.php数据库抽象层PDO(四)

不管是使用PDO对象中的query()方法,还是使用prepare()和execute()等方法结合的预处理语句,执行select查询都会得到相同的结果集对象PDOStatement.都需要通过PDOStatement类对象中的方法将数据遍历出来。

1. 获取数据

1.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: 使用fetch()返回TRUE, 并将截取的列值赋给在bindParam()方法中指定的相应变量
  • PDO::FETCH_LAZY: 创建关联数组和索引数组,以及包含列属性的一个对象,从而可以在这三种接口中任选一种

第三种参数cursor_orientation是可选项,用来确定当对象是一个可滚动的游标时应当获取哪一行
第三个参数cursor_offset可选项,需要提供一个整数值,表示要获取的行相对于当前游标位置的偏移

<?php
try{
    $dbh = new PDO('mysql:dbname=testdb;host=localhost','mysql_user', 'mysql_pwd');
}catch(PDOException $e){
    echo '数据库连接失败:'.$e->getMessage();
    exit;
}

echo '<table border="1" align="center" width=90%>';
echo '<caption><h1>联系人信息表</h1></caption>';
echo '<tr bgcolor="#ccc">';
echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th></tr>';

//使用query方式执行select语句,建议使用prepare()和execute()形式执行语句
$stmt = $dbh->query("SELECT uid,name,address,phone,email FROM contactInfo");

//以PDO::FETCH_NUM形式获取索引并遍历
while(list($uid, $name, $address, $phone, $email) = $stmt->fetch(PDO::FETCH_NUM)){
    echo '<tr>';
    echo '<td>'.$uid.'</td>';
    echo '<td>'.$name.'</td>';
    echo '<td>'.$address.'</td>';
    echo '<td>'.$phone.'</td>';
    echo '<td>'.$email.'</td>';
    echo '</tr>';
}

echo '</table>';

1.2 fetchAll()方法

只需要调用一次就可以获取结果集中的所有行,并赋给返回的数组(二维).

fetchAll([int fetch_style [,int column_index]]) //一次调用返回结果集中所有行

  • 第一个参数fetch_style是可选项,以何种方式引用所获取的列取决于该参数。默认值为PDO::FETCH_BOTH,可用值和fetch()中的列表相同,还可以指定PDO::FETCH_COLUMN值,从结果集中返回一个包含单列的所有值
  • 第二个参数column_index可选,需要提供一个整数索引,当在fetchAll()方法的第一个参数中指定PDO::FETCH_COLUMN值时,从结果集中返回通过该参数提供的索引所指定的所有值。
<?php
try{
    $dbh = new PDO('mysql:dbname=testdb;host=localhost','mysql_user', 'mysql_pwd');
}catch(PDOException $e){
    echo '连接数据库失败:'.$e->getMessage();
    exit;
}


echo '<table border="1" align="center" width=90%>';
echo '<caption><h1>联系人信息表</h1></caption>';
echo '<tr bgcolor="#ccc">';
echo '<th>UID</th><th>姓名</th><th>联系地址</th><th>联系电话</th><th>电子邮件</th></tr>';

//使用query方式执行select语句,建议使用prepare()和execute()形式执行语句
$stmt = $dbh->prepare("SELECT uid,name,address,phone,email FROM contactInfo");
$stmt->execute();
$allRows = $stmt->fetchAll(PDO::FETCH_ASSOC);
f

foreach($allRows as $row){

    echo '<tr>';
    echo '<td>'.$row['uid'].'</td>';
    echo '<td>'.$row['name'].'</td>';
    echo '<td>'.$row['address'].'</td>';
    echo '<td>'.$row['phone'].'</td>';
    echo '<td>'.$row['email'].'</td>';
    echo '</tr>';
}
while(list($uid, $name, $address, $phone, $email) = $stmt->fetch(PDO::FETCH_NUM)){
    echo '<tr>';
    echo '<td>'.$uid.'</td>';
    echo '<td>'.$name.'</td>';
    echo '<td>'.$address.'</td>';
    echo '<td>'.$phone.'</td>';
    echo '<td>'.$email.'</td>';
    echo '</tr>';
}

echo '</table>';

//fetchAll()方法中使用两个特别参数的示例
$stmt->execute();   //再一次执行准备好的select语句
$row = $stmt->fetchAll(PDO::FETCH_COLUMN,1);    //从结果集中获取第二列的所有值
echo '所有联系人的姓名';
print_r($row);

1.3 setFetchMode()方法

PDOStatement对象中的fetch()和fetchAll()方法,获取结果集数据的引用方式默认都是一样的:PDO::FETCH_BOTH。但是如果使用多次这两个方法,每次调用时需要设置新的模式来改变默认的模式。PDOStatement类对象中的setFetchMode()方法,在脚本页面的顶部设置一次模式,以后所有fetch()和fetchAll()方法的调用都将生成相应引用的结果集,减少了多次调用fetch()方法时的参数录入

1.4 bindColumn()方法

该方法可以将一个列和一个指定的变量名绑定,这样在每次调用fetch()方法获取各行记录时,会自动将相应的列值赋给该变量,但必须是在fetch()方法的第一个参数设置为PDO::FETCH_BOTH值时。

bindColumn(mixed column, mixed &param [,int type]) //设置绑定列值到变量上

  • 第一个参数column是必须,可以使用整数的列偏移位置索引(索引值以1开始),或是列的名称字符串。
  • 第二个参数param也是必选项,需要传递一个引用,所以必须提供一个相应的变量名。
  • 第三个参数type是可选项,通过设置变量的类型来限制变量值。该参数支持的值和介绍bindParam()方法时提供的一样。
<?php
try{
    $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
    echo '数据库连接失败:'.$e->getMessage();
    exit;
}

//声明一个select查询,从表contactInfo中获取D01部门的四个字段信息
$query = "SELECT uid, name, phone, email FROM contactInfo WHERE departmentId='D01'";
try{
    $stmt = $dbh->prepare($query);
    $stmt->execute();
    $stmt->bindColumn(1, $uid);
    $stmt->bindColumn(2, $name);
    $stmt->bindColumn('phone', $phone);
    $stmt->bindColumn('email', $email);

    while($stmt->fetch(PDO::FETCH_BOUND)){
        echo $uid."\t".$name."\t".$phone."\t".$email."\n";
    }
}catch(PDOException $e){
    echo $e->getMessage();
}

1.5 获取数据列的属性信息

同时可以通过使用PDOStatement类对象的columnCount()方法获取数据表中字段的数量,并且可以通过PDOStatment类对象getColumnMeta()方法获取具体列的属性信息。


2. 大数据对象的存取

大数据对象可以是文本数据,也可以是二进制图片、电影等

PDO允许在bindParam()或bindColumn()调用中通过使用PDO::PARAM_LOB类型代码来使用大型数据类型。PDO::PARAM_LOB告诉PDO将数据映射为流,所以可以使用PHP中的文件处理函数来操纵这样的数据。

<?php
$dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');
$stmt = $dbh->prepare("INSERT INTO images(contenttype, imagedata) VALUES (?,?)");

$fp = fopen($_FILES['file']['tmp_name'], 'rb');//使用fopen打开上传的文件

$stmt->bindParam(1, $_FILES['file']['type']);//将上传文件的MIME类型绑定到第一个参数中
$stmt->bindParam(2, $fp, POD_PARAM_LOB);

$stmt->execute();

从数据库取一幅图像,并使用fpassthru()函数将给定的文件指针,从当前的位置读取到EOF并把结果写到输出缓冲区

<?php
$dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd');

$stmt = $dbh->prepare("SELECT contenttype, imagedata FROM images WHERE id=?");
$stmt->execute(array($_GET['id']));

list($type, $lob) = $stmt->fetch(); //获取结果集中的大数据类型和文件指针
header("Content-Type:$type");//将从表中读取的大文件类型作为合适的报头发送
fpassthru($lob);//发送图片并终止脚本

被选取的大型对象是一个文件流,可以通过所有常规的流函数来使用它。如fgets(),fread()或stream_get_contents()等文件处理函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值