首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》20.3 使用其他Web站点的数据

关灯直达底部

通过网络能实现的最重要的一件事就是可以在用户自己的页面中使用、修改和嵌入已有服务和信息。PHP使这些操作变得非常简单。下面,我们举例说明。

假设你所在的公司希望本公司的股票价格显示在公司的主页上。股票价格信息可以从证券交易所网站的某个地方获得——但是我们如何得到它呢?

首先,必须找到原始信息的URL。当获知该信息后,在每次有人进入你的网页时,可以打开指向该URL的连接,获取该网页,提取需要的信息。

作为一个例子,我们将在一个脚本中实现此功能,它能够从AMEX站点获取和重新格式化一支股票的价格信息。要实现本例的功能,我们必须从以上站点获得Amazon.com的股票价格(你要包含在网页中的信息可能与此不同,但原理是一样的)。

这里的示例代码将通过其他站点提供的Web服务器来获取数据,并显示在我们的站点上。

该脚本如程序清单20-1所示。

程序清单20-1 lookup.php——从NASDAQ获得$symbol列表所给出股票的报价脚本

<html>

<head>

<title>Stock Quote From NASDAQ</title>

</head>

<body>

<?php

//choose stock to look at

$symbol=/'AMZN/';

echo/'<h1>Stock quote for/'.$symbol./'</h1>/';

$url=/'http://finance.yahoo.com/d/quotes.csv/'.

/'?s=/'.$symbol./'&e=.csv&f=sl1d1t1c1ohgv/';

if(!($contents=file_get_contents($url))){

die(/'Failure to open/'.$url);

}

//extract relavant data

list($symbol,$quote,$date,$time)=explode(/',/',$contents);

$date=trim($date,/'/"/');

$time=trim($time,/'/"/');

echo/'<p>/'.$symbol./'was last sold at:/'.$quote./'</p>/';

echo/'<p>Quote current as of/'.$date./'at/'.$time./'</p>/';

//acknowledge source

echo/'<p>This information retrieved from<br/><a href=/"/'.$url.

/'/">/'.$url./'</a>.</p>/';

?>

</body>

</html>

以上程序清单的运行结果如图20-1所示。

图 20-1 该脚本通过一个正则表达式从来自证券交易所网站的信息中摘出股票报价

此脚本本身是非常简单的。事实上,该脚本并没有使用任何我们没有见到过的新函数,而只是那些函数的新应用。

回忆一下,在第2章“数据的存储与检索”中,当介绍如何从文件读信息时,我们提到过可以使用文件函数从URL中读取信息。这正是我们在这个例子中所实现的。调用函数file_get_contents:

if(!($contents=file_get_contents($url))){

将返回指定URL的Web页面所有内容,并且将其保存在$contents变量中。

在PHP中,文件函数可以完成许多操作。这里给出的例子只是通过HTTP载入一个Web页面,我们还可以通过HTTPS、FTP或其他协议以几乎相同的方式与其他服务进行交互。

对于某些任务,可能需要采用一些更特殊的方法。在特定的FTP函数中,还提供了一些FTP功能,但却无法通过fopen或其他函数使用。在本章稍后内容中,将介绍一个使用FTP函数的示例。对于某些HTTP或HTTPS任务,可能需要使用cURL库。通过cURL函数库,可以登录到一个Web站点并且在一些页面中模拟用户的操作。

在通过file_get_contents函数获得页面文本后,就可以使用list函数找到我们所需的网页部分:

list($symbol,$quote,$date,$time)=explode(/',/',$contents);

$date=trim($date,/'/"/');

$time=trim($time,/'/"/');

echo/'<p>/'.$symbol./'was last sold at:/'.$quote./'</p>/';

echo/'<p>Quote current as of/'.$date./'at/'.$time./'</p>/';

可以用上述方法实现各种目的。另一个很好的例子就是索取当地的天气信息并把它嵌入网页中。

这种方法的最佳应用是整合来自不同信息源的数据以增加其价值。一个著名的例子是Philip Greenspun的脚本使用了这种方法,此脚本产生了比尔・盖茨的财富时钟:http://philip.greenspun.com/。

此网页将分别从两个地方获取信息。首先,它将从U.S.Census Bureau的网址获得美国的当前人口数。然后,再查找Microsoft股票的当前市值,并结合这两条信息,添加一些作者的观点,产生一个新信息——Bill Gates目前财富的估计值。

需要注意的一点是:如果将外面的信息源(像在这个例子中)用于商业目的,最好先查看一下使用这个信息源的合法性。因为在一些情况下,需要考虑一些关于知识产权的问题。

如果要编写一个类似的脚本,可能还希望传输一些其他的数据。例如,如果要连接到一个外部URL,可能需要传输一些用户输入参数。如果打算这样做,使用函数urlencode是一个好主意。此函数将接受一个字符串并将其转换为适合URL的格式。例如,将空格转换为“+”符号。可以按如下方式调用此函数:

$encodedparameter=urlencode($parameter);

这种方法的问题是获得信息的源站点可能会改变其数据格式,这样就使脚本无法正常运行。