ecshop 保存用户购物车数据

ecshop的购物车记录储存在cart表中,用户向购物车中添加商品时会在其中产生一条记录

靠session_id与用户产生映射关系。当注册用户退出登录或者游客关闭浏览器时,session被销毁,同时删除掉cart表中与之对应的记录。所以ecshop的购物车功能,无法在用户下次登录时记录之前的购物车信息。这在某些场景,如用户误关掉浏览器时十分不方便。
为了解决这个问题,首先要在用户登录时,将他以户已游客身份,产生的购物车数据加上user_id。
然后要将该用户的历史购物车记录中的session_id改为本次的session_id。
最后要在用户退出登录时,保存住注册用户在cart表中的购物车记录。
 
具体实现方法:
一、在includes/lib_main.php
中定义如下方法并在update_user_info()方法中的末尾处执行
/**
* 用户登陆后,载入上一次退出时的购物车信息,并与此次登录前购物车信息合并
*
* @access  public
* @return  void
*/
function merge_cart_history()
{
if (!$_SESSION[“user_id”])
{
return false;
}
$sql = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set user_id = ” . $_SESSION[“user_id”] . ” where session_id = “”.SESS_ID.”””;//为用户以游客身份时(登录之前),产生的购物车记录添加user_id
$GLOBALS[“db”]->query($sql);

 $sql1 = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set session_id =”” . SESS_ID . “” where user_id = “” . $_SESSION[“user_id”] . “””;//将用户历史购物车记录的session_id,改为本次的session_id
$GLOBALS[“db”]->query($sql1);
$re = $GLOBALS[“db”]->getAll(“select goods_id, rec_id, sum(goods_number) as goods_number from ” . $GLOBALS[“ecs”]->table(“cart”) . ” where user_id = “{$_SESSION[“user_id”]}” and session_id = “”.SESS_ID.”” group by goods_id”);//汇总历史购物记录与本次购物记录中,每一种商品的数量
if($re){
foreach ($re as $k => $v)
{
$sql = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set goods_number = ” . $v[“goods_number”] . ” where rec_id = ” . $v[“rec_id”];
$GLOBALS[“db”]->query($sql); //每种商品保留一条记录

$sql = “delete from ” . $GLOBALS[“ecs”]->table(“cart”) . ” where rec_id <> {$v[“rec_id”]} and user_id = “{$_SESSION[“user_id”]}” and session_id = “” . SESS_ID . “” and goods_id = ” . $v[“goods_id”];//删除多余的记录
$GLOBALS[“db”]->query($sql);
}
}
}

二、将includes/cls_session.php中的destroy_session()方法做如下修改:

将$this->db->query(“DELETE FROM ” . $GLOBALS[“ecs”]->table(“cart”) . ” WHERE session_id = “$this->session_id””);

改为$this->db->query(“DELETE FROM ” . $GLOBALS[“ecs”]->table(“cart”) . ” WHERE session_id = “$this->session_id” AND `user_id`=0″);

既销毁当销毁session时,只将cart表中user_id等于0(未登录用户)的购物车记录删除。

改完收工。

 

PHP curl判断ip地址是否可连接

[singlepic id=188]

昨日隔壁同事让帮忙看一下,如何使用PHP在连接IP后迅速判断是否能够访问。

小查了一下,发现使用curl方式比较简单方面,使用如下函数即可做到。

function check_remote_ip_exists($ip_url)
{
$curl = curl_init($ip_url);
// 不取回数据,设置响应时间为3秒,即若无访问则3秒后停止连接
curl_setopt_array($curl,array(CURLOPT_NOBODY => true, CURLOPT_TIMEOUT => 3));

// 发送连接请求
$result = curl_exec($curl);
$found = false;
// 请求没有发送则失败
if($result !== false)
{
// 检查http响应码是否为200
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($statusCode == 200)
{
$found = true;
}
}
curl_close($curl);

return $found;
}

