2010年11月

ECgroupon加入城市天气预报功能

先看图

ECgroupon加入城市天气预报功能

最后能够实现天气随着城市的切换而切换。

首先group_city表加入字段

ALTER TABLE `ecs_group_city` ADD `weather` VARCHAR( 30 ) NOT NULL AFTER `city_sort` ;
ADD `temp` VARCHAR( 30 ) NOT NULL AFTER `weather` ,
ADD `image` VARCHAR( 30 ) NOT NULL AFTER `temp` ,
ADD `weather_time` INT( 10 ) NOT NULL AFTER `image`

weather是天气,temp是温度,image是天气图片,weather_time是天气的日期。新建目录/template/模板名字/images/weather。/includes/lib_group.php中添加以下函数。

/*
* 天气预报/tun/2010/11/11 棍节快乐 - -#
*/
function get_weather($city_id,$city_name)
{
$time=gmtime();
//先查询该城市天气是否过期
$sql="select * from ".$GLOBALS['ecs']->table('group_city')." where city_id='$city_id' and $time-weather_time< =86400";
$row=$GLOBALS['db']->getRow($sql);
if(!$row)//没有数据就到sina上去抓取
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://php.weather.sina.com.cn/search.php?c=1&city='.$city_name.'&dpc=1');
curl_setopt($curl, CURLOPT_REFERER, 'http://php.weather.sina.com.cn');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,0);
$data = curl_exec($curl);
$data=mb_convert_encoding($data,'utf-8','gb2312');
//print_r($data);
preg_match('/javascript:sent_to_vb\(\'(.*)\',\'(.*):(.*),(.*),(.*),(.*)\'\)/',$data,$weather_arr);
preg_match('/class=\"icon_weather\" style=\"background: url\((.*)\) 0 0/',$data,$weather_img);
$w=array();
$w['weather']=$weather_arr[3];
$w['temp']=str_replace('~',' / ',$weather_arr[4]);
$w['image']=substr($weather_img[1],strrpos($weather_img[1],'/')+1,str_len($weather_img[1])-strrpos($weather_img[1],'/'));
$w['weather_time']=gmstr2time(date('Y-m-d'));
$_CFG = load_config();
$template_dir=ROOT_PATH . 'template/' . $_CFG['formwork'];
if(!file_exists($filename=$template_dir.'/'.images.'/'.weather.'/'.$w['image']))
{ //本地不存在图片就去下载
$weather_img[1]=str_replace('180_180', '78_78',$weather_img[1]);
curl_setopt($curl,CURLOPT_URL,$weather_img[1]);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$img=curl_exec($curl);
$fp=fopen($filename,'w+');
fwrite($fp,$img);
fclose($fp);
}
curl_close($curl);
//更新天气信息
$GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('group_city'), $w, 'UPDADTE','city_id='.$city_id);
$w['city_name']=$weather_arr[1];
return $w;
}
else
{
return $row;
}

}

然后在/includes/lib_group.php里面的assign_public()里面加入一句:

$GLOBALS['smarty']->assign('weather', get_weather($city_info['city_id'],$city_info['city_name']));

模板标签的调用:在/template/模板名字/library/group_header.lbi你喜欢的位置插入以下内容

<div class="weather">
<div style=" background: url(images/weather/{$weather.image}) 0 0 no-repeat;_background:none;_FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/weather/{$weather.image}', sizingMethod='crop')">div>
<span class="temp">{$weather.temp}span> <span class="desc">{$weather.weather}span>
div>

Over。

总结

因为原理是从新浪天气频道上面抓取天气信息和下载天气图片,系统判定天气的时间,如果已经过期一天,就重新到新浪天气上去下载。同时系统判断本地网站是否有需要显示的天气图片,如果没有,就下载到images/weather目录,提高速度。如果没有过期直接使用数据内的信息来加快网页载入速度。

关于PHP空数组

<?php
$arr1=array();
$arr2=array(
array(),
array()
);
var_dump(empty($arr1));
var_dump(empty($arr2));
?>

输出:
bool(true)
bool(false)
看来二维的空数组并不算empty。

看看empty的解释:

bool empty ( mixed $var )
如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

Server.MapPath虚拟路径(virtual path)和相对路径(relative path)

