phpwind 的一个小错误导致cookie失效的解决,表象是无法注册登录

一个phpwind 8.0 utf8 系统错误表现为无法注册登录,费老劲调试,发现 data/sql_config.php 文件由于在windows 记事本编辑后导致被自动增加了bom ,前端cookie 输出因为bom 的 原因,导致浏览器无法生成cookie,从而无法登录和注册

在editplus 另存成utf-8 无bom ,上传问题解决

参看 http://www.phpsir.com/ecshop-utf8-bom.html

总结: 要多用 linux curl 去查看文件输出

 

ecshop系列:后台导出程序错误,ecshop应该认错

今天一个客户给我发来ecshop后台导出出现

ERROR 1052 (23000): Column ‘brand_id’ in where clause is ambiguous

经查发现是不同表存在相同字段而在where 语句中未区分造成

测试运行语句

SELECT g.*, b.brand_name as brandname FROM `usason`.`ecs_goods` AS g LEFT JOIN `usason`.`ecs_brand` AS b ON g.brand_id = b.brand_id WHERE is_delete = 0 AND brand_id = ’17′;

修改为

SELECT g.*, b.brand_name as brandname FROM `usason`.`ecs_goods` AS g LEFT JOIN `usason`.`ecs_brand` AS b ON g.brand_id = b.brand_id WHERE is_delete = 0 AND g.brand_id = ’17′;

红色部分注意

那么就只有去查后台程序代码了

发现在admin/includes/lib_main.php 的get_where_sql($filter)的函数中出现了

$where .= isset($filter->brand_id) && $filter->brand_id > 0 ? ” AND brand_id = ‘” . $filter->brand_id . “‘” : ”;

修改为

$where .= isset($filter->brand_id) && $filter->brand_id > 0 ? ” AND g.brand_id = ‘” . $filter->brand_id . “‘” : ”;

问题解决

目前还不知道有其他副作用

好在ecshop命名还算规范

 

phpwind 批量上传解决一例,上传后文件列表消失,mbstring 问题

朋友网站phpwind 7.5 sp3出现批量上传文件后上传文件的列表消失,但是文件已经上传上去了,调试后发现没有写入数据库

跟踪代码在 lib/upload/mutiupload.class.php 文件的update函数中加入调试语句,确认没有写入数据库 ,

原因是 $value['name'] = pwConvert($value['name'], $db_charset, ‘utf-8′); 行有错

经调试 pwConvert 是因为 php没有启用 mbstring 造成,启用后,问题解决

 

ecshop系列:二次开发,扩展分类商品后置

ecshop 的商品是可以属于多个分类,在内部称谓是扩展分类,被记录到ecs_goods_cat 表
现在需求是将某个分类category.php?id=某某的商品列表中含有扩展分类的商品后置
思路: 首先找到存在扩展属性的商品id,形成数组,然后在 $arr 变量里面查找后unset数组的部分key,
并附加array_merge到原来的$arr后

修改category.php 的 category_get_goods 函数
代码如图:

ecshop系列:购买商品增加留言备注功能

在购买商品时候增加对此商品购买的留言备注功能
如图:

开发方法如下:
1) 在goods.dwt 里面加留言字段

2)修改 js/common.js 里面的addToCart 函数

3)修改flow.php 里面关于 if ($_REQUEST['step'] == ‘add_to_cart’) 的处理部分

4)修改includes/lib_order.php 里面的 addto_cart 函数

 

首先修改函数定义

其次修改内容

至此增加memo部分完成,下面是在flow.php 购物车里面显示此留言
5)修改 flow.dwt

ecshop系列:一行代码解决财付通3006错

问题描述:
修改价格后再次点击使用财付通支付时出现“[3006]您的请求无效,请重新再试。”
解决方案
\includes\modules\payment\tenpay.php 行 104
原来的为
$bill_no = str_pad($order['log_id'], 10, 0, STR_PAD_LEFT);
现在修改为
$bill_no = str_pad(rand(1,99),2,0,STR_PAD_LEFT).str_pad($order['log_id'], 8, 0, STR_PAD_LEFT);
问题解决
点击下图看大图

ecshop系列:search的静态化

一般说来搜索的结果静态化可以持久的保持搜索结果,给客户良好的印象

ecshop 的搜索结果是 search.php?encode=base64编码字符串

我们希望用 /search_搜索关键字_p页码.html 来做静态优化

那么方法是什么呢:

首先写 .htaccess 文件

RewriteRule ^search_(.+?)_p([0-9]+).html$  search2\.php\?keywords=$1&page=$2 [QSA,L]

我们复制 search.php 成 search2.php 注释掉行18-行66

然后加入

 $string["keywords"]=addslashes($_GET["keywords"]); 

 $string["page"]=addslashes($_GET["page"]); 

 $string["search_encode_time"] = $_SERVER["REQUEST_TIME"];

测试 http://域名/search_关键字_p1.html
如果和 http://域名/search2.php?keywords=关键字&page=1
的结果一致
然后我们去修改页码处的连接
行 501

$pager = get_pager2('search_', $pager['search'], $count, $page, $size);

在include/lib_main.php 里面 复制get_pager 函数成 get_pager2
然后修改成如下

 $url_format = $url . $param_url . 'page=';
        $url_format2 = $url . $param['keywords'] . '_p';
        $pager['page_first'] = ($page - $_offset > 1 && $_pagenum < $page_count) ? $url_format2 . "1.html" : '';
        $pager['page_prev']  = ($page > 1) ? $url_format2 . $page_prev.".html" : '';
        $pager['page_next']  = ($page < $page_count) ? $url_format2 . $page_next.".html" : '';
        $pager['page_last']  = ($_to < $page_count) ? $url_format2 . $page_count.".html" : '';
        $pager['page_kbd']  = ($_pagenum < $page_count) ? true : false;
        $pager['page_number'] = array();
        for ($i=$_from;$i<=$_to;++$i)
        {
            $pager['page_number'][$i] = $url_format2 . $i.".html";
        }