附录:HTTP状态码 http://baike.baidu.com/view/1790469.htm

简单介绍使用CI框架实现用户管理功能

简单介绍使用CI框架实现用户管理功能

一.CI框架:

MVC的实现框架:C控制层,M模型层,V是视图层。

上图controllers是控制层文件夹,models是模型层文件夹,views是视图层文件夹。

二.CI工作流程(以登陆为例):
1.前台页面制作完成后,把前台页面放在views文件夹下(logon.php)。

2.根据前台页面及功能要求,制作控制层的控制器:控制器(就是一个类文件)在controllers文件下建立(login.php),在类文件内写入类(Class Login),类名首字母大写,类继承CI_Controller类。在类内写具体的控制方法。

__construct()方法内重载本方法,并指定模型文件。index()方法指定视图文件(.php文件后缀不写)。在本控制器内构成了MVC的连接。
3.根据控制器的控制方法以及对数据库的操作具体实现,在模型层写数据库操作方法。在models文件下建立模型logon_mdl.php(也是一个类文件)。

在模型文件(logon_mdl.php)建立logon_mdl类,本类必须继承CI_Model。
4.框架安装,名字规则,文件路径,继承关系等按照CI框架要求进行即可。

三.用户管理制作:
1.用户管理:
制作后台是添删改查的规则的具体体现,用户管理属于后台管理用户功能:当管理员登陆账号以后,可以在用户管理界面添加用户,删除用户,编辑用户,查找用户。
2.制作:
制作形式多种多样,对数据库的操作原理都是一样的。CI框架为我们提供了现成的类,直接调用里面的方法即可。

2.1 登录页:

根据前台页面要求,输入用户名与密码,点击登陆后,表单提交到Logon控制器下的select()方法:<?php echo form_open(“/logon/select/”, array(“id” => “logon_form”, “name” => “logon_form”));?>。控制器根据模型的数据库操作方法select()去查询是否存在,如果存在,给session赋值,可以进入页面。否则转回登录页,要求客户重新登录。代码如下:

(登录功能)类文件内置方法:

$this->load->model(“logon_mdl”);//加载模型文件

$this->load->view(“logon”);//加载视图文件

$this->logon_mdl->select()//调用模型文件的select方法

$this->session->set_userdata();//存储session

redirect();//跳转(页面)

$this->session->unset_userdata()//销毁session

$this->session->all_userdata();//获取session数据

$this->db->query($sql);//执行sql语句

2.2 添加功能:
进入页面后,点击添加管理员,根据添加传值:<a href=”<?php echo DOMAINURL;?>/user_list/index/1″ style=”text-decoration: none;color: #000;”>添加管理员</a>。控制器user_list的index方法收到该值后,在页面显示一个添加表单:if(empty($cor)){echo form_open(“/user_list/insert/”, array(“id” => “user_list_form”, “name” => “user_list_form”));}。添加表单提交到控制器user_list的控制方法insert,根据对应的模型方法insert实现数据添加到数据库。

(添加功能)类文件内置方法:

$this->load->model(“user_list_mdl”);//加载模型文件

$this->uri->segment(3);//id传值

$this->user_list_mdl->get_select();//调用模型文件的方法

$this->load->view(“template”, $page);//加载视图文件并传值

$this->db->query($sql, array($data[“Account”],$data[“Password”],$data[“Name”],$data[“CreateTime”]));//执行sql语句

redirect(“/user_list/index”);//调转到其他页

2.3 列表功能:
如果没有点击添加:if(empty($id))。则通过控制器的控制方法指挥模型的数据库操作方法进行数据库内容查询列表(包含编辑和删除链接)

(列表功能)类文件内置方法:(同上)

public function index()

{

$data[“id”]  = $this->uri->segment(3);

$data[“row”]= $this->user_list_mdl->get_select();

$this->show($data);

}

