专注ECSHOP第九年
始自2007,服务二千多商户,不断为您增光溢彩

ECSHOP数据库操作类

阿牛阅读(622)

ECSHOP没有使用开源的数据库操作类,而是封装了自己的实现,这样做的好处是非常轻量,当网店需要做memcached缓存时,也可以方便的实现。当然,这样做的坏处是对数据库的选择非常狭窄,无法实现对非MySQL数据库的操作。

数据库操作类文件是includes/cls_mysql.php,该类提供了一些比较简便的方法。

autoExecute($table, $field_values, $mode = ‘INSERT’, $where = ”) — 数据库表操作
query($sql) — 数据库查询
getAll($sql)和getAllCached($sql, $cached = ‘FILEFIRST’) — 查询所有记录
getRow($sql, $limited = false)和getRowCached($sql, $cached = ‘FILEFIRST’) — 查询单行记录
getCol($sqlse)和getColCached($sql, $cached = ‘FILEFIRST’) — 查询某栏位的所有值
getOne($sql, $limited = false)和getOneCached($sql, $cached = ‘FILEFIRST’) — 查询单个值
本文以ECSHOP会员表users为例,介绍数据库操作方法。

操作之前,数据库只有一条记录,其中user_name=”test”,email=”test#gmail.com”。

在网店根目录下新建文件test.mysql.class.php:

<?php
define('IN_ECS', true); 
require(dirname(__FILE__) . '/includes/init.php');

$table = $ecs->table("users"); 

test_autoExecute($table); //数据表操作
test_query($table); //数据库查询
test_getAll($table); //查询所有记录
test_getRow($table); //查询单行记录
test_getCol($table); //查询某栏位的所有值
test_getOne($table); //查询单个值

function test_autoExecute($table)
{
global $db;

$field_values = array("email" => "newsletter#domain.com", "user_name" => "demo", "password" => "0192023a7bbd73250516f069df18b500", "reg_time" => 1355693990); 
$db->autoExecute($table, $field_values, "INSERT"); 
}

function test_query($table)
{
global $db;

$sql = "UPDATE " . $table . "SET user_name='phpally' WHERE user_name = 'demo'"; 
$db->query($sql); 
} 

function test_getAll($table)
{
global $db;

$sql = "SELECT user_name, email FROM " . $table; 
$result = $db->getAll($sql); 
print_r($result);
echo "<br/>";
}

function test_getRow($table)
{ 
global $db; 

$sql = "SELECT user_name, email FROM " . $table . " WHERE user_name = 'test'"; 
$result = $db->getRow($sql); 
print_r($result);
echo "<br/>";
}

function test_getCol($table)
{
global $db;

$sql = "SELECT email FROM " . $table; 
$result = $db->getCol($sql); 
print_r($result);
echo "<br/>";
}

function test_getOne($table)
{
global $db;

$sql = "SELECT email FROM " . $table . " WHERE user_name = 'test'"; 
$result = $db->getOne($sql); 
print_r($result);
echo "<br/>"; 
}
?>

 
输出:

