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;

GVIM的Ctrl+V粘贴/Visual块模式冲突

在Windows平台的GVIM中,Ctrl+V是无法实现进入Visual块模式的,因为Ctrl+V也有粘贴的作用。Vim的帮助里面已经有解释:

						*CTRL-V* *blockwise-visual*
CTRL-V			start Visual mode blockwise.  Note: Under Windows
			CTRL-V could be mapped to paste text, it doesn't work
			to start Visual mode then, see |CTRL-V-alternative|.

然后转到CTRL-V-alternative

						*CTRL-V-alternative* *CTRL-Q*
Since CTRL-V is used to paste, you can't use it to start a blockwise Visual
selection.  You can use CTRL-Q instead.  You can also use CTRL-Q in Insert
mode and Command-line mode to get the old meaning of CTRL-V.  But CTRL-Q
doesn't work for terminals when it's used for control flow.

如果非要使用Ctrl+V,可以将的map删除掉:

修改 vim/vim73/mswin.vim, 修改如下:

" CTRL-V and SHIFT-Insert are Paste
map "+gP

改成(把 map 刪掉就對了).

" CTRL-V and SHIFT-Insert are Paste
"map "+gP

就可以用 Ctrl + v 了.(来源)

 

[Microsoft][ODBC SQL Server Driver][DBNETLIB]无效的连接。

公司某客户的网站打开报错:

Microsoft OLE DB Provider for ODBC Drivers 错误 ‘80004005’ [Microsoft][ODBC SQL Server Driver][DBNETLIB]无效的连接。 /conn.asp,行 8

下载conn.asp查看代码:

Set conn=Server.Createobject("adodb.connection")
conn.Open "driver={SQL server};Server=(1.1.1.1:1433);uid=x;pwd=x;database=x;"

检查了数据库的用户名和密码都没有问题,然后开始突然怀疑是不是指定服务器地址的问题。因为在以前的经验中sqlserver需要通过一定的配置才能远程连接。而且web和数据库在同一个机器上,所以我尝试将 1.1.1.1:1433 换成 local ,也就是:

conn.Open "driver={SQL server};Server=(local);uid=x;pwd=x;database=x;"

结果网站顺利打开。

ECShop 订单价格去掉小数点取整

方法1

进入mySQL数据库 修改表ecs_cart中goods_price字段结构
原来长度值是 : 10,2 ,修改为10,0
不过这个方法实践中有个缺点,和商品展示页面里面的个会员等级的价格不一致,因为数据库中的decimal(10,0)直接将小数点后面全部去掉,而非四舍五入。也就是当在后台设置“显示设置”中“商品价格显示规则”设定为“不四舍五入,不保留小数”时两个价格才一致。

方法2

后台设置“显示设置”中“商品价格显示规则”设定为“不四舍五入,不保留小数”

修改/includes/lib_order.php里面的cart_amount(),
将return floatval($GLOBALS['db']->getOne($sql)); 修改为 return intval($GLOBALS['db']->getOne($sql));

修改/includes/lib_common.php里面的price_format()
将$price = number_format($price, 2, '.', ''); 修改为 $price = number_format($price, 0, '.', '');

php通过sudo执行root权限的程序

最近公司需要通过web界面修改squid.conf,然后保存配置文件的同时重启动squid,web服务器是nginx+php,文件用户和组都是www。
首先编辑 /etc/sudoers 使用 visudo来编辑
/etc/sudoers的权限是440:
-r–r—– 1 root root 3248 Oct 18 23:47 /etc/sudoers
需要chmod u+w /etc/sudoers
修改完毕之后再chmod -w /etc/sudoers
因为如果/etc/sudoers的权限不是440,那么sudo会报错:
[root@hn ~]# sudo
sudo: /etc/sudoers is mode 0640, should be 0440
sudo: no valid sudoers sources found, quitting

在最下面添加一行

nobody ALL=NOPASSWD:/usr/local/squid/sbin/squid -k reconfigure

然后注释掉文件中的Defaults requiretty这行
否则会出现sudo: sorry, you must have a tty to run sudo的错误
保存退出即可
测试
写一个php文件,内容如下

<?php
$output = shell_exec("/usr/bin/sudo /usr/local/squid/sbin/squid -k reconfigure");
echo $output;
?>