2.4 删除功能:
当点击列表的删除链接时:<a onclick=”return confirm(“确认删除”)” href=”<?php echo DOMAINURL;?>/user_list/delete/<?php echo $i[“ID”];?>” style=”text-decoration: none;color: #000;”>删除</a>,通过控制器user_list模型方法delete,对数据进行删除,转回列表页。

(删除功能)类文件内置方法:

$this->uri->segment(3);//传id

$this->user_list_mdl->delete($data)//调用模型方法

redirect(“/user_list/index”);//调转到其他页面

$this->db->query($sql);//执行sql语句

2.5 更新功能:
当点击列表的更新链接时:<a href=”<?php echo DOMAINURL;?>/user_list/get_update/<?php echo $i[“ID”];?>” style=”text-decoration: none;color: #000;”>更新</a>,根据编辑传值到控制器user_list的方法get_update,得到查询数据显示在页面一个编辑表单if(empty($cor)){

echo form_open(“/user_list/insert/”, array(“id” => “user_list_form”, “name” => “user_list_form”));

}else{

echo form_open(“/user_list/update/”, array(“id” => “user_list_form1”, “name” => “user_list_form1”));

},提交到控制器user_list/的控制方法update,根据对应的模型方法update实现数据编辑,转回到列表。

(更新功能)类文件内置方法:

$this->uri->segment(3);//传ID

$this->user_list_mdl->get_update($data);//调用模型方法

redirect(“/user_list/index”);//调转其他页面

$this->db->query($sql);//执行sql语句

2.6 退出功能:
当点击退出链接时:<a href=”<?php echo DOMAINURL;?>/logon/logout” >退出</a>,执行控制器logon方法logout,销毁session,转到登录页。

(退出功能)类文件内置方法:

$this->session->unset_userdata($unset_sess);//销毁session

redirect();//跳转其他页面

二维码的生成和使用

php生成二维码和QR图片中间加logo

一.二维码定义:

二维码(2-dimensional bar code):又称二维条码,最早起源于日本,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙。

QR码:(学名为快速响应矩阵码;Quick Response Code)是二维条码的一种,于1994年由日本DENSO WAVE公司发明。QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以让其内容快速被解码[1]。QR码最常见于日本,为目前日本最流行的二维空间条码。QR码比较普通条码可以存储更多数据。

声明:1.QR码呈正方形,常见的是黑白两色。在3个角落,印有较小,像“回”字的的正方图案。这3个是帮助解码软件定位的图案,用户不需要对准,无论以任何角度扫描,数据仍可正确被读取。

2.QR码有容错能力,QR码图形如果有破损,仍然可以被机器读取内容,最高可以到7%~30%面积破损仍可被读取。

错误修正容量

L水平      7%的字码可被修正
M水平      15%的字码可被修正
Q水平      25%的字码可被修正
H水平      30%的字码可被修正

3.读取方式:利用30万像素以上的照相手机,搭配手机内的QR码解码软件,对着QR码一照,解码软件会自动解读此信息,显示于手机屏幕上面。目前也有运用到Webcam的镜头来解码,有些人认为未来所有有镜头的科技产品,都会被导入此QR码的机制。

 

二.php生成二维码的2种方式
1.google开放api

<?php
//不足:不能变化颜色,只是黑色二维码
//==在浏览器输入$png地址,可以看到一个黑色二维码(不含LOGO)==
$size =”100×100″;//这并不是生成图片的真实尺寸,最大尺寸

$data =”www.baidu.com”;

$png = “http://chart.googleapis.com/chart?chs=”.$size.”&cht=qr&chl=”.$data.”&chld=L|1&choe=UTF-8″;
/*
生成二维码(不含logo):
chs生成二维码尺寸/
cht=qr这是说图表类型为qr也就是二维码/
chl=XXXX 为要生成的二维码数据/
chld=L|4 L代表默认纠错水平,1表二维码边界空白大小,可自行调节/
choe=UTF-8这是说内容的编码格式为UTF-8.
*/