Array ( [0] => Array ( [user_name] => phpally [email] => newsletter#domain.com ) [1] => Array ( [user_name] => test [email] => test#gmail.com ) ) 
Array ( [user_name] => test [email] => test#gmail.com ) 
Array ( [0] => test#gmail.com [1] => newsletter#domain.com ) 
test#gmail.com

 
转载~

ECSHOP后台中ajax的调用原理分析

阿牛阅读(626)

1:首先ecshop是如何定义ajax对象的。

     ecshop中的ajax对象是在js/transport.js文件中定义的。里面是ajax对象文件。声明了一个var Ajax = Transport;对象和一个方法Ajax.call = Transport.run;

2:ecshop中ajax可以使用两种方式传递数据.一种是get方式,一种是post方式.

     Ajax.call( ‘user.php?act=is_registered’, ‘username=’ + username, registed_callback , ‘GET’, ‘TEXT’, true, true );

     Ajax.call(‘user.php?act=return_to_cart’, ‘order_id=’ + orderId, returnToCartResponse, ‘POST’, ‘JSON’);

3:ecshop中的 ajax可以是传递text数据,也可以是一个json对象。比如以下代码

   goods.quick    = quick;
goods.spec     = spec_arr;
goods.goods_id = goodsId;
goods.number   = number;
goods.parent   = (typeof(parentId) == “undefined”) ? 0 : parseInt(parentId);

  Ajax.call(‘flow.php?step=add_to_cart’, ‘goods=’ + goods.toJSONString(), addToCartResponse, ‘POST’, ‘JSON’);

   里面的goods就是对象.而且是靠json来传递的。返回的结果result也是对象.

4:ecshop ajax函数里面.第三个参数就是回掉函数的名称。比如以上代码addToCartResponse 这个函数就是ajax处理结果的回调函数.

5:在ecshop的php代码中,一般是通过get或者post方式来接受函数。比如以下例子,如果接受的是对象。还需要用json数据格式来处理.比如以下

   include_once(‘includes/cls_json.php’);
$_POST[‘goods’] = json_str_iconv($_POST[‘goods’]);
处理的返回结果,也需要是json格式发送给js

   die($json->encode($result));

例如:

HTML

<input type="button" name="search" value="{$lang.button_search}" onclick="searchUser();" />

<select name="user_search[]" id="user_search" size="15" style="width:260px" ondblclick="addUser()" multiple="true">
</select>

 

/**
* 按用户名搜索用户
*/
function searchUser()
{
  var eles = document.forms['theForm'].elements;

  /* 填充列表 */
  var keywords = Utils.trim(eles['keyword'].value);
  if (keywords != '')
  {
    Ajax.call('bonus.php?is_ajax=1&act=search_users', 'keywords=' + keywords, searchUserResponse, "GET", "JSON");
  }
}

function searchUserResponse(result)
{
  var eles = document.forms['theForm'].elements;
  eles['user_search[]'].length = 0;

  if (result.error == 0)
  {
    for (i = 0; i < result.content.length; i++)
    {
      var opt = document.createElement('OPTION');
      opt.value = result.content[i].user_id;
      opt.text  = result.content[i].user_name;
      eles['user_search[]'].options.add(opt);
    }
  }
}

php代码段

/*------------------------------------------------------ */
//-- 搜索用户
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'search_users')
{
    $keywords = json_str_iconv(trim($_GET['keywords']));

    $sql = "SELECT user_id, user_name FROM " . $ecs->table('users') .
            " WHERE user_name LIKE '%" . mysql_like_quote($keywords) . "%' OR user_id LIKE '%" . mysql_like_quote($keywords) . "%'";
    $row = $db->getAll($sql);

    make_json_result($row);
}

 

PHP取出去掉数据库中的中文空格

阿牛阅读(632)

中文空格这里面有好几种:没有简单的解决问题的方式,比如半角全角空格,比如段落符都会显示为空白的,然后让人们误解它是空格,所以去掉空格之前一定要先确认自己的是不是空格,我下面分析一下这两种的解决办法。

(1)/[\s| ]+/这个就可以,注意|后面的跟的是全角空格

(2)mb中的正则替换也可以试试。如mb_ereg_replace

使用方法:

//$str = mb_ereg_replace(‘^( | )+’, ”, $str);
//$str = mb_ereg_replace(‘( | )+$’, ”, $str);

 

跑题了,另外注意使用Unicode的时候,加上正则表达式描述符u(注意,此种方法仅限解决编码问题的替换,一般上述方法即可,当然也可用str_replace)

但由于汉语中显示为空格模样的有很多个,比如说我下面碰到的这么一个,它的unicode编码为C2A0,使用下面的表达式就能解决问题。

再次MARK一下,免得忘记。

preg_replace(‘/^[(\xc2\xa0)|\s]+/’, ”, $sttr);

模板制作常用之js获取单选框里面的值

阿牛阅读(709)

 

<script>
window.onload = function(){
//通过名字获取  getElementsByName
//var obj = document.getElementsByName("fruit");
//通过标签获取  getElementsByTagName
var obj = document.getElementsByTagName("input");
    for(var i=0; i<obj.length; i ++){
        if(obj[i].checked){
            alert(obj[i].value);
        }
    }
}

</script>

<form>
<input type="radio"  name ="fruit" value="apple" checked>苹果
<input type="radio"  name ="fruit" value="banana">香蕉
<input type="radio"  name ="fruit" value="pear">梨
</form>

ECSHOP模板制作常用之获取单选框的值 知识点:

1,通过元素的名字获取元素列表

var obj = document.getElementsByName(“fruit”);

2,通过标签的名字获取元素列表

var obj = document.getElementsByTagName(“input”);

3,是否选中

obj[i].checked;

4,单选框里面的值

obj[i].value;

千里之行,始于足下。改变将来,从现在开始。改变现在,就是改变未来。

提取ecshop商业模板办法(原创)

阿牛阅读(933)

看标题,估计有些模板商就不乐意了

很多淘来的模板安全性有待质疑,为了一份干净的模板,提取分2部分(数据库和模板包):

安装前请注意备份原网站数据库:
1 )
新的模板包(如京东jingdong),需要把该新的数据库导出来,
ecs_ad,ecs_ad_position,ecs_ad_custom —- 此为后台的广告,以及广告链接
ecs_template —- 此为对应后台的模板设置,广告设置
可以在后台导出来,取名叫做ecs_ad_plus.sql
2)
文件方面,提取模板目录包,如
themes/jindong2014/ —- 此为模板主文件
data/afficheimg/ —- 此为模板的广告图片
3)1,2步骤完成后,备份好这2个目录的文件,上传到网站对应目录。
依次执行,数据库恢复(选择ecs_ad_plus),并在模板列表里面选择新的模板。
在此,一般的模板就已经安装完毕了。
4)调试:
很多商业性的模板,可能都有开发新的功能,主要体现在这几个页面,这时要记得替换或修改相应文件。
首页 —- 主要为index.php, 以及lib_goods.php(较少)
商品分类页 —- 主要为category.php, 以及lib_goods.php(较少)
商品页面 —- 主要为goods.php, 以及lib_goods.php
品牌页 —- 主要为brand.php, 以及lib_goods.php(较少)

