Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->PHP4/PHP5 ->正文

PHP 5 数据对象 (PDO) 抽象层与 Oracle

来源: ORACLE 作者:webmaster 时间:2007-04-16 点击: [收藏] [投稿]

$stmt = $dbh->prepare("INSERT INTO CREDITS (extension, name) VALUES (:extension, :name)");

预处理了语句之后,我们使用 bindParam() 方法来将这些命名参数分别与 PHP 变量名称“$extension”和“$name”相关联(这与 ocibindbyname() 类似)。我们还会通知 Oracle,这些数据将要格式化为字符串,最大长度为 64 个字符。

$stmt->bindParam(':extension', $extension, PDO_PARAM_STR, 64);
$stmt->bindParam(':name', $name, PDO_PARAM_STR, 64);

我们现在即准备好插入数据了 - 我们只需要打开该 CSV 文件,并从中获取数据即可。通过使用 fopen()fgetcsv() 函数可以相当简单地完成此操作。然后,我们可以使用 PHP list() 构造函数直接将 CSV 的列指定给变量“$extension”和“$name”。因为这些变量已经绑定到了语句中,所以我们现在要做的只是调用该语句对象的 execute() 方法使其执行插入。这种方式既方便又快捷 - 在事务处理时每个迭代循环只有两行。到达文件尾时,我们就可以立即使用数据库句柄的 commit() 方法来提交这些更改了。

如果您只是要传递输入参数,并且有许多这样的参数要传递,那么您会觉得下面所示的快捷方式语法非常有帮助;此语法使您能够省去对 $stmt->bindParam() 的调用。

$stmt = $dbh->prepare("INSERT INTO CREDITS (extension, name) VALUES (:extension, :name)");
$stmt->execute(array(':extension' => $extension, ':name' => $name));

您还可以使用 bindParam 来为存储过程设置输入/输出参数;语法是完全相同的,只是查询有所不同。下面的代码演示怎么样调用一个名为“sp_add_item”的存储过程;其目的是要针对输入设置 $item_name,然后该存储过程将在返回时更新 $error_code

$stmt = $dbh->prepare("begin sp_add_item(:item_name, :error_code); end");
$stmt->bindParam(':item_name', $item_name, PDO_PARAM_STR, 12);
$stmt->bindParam(':error_code', $error_code, PDO_PARAM_STR, 12);
$stmt->execute();

抓取数据

使用 PDO 抓取数据与进行插入或更新相似,只是您执行完查询之后,将要重复调用 fetch() 方法来获取结果集的下一行。进行获取的最简单情况如下所示,值得注意的一点是,您还可以将参数绑定到查询,以控制如 WHERE 子句这样的内容;执行此操作的语法与我们已经看到的 bindParam() 代码完全相同。

$stmt = $dbh->prepare("SELECT extension, name from CREDITS");
if ($stmt->execute()) {
while ($row = stmt->fetch()) {
print_r($row);
}
}

PDO 支持一些不同的抓取策略,这些策略在方便性和性能方面有所差别;通过将下列选项之一指定为 fetch() 方法的参数,您可以更改其返回值以适应您的语法:

  • PDO_FETCH_NUM - 每个行抓取返回一个按照列位置索引的数组,并且以 0 为基数(第一列是第 0 个元素)。 while ($row = $stmt->fetch(PDO_FETCH_NUM)) {
    printf("Extension %s, by %s<br>", $row[0], $row[1]);
    }
  • PDO_FETCH_ASSOC - 每个行抓取根据行集中的列名,返回一个按列名索引的数组。 while ($row = $stmt->fetch(PDO_FETCH_ASSOC)) {
    echo "Extension $row[EXTENSION] by $row[NAME]<br>";
    }
  • PDO_FETCH_BOTH - 每个行抓取返回一个既按照列位置又按照列名索引的数组。也就是上述两种情况的直接组合。如果没有指定抓取模式,则该模式为默认模式。
  • PDO_FETCH_OBJ - 每个行抓取返回一个匿名对象,其属性名与列名对应。 while ($row = $stmt->fetch(PDO_FETCH_ASSOC)) {
    echo "Extension {$row->EXTENSION} by {$row->NAME}<br>";
    }
  • PDO_FETCH_LAZY - 每个行抓取返回一个引用语句对象的重载对象。这“看起来”好像是 PDO_FETCH_OBJPDO_FETCH_BOTH 的组合,只是只有当您在脚本中访问 PHP 变量时才创建这些变量。
  • PDO_FETCH_BOUND - 抓取每行,返回 TRUE。在使用绑定输出列时这种方式非常有用,它可以避免创建不需要的任何数组或对象。(请参见下面的示例)。
无论您使用哪种抓取策略,当没有其他行可抓取时,fetch() 方法将会返回 FALSE。

现在我要讲述一些技巧,如果您需要最后再调整一下脚本性能的话,这些技巧可能会对您有所帮助。但先给你一个忠告:要像躲避瘟疫一样避免不成熟的优化。您应该总是首选最清晰、可维护性最好的解决方案。请记住,在一个典型的 Web 应用程序中,您不能衡量各种抓取模式间的区别,除非脚本要处理很多行。我再重复一遍:抓取模式间的性能区别非常小 - 请使用最适合您代码的模式。

请记住,使用 PDO_FETCH_NUM 的花销最小,因为访问列数据只是一个简单的数值查询。PDO_FETCH_OBJ

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:可扩展 可伸缩的 Oracle 与 PHP   下一篇:来自PHP.NET的入门教程

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号