//==========生成LOGO的二维码===============
$logo =”./1.jpg”;//中间logo图(已经存在的图片)

$QR = imagecreatefrompng($png);    //根据给定的二维码图片文件名$png取得的图像,二维码图像

$logo = imagecreatefromstring(file_get_contents($logo));//根据字符串得来的图像,LOGO图像

$QR_width = imagesx($QR);    //取得二维码图像宽度
$QR_height = imagesy($QR);    //取得二维码图像高度

$logo_width = imagesx($logo);    //取得LOGO图像宽度
$logo_height = imagesy($logo);    //取得LOGO图像高度

$logo_qr_width = $QR_width/5;    //目标宽度
$scale = $logo_width/$logo_qr_width;        //等比例
$logo_qr_height = $logo_height/$scale;//等比例关系。$QR_width,$logo_width,$logo_height(已知量),求的目标高度

$from_width = ($QR_width-$logo_qr_width)/2;//通过计算的距离,作为定位点坐标数据

imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
/*
一。目标图象连接资源,
源图象连接资源,
目标 X 坐标点,
目标 Y 坐标点,
源的 X 坐标点。
源的 Y 坐标点,
目标宽度,
目标高度,
源图象的宽度,
源图象的高度
http://cn2.php.net/manual/zh/function.imagecopyresampled.php

二。生成中间带logo的二维码:
imagecopyresized()将于源的宽度$logo_width和高度$logo_height位置(0,0)并将其放置在目标的宽度$logo_qr_width和高度$logo_qr_height矩形区域,它是在位置($from_width,$from_width)的矩形区域。
如果源和目标坐标,宽度和高度不同,适当的伸展或收缩的图像片段将进行。坐标是指在左上角。
http://www.111cn.net/phper/24/php-imagecopyresized.htm
*/

header(“Content-type: image/png”);
imagepng($QR);//浏览器输出
imagedestroy($QR);
?>

2.php类库

<?php
//优点:通过修改类文件的方法,可以改变背景颜色和条码颜色,
include “./phpqrcode.php”;//引用类文件

$value=”222222″;//为要生成的二维码数据

$errorCorrectionLevel = “Q”;//二维码纠错能力大小

$matrixPointSize = 20;//二维码图片大小

QRcode::png($value, “5.png”, $errorCorrectionLevel, $matrixPointSize);//生成二维码       5.png是生成的二维码图片(不含logo)

//====同上====
$QR = “5.png”;//生成的二维码图片
$logo = “1.jpg”;//已经存在的图片

$QR = imagecreatefromstring(file_get_contents($QR));//根据字符串得来的图像
$logo = imagecreatefromstring(file_get_contents($logo));
$QR_width = imagesx($QR);//取得图像宽度
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
$logo_qr_width = $QR_width / 5;
$scale = $logo_width / $logo_qr_width;
$logo_qr_height = $logo_height / $scale;
$from_width = ($QR_width – $logo_qr_width) / 2;
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
header(“Content-type: image/png”);
imagepng($QR);//浏览器输出
imagedestroy($QR);
?>

PHP语言 switch中的continue

PHP语言,在循环体内部的switch中使用continue时,需特别注意。
for($i=0;$i<3;$i )
{
 switch($i)
 {
 case 1:
  continue;
  break;
 default:
  break;
 }
 echo $i;
}
以上代码运行结果为:012

运行结果为什么不是02 ?
这是因为continue结束的是switch语句而不是外层循环for。
如果想用continue结束外层for的本次循环,
需要使用continue 2

附:
switch(1)
{
case 1:
  echo 5;
  continue;
  echo 6;
  break;
default:
  echo 7;
  break;
}
代码执行结果为:5
即说明在单独的switch中,continue与break作用是相同的,但还是建议大家使用break;

