2010年10月

PHPnow 升级后 PHP不支持GD、MySQL

最近磁盘格式化误操作后,最近两天都在忙于数据恢复,现在才恢复正常。

机子上面的软件全部重装,PHPnow乘此机会下载了最新版本来安装。之前的版本是:

PHPnow 1.5.4  -  2009-07-02

组件更新:
php-5.2.10
MySQL-5.0.83 / MySQL-5.1.36
phpMyAdmin 3.2.0.1
...

现在的版本是:

PHPnow 1.5.6  -  2010-09-22

组件更新:
php-5.2.14
Apache 2.2.16
MySQL-5.0.90 / MySQL-5.1.50
phpMyAdmin 3.3.7
eAccelerator 0.9.6-1
...

和以前一样安装ECShop,但是安装的时间,环境检查不过去:

操作系 统..........................................................................................................................WINNT
PHP 版 本..........................................................................................................................5.2.14
是否支持 MySQL.......................................................................................................................... 不支持
GD 版 本.......................................................................................................................... 不支持
是否支持 JPEG.......................................................................................................................... 不支持
是否支持 GIF.......................................................................................................................... 不支持
是否支持 PNG.......................................................................................................................... 不支持
重要文件是否完 整.......................................................................................................................... 完整
服务器是否开启安全模 式.......................................................................................................................... 关闭

phpMyAdmin也提示:“无法加载 mysql (外链,英语) 扩展,请检查您的 PHP 配置。 - 文档”

查看phpinfo()

Loaded Configuration File D:\phpnow\php-5.2.14-Win32\php.ini

加载的php.ini是正确的,extension=php_mysql.dll 之前的注释也是去掉了的。

跳转到

extension_dir = "..\..\php-5.2.10-Win32\ext"

问题所在:PHPnow的目录结构是:

D:\phpnow>dir /b
Apache-{$version}
htdocs
Init.cm_
MySQL-{$version}
php-{$version}-Win32

每次更新版本后,目录的版本号 {$version} 也跟着在改变,

所以把extension_dir = "..\..\php-5.2.10-Win32\ext" 改为extension_dir = "..\..\php-5.2.14-Win32\ext" 就ok了。

关于MySQL group by的取值

ECShop里面有两个表,一个是ecs_order_action ,以下是它的表结构

Field Type Null Key Default Extra
action_id mediumint(8) unsigned NO PRI (NULL) auto_increment
order_id mediumint(8) unsigned NO MUL 0  
action_user varchar(30) NO      
order_status tinyint(1) unsigned NO   0  
shipping_status tinyint(1) unsigned NO   0  
pay_status tinyint(1) unsigned NO   0  
action_place tinyint(1) unsigned NO   0  
action_note varchar(255) NO      
log_time int(11) unsigned NO   0  

这个表的功能是订单的管理日志,order_id是订单号,action_user是操作订单的管理员名称,取自ecs_admin_user.user_name,order_status是订单状态,当order_status=1的时候,订单为确认状态,0表示未确认,log_time是操作unix时间戳。

还有一个表是ecs_admin_user,表结构如下:

Field Type Null Key Default Extra
user_id smallint(5) unsigned NO PRI (NULL) auto_increment
user_name varchar(60) NO MUL    
email varchar(60) NO      
password varchar(32) NO      
add_time int(11) NO   0  
last_login int(11) NO   0  
last_ip varchar(15) NO      
action_list text NO   (NULL)  
nav_list text NO   (NULL)  
lang_type varchar(50) NO      
agency_id smallint(5) unsigned NO MUL (NULL)  
suppliers_id smallint(5) unsigned YES   0  
todolist longtext YES   (NULL)  
role_id smallint(5) YES   (NULL)  

user_id是用户id,user_name和order_action.action_user相对应(但并没有关联)。当order_status=1,且log_time为最早时间为点击“确认”那个管理员(虽然事实上ECShop里面无法正确的通过这种方式取得点击“确定”的管理员,因为管理员A可以先点击“付费”或者“售后”都将自定把订单转为“已确认”状态,然后管理员B点击“确定”,那么这个方法就会认为管理员A才是点“确认”的人,因为他是最先将order_status修改为1的人)。

现在我们的需求是:找到每个订单点击确认的用户id,结果类似于:

order_id user_id
123 1
124 2

刚开始写的SQL:

SELECT * FROM  
(
SELECT order_id,user_id FROM ecs_order_action oa INNER JOIN ecs_admin_user au ON oa.action_user=au.user_name
AND oa.order_status=1
) AS tb1
GROUP BY order_id

但是发现结果有问题,然后修改为:

SELECT * FROM
(
SELECT order_id,user_id FROM ecs_order_action oa INNER JOIN ecs_admin_user au ON oa.action_user=au.user_name
AND oa.order_status=1 ORDER BY log_time
) AS tb1
GROUP BY order_id

结果都是返回的128rows,将两次结果通过SQLyog输出为xml,然后用Notepad++的Compare功能比较:

关于MySQL group by的取值

发现确实有很多行的数据是不同的,通过这个实验,可以发现group by的每次取的结果都是第一次出现新order_id那行,为了按log_time顺序排列,必须order by log_time,将时间最早的结果输出。

phpMyAdmin配置文件现在需要绝密的短语密码

今天安装了phpmyadmin,进了后发现提示上面这信息,这个错误一般不影响使用,不过还是改改比较好,解决办法如下:

‘blowfish_secret’用一个任意字符串作为cookie的加密字符串,如果没有加密钥匙,系统会显示”配置文件现在需要绝密的短语密码(blowfish_secret) ” ,配置如下:
vi phpmyadmin/config.inc.php

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['blowfish_secret'] = 'tunps.com';//(其中的"tunps.com"自定义)

修改以后,以后登入phpmyadmin就方便多了,但一定不要使用空密码,切记!

FROM_UNIXTIME()与UNIX_TIMESTAMP()

from_unixtime是MYSQL里的时间函数
date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串
后面的 '%Y%m%d' 主要是将返回值格式化
例如:
mysql>SELECT FROM_UNIXTIME( 1195488000, '%Y%m%d' )
->20071120
mysql>SELECT FROM_UNIXTIME( 1195488000, '%Y年%m月%d' )
->2007年11月20
UNIX_TIMESTAMP()是与之相对正好相反的时间函数
例如:
mysql> SELECT UNIX_TIMESTAMP('2007-11-20') ;
->1195488000

SELECT FROM_UNIXTIME(topic_time,'%Y-%m-%d %H:%m:%s') as topic_time from phpbb_topics;