另外,模板里面可能有加载自定义的php函数,需修改/includes/init.php,这需要查找你的模板包里面对应的文件做修改了。

提取至此完成。转载请留出处。

 

 

阿牛ecshop–备忘一个shopex的密码加密记录方式

阿牛阅读(1011)

 

在shopex的4.8.5 的 core/model_v5/member/mdl.account.php

文件里面记录了shopex用户的密码是如何存储到数据库的,在

encrypt_passwd_enhanced 函数里面是这样写的

public function encrypt_passwd_enhanced( $pwd, $uname, $regtime )

{

if ( !$pwd || !$uname || !$regtime )

{

return false;

}

$pwd = md5( md5( trim( $pwd ) ).strtolower( $uname ).$regtime );

return “s”.substr( $pwd, 0, 31 );

}

 

下图中的红圈部分就是加密代码,那么如果在转移到ecshop 时候,因为ecshop只是做了md5(password) 的密码检查,显然登录会失败,那么再加一种这样的检查,就可以登录了,hoho。。。。shopex-userpassword

 

在ecshop 的  includes\modules\integrates\ecshop.php 的行 check_user 函数里面有

if ($row['password'] != $this->compile_password(array(‘password’=>$password,’ec_salt’=>$ec_salt)))

 

我们只需要再加一个

$pwd = md5( md5( trim( $pwd ) ).strtolower( $uname ).$regtime );

$shopex_pass =  ”s”.substr( $pwd, 0, 31 );

 

判断改成这样

if ($row['password'] != $this->compile_password(array(‘password’=>$password,’ec_salt’=>$ec_salt)) || $row['password'] !=  $shopex_pass )

 

就可以了

 

阿牛Ecshop二次开发知识–Ecshop积分兑换时提示库存不足

阿牛阅读(851)

今天在做Ecshop二次开发时使用了Ecshop的积分商城 功能遇到了一个问题,就是使用积分兑换商品时会提示库存不足:“对不起,该商品库存不足,现在不能兑换!”
见下图:

对不起,该商品库存不足,现在不能兑换!

去后台仔细检查了一下,我的库存时9999出现这样的提示显然是系统BUG . 经过GOOGLE、百度之后发现官方并没有解决的办法。

 

1. 打开Ecshop积分商城文件 “根目录/exchange.php”

发现248行与289行都有库存不足时报错的提示代码:

248行:

    /* 查询:检查兑换商品是否有库存 */
    if($goods['goods_number'] == 0 && $_CFG['use_storage'] == 1)
    {
        show_message($_LANG['eg_error_number'], array($_LANG['back_up_page']), array($back_act), 'error');
    }

289行:

  //查询:商品存在规格 是货品 检查该货品库存
    if((!empty($specs)) && ($product_info['product_number'] == 0) && ($_CFG['use_storage'] == 1))
    {
        show_message($_LANG['eg_error_number'], array($_LANG['back_up_page']), array($back_act), 'error');
    }

 

显然248行是直接检查的商品库存这里是没有问题的。问题出在289行,检查货品出了问题。

这里代码的意思是只要存在属性选择,就对对货品数量进行库存检查这显然是错误的,

因为:只有单选属性 跟货品挂钩,多选属性 是没有货品概念。

2. 修改Ecshop积分兑换文件代码解决问题。

修改289行代码:

 //查询:商品存在规格 是货品 检查该货品库存
    if((!empty($specs)) && ($product_info['product_number'] == 0) && ($_CFG['use_storage'] == 1))
    {
        show_message($_LANG['eg_error_number'], array($_LANG['back_up_page']), array($back_act), 'error');
    }

如下:

//查询:商品存在规格 是货品 检查该货品库存
    if((is_spec($specs)) && ($product_info['product_number'] == 0) && ($_CFG['use_storage'] == 1))
    {
        show_message($_LANG['eg_error_number'], array($_LANG['back_up_page']), array($back_act), 'error');
    }

重新测试问题已经解决了。

3. 修改原理介绍——Ecshop二次开发知识总结。

做过Ecshop二次开发的朋友都了解,Ecshop中商品的属性有三种:

唯一属性:
 只有一个值,购买商品时不能选择。
单选属性:
 拥有多个值,用户只能选一个,比如颜色,选择红色的衣服或者蓝色的。
复选属性:
 复选属性拥有多个值,用户可以选择多个。

在三种属性中仅第二种“单选属性 ”与货品库存有关。而函数is_spec()就是检查一组属性中是否有单选属性。因为加上此判断后问题解决。

 

阿牛ECSHOP 更专业 更方便

关于我们联系我们