AJAX学习笔记

一、json_encode()
该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:
  $arr = array (“a”=>1,”b”=>2,”c”=>3,”d”=>4,”e”=>5);
  echo json_encode($arr);
结果为
  {“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}
再看一个对象转换的例子:
  $obj->body = “another post”;
  $obj->id = 21;
  $obj->approved = true;
  $obj->favorite_count = 1;
  $obj->status = NULL;
  echo json_encode($obj);
结果为
  {
    ”body”:”another post”,
    ”id”:21,
    ”approved”:true,
    ”favorite_count”:1,
    ”status”:null
  }
由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。
二、索引数组和关联数组
PHP支持两种数组,一种是只保存”值”(value)的索引数组(indexed array),另一种是保存”名值对”(name/value)的关联数组(associative array)。
由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。
比如,现在有一个索引数组
  $arr = Array(“one”, “two”, “three”);
  echo json_encode($arr);
结果为:
  [“one”,”two”,”three”]
如果将它改为关联数组:
  $arr = Array(“1″=>”one”, “2”=>”two”, “3”=>”three”);
  echo json_encode($arr);
结果就变了:
  {“1″:”one”,”2″:”two”,”3″:”three”}
注意,数据格式从”[]”(数组)变成了”{}”(对象)。
如果你需要将”索引数组”强制转化成”对象”,可以这样写
json_encode( (object)$arr );
或者
json_encode ( $arr, JSON_FORCE_OBJECT );
三、类(class)的转换
下面是一个PHP的类:
class Foo {
    const ERROR_CODE = “404”;
    public $public_ex = “this is public”;
    private $private_ex = “this is private!”;
    protected $protected_ex = “this should be protected”;
    public function getErrorCode() {
      return self::ERROR_CODE;
    }
  }
现在,对这个类的实例进行json转换:
$foo = new Foo;
$foo_json = json_encode($foo);
echo $foo_json;
输出结果是
{“public_ex”:”this is public”}
可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。
四、json_decode()
该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:
$json = “{“foo”: 12345}”;
$obj = json_decode($json);
print $obj->{“foo”}; // 12345
通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:
$json = “{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}”;
var_dump(json_decode($json));
结果就是生成一个PHP对象:
object(stdClass)#1 (5) {
    [“a”] => int(1)
    [“b”] => int(2)
    [“c”] => int(3)
    [“d”] => int(4)
    [“e”] => int(5)
  }
如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:
$json = “{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}”;
var_dump(json_decode($json),true);
结果就生成了一个关联数组:
array(5) {

     [“a”] => int(1)
     [“b”] => int(2)
     [“c”] => int(3)
     [“d”] => int(4)
     [“e”] => int(5)
  }
五、json_decode()的常见错误
下面三种json写法都是错的,你能看出错在哪里吗?
$bad_json = “{ “bar”: “baz” }”;
$bad_json = “{ bar: “baz” }”;
$bad_json = “{ “bar”: “baz”, }”;
对这三个字符串执行json_decode()都将返回null,并且报错。
第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的”名”(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。
另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。
var_dump(json_decode(“Hello World”)); //null
六、应用举例
1.PHP代码
$result = $_POST;
echo json_encode($result);
1.JS代码
$.ajax({
    url: “**.php”,
    type: “POST”,
    data:{
     company_id        :”数据1″,
     statement_year :”数据2″   },
    dataType: “json”,
    error: function(){alert(“PHP文件读取失败”);},
    success: function(result){
         alert(result.company_id);//会显示“数据1”
         }
  });

discuzX2.5常见问题

1.更新过服务器无法显示页面

解决:更新服务器后要进到后台管理中心更新缓存

步骤:后台—>工具—>更新缓存。

2.换域名后用户头像不显示

解决:重新配置ucenter以及 discuz应用主要是配置文件 原先的头像引用地址是旧的

位置upload\config\config_ucenter你懂得!