早上来上班没多久,某客服的网站出了问题,返回500 Internal Server Error。地址:http://xxx.com/plus/xx.asp

Server.MapPath虚拟路径(virtual path)和相对路径(relative path)

很明显一看就知道是数据连接字符串出了问题,跳转到conn.asp ,
上面的定义:

If DataBaseType=0 then
'如果是ACCESS数据库,请认真修改好下面的数据库的文件名
DBPath = "xx_Data/xxxx.mdb" 'ACCESS数据库的文件名,请使用相对于网站根目录的的绝对路径
SqlNowString = "Now()"
Else
'如果是SQL数据库,请认真修改好以下数据库选项
DataServer = "(local)" '数据库服务器IP
DataUser = "sa" '访问数据库用户名
DataBaseName = "xx" '数据库名称
DataBasePsw = "xx" '访问数据库密码
SqlNowString = "getdate()"
End if

下面的打开数据库的子过程:

Sub OpenConn()
'On Error Resume Next
If DataBaseType = 1 Then
ConnStr="Provider = Sqloledb; User ID = " & datauser & "; Password = " & databasepsw & "; Initial Catalog = " & databasename & "; Data Source = " & dataserver & ";"
Else
ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(DBPath)
End If
Set conn = Server.CreateObject("ADODB.Connection")
conn.open ConnStr
If Err Then Err.Clear:Set conn = Nothing:Response.Write "数据库连接出错,请检查Conn.asp文件中的数据库参数设置。":Response.End
CollcetConnStr ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(CollectDBPath)
End Sub

可以发现DBPath这个变量里面的路径前面是没有“/”或者“\”符号,说明是相对路径,关于Server.MapPath的路径,我们来看官方解释:

Syntax
Server.MapPath( Path )

Parameters
**Path **

Specifies the relative **or **virtual **path to map to a physical directory. If Path starts with either a **forward (/) or backward slash (), the MapPath method returns a path as if Path is a full virtual path. If Path doesn't start with a slash, the MapPath method returns a path relative to the directory of the .asp file being processed.

上面的DBPath很明显被当作了relative path,路径都是相对于当前运行的asp文件路径,这样的定义在开发设计中是不可取的,最好统一为virtual path,虚拟路径就好象是由一个网站根目录开始的绝对路径。

当然这个整个问题的发生是客户小心去掉了forward (/) or backward slash ()。加上后网站正常打开。

Zend Studio保存后卡死、启动后卡死

保存卡死的问题

真正导致问题的是 “自动编译”(Build Automatically) ,这个功能会在任何一个文件发生变化以后,去自动 Build ,如果你的 CPU 跑得不够快, 每当你保存一个文件(Ctrl + s) ,Zend Studio 就又可以被被这个 Build 工作卡死。

取消 “自动编译”( <Top Menu> / Project / Build Automatically ) , 改用 “手动编译”
:当你需要编译的时候 Ctrl+B 。 只有在 Build 以后, ZS 才理解你写的代码的意义, 从而帮助你 代码补全(Code Assist) 和 代码定位(按Ctrl 点击函数、类、变量、常量,打开定义他们的地方)

启动后卡死的问题

删除C:\Documents and Settings\Administrator\Zend\workspaces\DefaultWorkspace7\.metadata目录下的.lock文件。

apt-get卸载Apache MySQL PHP

1、卸载Apache2都几个命令

sudo apt-get --purge remove apache2
sudo apt-get --purge remove apache2.2-common

其中remove --purge is equivalent to the purge command. (见man apt-get)

或直接使用一条命令

sudo apt-get autoremove apache2

2、卸载Mysql

sudo apt-get purge mysql-server mysql-server-5.0

3、卸载Php5

sudo apt-get autoremove php5

4、批量删除组件及相关

sudo apt-get remove --purge apache2 apache2-mpm-prefork apache2-utils apache2.2-common libapache2-mod-php5
sudo apt-get remove --purge libapr1 libaprutil1 libdbd-mysql-perl libdbi-perl libmysqlclient15off
sudo apt-get remove --purge libnet-daemon-perl libplrpc-perl libpq5 mysql-client-5.0 mysql-common
sudo apt-get remove --purge mysql-server mysql-server-5.0 php5-common php5-mysql

命令就是这些,具体含义可上网查询。