利用PHP创建由Oracle驱动的SOAP服务
2009-01-06 13:10:21 来源:WEB开发网创建BookManager 类
现在,您已经熟悉了用 PHP 实施 SOAP 服务的所有内容,下面我们来讨论数据库。出于本手册的需要,我创建了一个名为 BookManager 的类。该类的作用将与前面示例中的 math 类相同,除了要与数据库进行交互,并提供一个 SOAP 服务,以允许您执行一般维护并查询本教程开头描述的书籍表。具体而言,BookManager 类将实施以下要公开为 SOAP 调用的方法:
addBook($isbn, $author, $title, $price); // Adds a Book to the database
delBook($isbn); // Deletes a book by ISBN number
findBookISBNByAuthor($author); // Returns an array of ISBN numbers of books written by a
// specific author
findBookISBNByTitle($title); // Returns an array of ISBN numbers of books whose title
// matches the substring provided
getBookByISBN($isbn); // Returns the details of the book identified by ISBN
listAllBooks(); // Returns an array of all ISBN numbers in the database
尽管该类本身有其他几个方法,但只有上述六个方法是声明的公共方法(当然,除了构造函数以外),因而也是仅有的公开为 SOAP 服务的方法。虽然详细说明每个方法会超出本教程讨论范围(特别是它们在形式上基本相同),但出于完整性需要,我们来看一下 delBook() 方法: /**
* Delete a book from the database by ISBN
*
* @param string $isbn The ISBN serial number of the book to delete
*
* @return mixed SOAP Fault on error, true on success
*/
public function delBook($isbn) {
$query = "DELETE FROM books
WHERE isbn = :isbn";
$stmt = oci_parse($this->getDB(), $query);
if(!$stmt) {
throw new SoapFault(-1, "Failed to prepare query (reason: " .
oci_error($stmt) . ")");
}
oci_bind_by_name($stmt, "isbn", $isbn, 32);
if(!oci_execute($stmt)) {
oci_rollback($this->getDB());
throw new SoapFault(-1, "Failed to execute query (reason: " .
oci_error($stmt) . ")");
}
oci_commit($this->getDB());
return true;
}
对于那些熟悉用于 PHP 的 Oracle API 的开发人员来说,上述方法应该很简单。对于其余开发人员来说,我们从 oci_parse() 方法开始来探究该函数的某些关键点。该方法以字符串的形式接受 SQL 查询(如果需要,在查询中包含每个变量的占位符),然后返回表示该查询的语句资源。在这里,该语句资源的占位符可以通过 oci_bind_by_name() 方法直接映射到 PHP 变量,该方法将接受语句、占位符名称、对应的 PHP 变量以及可选的当前最大列长度作为参数。一旦 PHP 将每个占位符绑定到一个 PHP 变量,就可以执行语句并获得结果了。当然,由于该操作是一个针对表的 write 操作,您可以通过将更改提交到数据库并返回成功状态,来成功完成函数执行。
为便于参考,下面是一个完整的 BookManager 类,以及使用该类公开 SOAP 服务的相应服务器脚本。
更多精彩
赞助商链接