月度归档 2015年6月30日

通过清心醉

opencart二次开发之MVC的结构及模板使用规则1

在这里假设我们要修改主页的内容:

首先先不去看控制器和模型的命名方式,我们直接看文件是如何调用的,走一圈先:

/catalog/controller/common/home.php

这就是主页的文件位置了

我们看看,以开始就有这么一个$this->document

$this->document这个类在opencart中是用于同一模板间变量传递的
common模板中引用到的3个基本的PHP文件有header.php home.php 和footer.php
最终这3个php文件会形成一个页面
而header和footer基本是固定的内容 那么每个页面的一些title和关键词以及引用JS,CSS等路径的变量就会在home.php中通过$this->document赋值 最终3个文件汇总到页面模板时候传入header.php
opencart引擎中所有的注册变量都是在data数组内 通过document这样的实例类来操作

class ControllerCommonHome extends Controller {
public function index() {
$this->document->setTitle($this->config->get(‘config_meta_title’));   //获取标题
$this->document->setDescription($this->config->get(‘config_meta_description’)); //获取元描述
$this->document->setKeywords($this->config->get(‘config_meta_keyword’)); //获取关键字
if (isset($this->request->get[‘route’])){
$this->document->addLink(HTTP_SERVER, ‘canonical’); //判断是否存在route的参数。比如我们返回主页的时候经常会看到类似index.php?route=common/home的
}

//下面开始就是调用控制器获取页面的参数
$data[‘column_left’] = $this->load->controller(‘common/column_left’); //获取左边栏
$data[‘column_right’] = $this->load->controller(‘common/column_right’); //获取右边栏
$data[‘content_top’] = $this->load->controller(‘common/content_top’); //获取顶部
$data[‘content_bottom’] = $this->load->controller(‘common/content_bottom’);  //英文不太好暂时不太懂
$data[‘footer’] = $this->load->controller(‘common/footer’); //获取脚部
$data[‘header’] = $this->load->controller(‘common/header’);  //获取头部

if (file_exists(DIR_TEMPLATE . $this->config->get(‘config_template’) . ‘/template/common/home.tpl’)) { //判断当前视图的模板文件是否存在,如果存在,把上面获取的参数数组传值过去
$this->response->setOutput($this->load->view($this->config->get(‘config_template’) . ‘/template/common/home.tpl’, $data));
} else { //如果不存在,使用系统默认的模板,并且传递参数数组
$this->response->setOutput($this->load->view(‘default/template/common/home.tpl’, $data));
}
}
}

前面已经访问了common内的header,footer,content_bottom,content_top,column_right,column_left 6个控制器并且获取了相应数据

而这些数据的使用就是直接使用对应的tpl模板,然后通过home.tpl调用出来:

我们来看home.tpl文件

<?php echo $header; ?>
<div>
<div><?php echo $column_left; ?>
<?php if ($column_left && $column_right) { ?>
<?php $class = ‘col-sm-6’; ?>
<?php } elseif ($column_left || $column_right) { ?>
<?php $class = ‘col-sm-9’; ?>
<?php } else { ?>
<?php $class = ‘col-sm-12’; ?>
<?php } ?>
<div id=”content”><?php echo $content_top; ?><?php echo $content_bottom; ?></div>
<?php echo $column_right; ?></div>
</div>
<?php echo $footer; ?>

在这里直接输出的是变量,可在home.php控制器里是$data[”]的数组,因为作者也是第一次接触opencart这种东西。

所以我怀疑的是opencart直接输出的其实就是数组的元素。 下文分解,同时开始了解MVC的控制流程及控制器的命名方式!

 

通过清心醉

opencart调用畅销/最新等产品的方法

显示8个最畅销产品,只需要调用:
$this->model_catalog_product->getBestSellerProducts(8)
显示最新的6个产品,可以这样使用:
$this->model_catalog_product->getLatestProducts(6)
最受欢迎的商品:
$this->model_catalog_product->getPopularProducts()
特价商品:
$this->model_catalog_product->getProductSpecials()

如果你有接触ECSHOP,你会很快的适应该方法
以上的方法首先获取产品的信息,返回到数组
比如我调用8个畅销的产品,返回是二维数组
这时候我们可以传值给tpl模板
然后使用foreach的方法来循环提取

比如:
控制器里我们这么调用畅销产品到数组
$arr=$this->model_catalog_product->getBestSellerProducts(8);
$this->load->view('default/template/xxxxxx.tpl', $arr);
这样就传值给了视图使用了,顺便指定个视图模板

显示指定的商品: 
$this->model_catalog_product->getProducts()
通过清心醉

OpenCart安装汉化

首先到Opencart的官网下载个压缩包,把uplocad上传到VPS/空间

修改根目录和admin目录的config-dist.php为config.php(这鄙视下作者怎么不用生成文件的方式而是用文件追加写入,估计是怕没有777的权限)

安装配置后

下载  汉化包

直接覆盖到根目录即可!

通过清心醉

LNAMP环境无法使用curl请求HTTPS

今天把网站移到了NGINX服务器内进行测试,结果发现无法请求HTTPS的微信扫描支付

忙活了大半天,一直以为NGINX+APACHE的CGI有问题

因为安装的是ECSHOP,使用的PHP版本是5.2

实在无奈的情况下,开启了两台虚拟机,并且实现curl -i进行https请求,以下是返回的结果:

PHP5.3以上的版本: 返回了200

[root@qingxinzui ~]# curl -i https://www.baidu.com/
HTTP/1.1 200 OK
Server: bfe/1.0.8.5
Date: Fri, 26 Jun 2015 07:00:08 GMT
Content-Type: text/html
Content-Length: 227
Connection: keep-alive
Last-Modified: Thu, 09 Oct 2014 10:47:57 GMT
Set-Cookie: BD_NOT_HTTPS=1; path=/; Max-Age=300
Set-Cookie: BIDUPSID=F793F4C31DFC52C0060BBE10533263B7; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1435302008; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
P3P: CP=” OTI DSP COR IVA OUR IND COM “
X-UA-Compatible: IE=Edge,chrome=1
Pragma: no-cache
Cache-control: no-cache
BDPAGETYPE: 1
BDQID: 0x855891be0001f8c6
BDUSERID: 0
Accept-Ranges: bytes
Set-Cookie: __bsi=2018999903383799926_00_200_N_N_80_0301_002F_N_N_N_0; expires=Fri, 26-Jun-15 07:00:13 GMT; domain=www.baidu.com; path=/

<html>
<head>
        <script>
                location.replace(location.href.replace(“https://”,”http://”));
        </script>
</head>
<body>
        <noscript><meta http-equiv=”refresh” content=”0;url=http://www.baidu.com/”></noscript>
</body>
</html>

 

再来看PHP5.2的版本:

[root@qingxinzui ~]# curl -i https://baidu.com
HTTP/1.1 302 Moved Temporarily
Server: bfe/1.0.8.5
Date: Fri, 26 Jun 2015 07:10:13 GMT
Content-Type: text/html
Content-Length: 160
Connection: keep-alive
Location: http://www.baidu.com/

<html>
<head><title>302 Found</title></head>
<body bgcolor=”white”>
<center><h1>302 Found</h1></center>
<hr><center>bfe/1.0.8.5</center>
</body>
</html>
[root@qingxinzui ~]#

直接给我返回302错误,害哥白辛苦了一个上午,居然就是版本太低估计不符合CURL的要求.使用的是CURL 7.19

看来想要完美的跑起ECSHOP,要么就是修改核心让ECSHOP支持5.3 要么就只能重置PHP环境,比如使用WAMP这种,或者重新安装过其他兼容版的CURL!

通过清心醉

Ecshop扫描二维码支付原理

连续折腾了3天,被腾讯的API接口搞的半条命了。最后还是被迫修改官方的SDK;

居然是二维码,自然要生成带短链接的URL图片。

大概流程

1:根据订单,公众号,商户号,KEY–》请求接口获取详细配置参数

2:通过第一次请求获取的参数,根据产品名称,价格(注意单位为分,记得要*100计算,订单号,随机数等,再次请求接口获取短链接

3:把短链接生成二维码;

4:为了实现页面跳转,实现AJAX请求判断是否支付成功。

有需要的用户直接到

我的网站

购买

通过清心醉

Nginx下Ecshop伪静态规则

注:如果您的Nginx里有多个站点,请针对单一vhost里的站点.conf写

if (!-e $request_filename)
{
rewrite “^/index\.html” /index.php last;
rewrite “^/category$” /index.php last;
rewrite “^/feed-c([0-9]+)\.xml$” /feed.php?cat=$1 last;
rewrite “^/feed-b([0-9]+)\.xml$” /feed.php?brand=$1 last;
rewrite “^/feed\.xml$” /feed.php last;
rewrite “^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)(.*)\.html$” /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /category.php?id=$1&brand=$2&page=$3&sort=$4&order=$5 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$” /category.php?id=$1&brand=$2&page=$3 last;
rewrite “^/category-([0-9]+)-b([0-9]+)(.*)\.html$” /category.php?id=$1&brand=$2 last;
rewrite “^/category-([0-9]+)(.*)\.html$” /category.php?id=$1 last;
rewrite “^/goods-([0-9]+)(.*)\.html” /goods.php?id=$1 last;
rewrite “^/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /article_cat.php?id=$1&page=$2&sort=$3&order=$4 last;
rewrite “^/article_cat-([0-9]+)-([0-9]+)(.*)\.html$” /article_cat.php?id=$1&page=$2 last;
rewrite “^/article_cat-([0-9]+)(.*)\.html$” /article_cat.php?id=$1 last;
rewrite “^/article-([0-9]+)(.*)\.html$” /article.php?id=$1 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html” /brand.php?id=$1&cat=$2&page=$3&sort=$4&order=$5 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html” /brand.php?id=$1&cat=$2&page=$3 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)(.*)\.html” /brand.php?id=$1&cat=$2 last;
rewrite “^/brand-([0-9]+)(.*)\.html” /brand.php?id=$1 last;
rewrite “^/tag-(.*)\.html” /search.php?keywords=$1 last;
rewrite “^/snatch-([0-9]+)\.html$” /snatch.php?id=$1 last;
rewrite “^/group_buy-([0-9]+)\.html$” /group_buy.php?act=view&id=$1 last;
rewrite “^/auction-([0-9]+)\.html$” /auction.php?act=view&id=$1 last;
rewrite “^/exchange-id([0-9]+)(.*)\.html$” /exchange.php?id=$1&act=view last;
rewrite “^/exchange-([0-9]+)-min([0-9]+)-max([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /exchange.php?cat_id=$1&integral_min=$2&integral_max=$3&page=$4&sort=$5&order=$6 last;
rewrite “^/exchange-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /exchange.php?cat_id=$1&page=$2&sort=$3&order=$4 last;
rewrite “^/exchange-([0-9]+)-([0-9]+)(.*)\.html$” /exchange.php?cat_id=$1&page=$2 last;
rewrite “^/exchange-([0-9]+)(.*)\.html$” /exchange.php?cat_id=$1 last;
}

通过清心醉

Nginx出现502和504错误页面的缓解方法

为什么说是缓解,因为会出现错误要么就是带宽不够要么就是资源不够,除非无止境的加强硬件的配置,否则只能缓解服务器的性能优化

注:改方法针对任意Nginx(包括WDCP这种LNAMP一键安装环境)

首先修改nginx/conf/nginx.conf文件 准确目录不提供了,因为yum安装和LNAMP不一样,但NGINX后面目录是相同的.

在http{ 这里面写上下面的红字内容

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;

}

因为504的错误是根本没有请求到网关,这里我们设置下超时的时间等参数,可以缓解下

然后是502的,502错误的网上很多了.

修改nginx/conf/php-fpm.conf里的两个参数

max_children = 50

request_terminate_timeout = 1000

#注,如果你使用的是LNAMP环境,修改nginx_php/etc/里的就可以.

max_children为php-cgi进程的数量,我用Magento这个大家伙基本也就24MB,1G内存的话其实设置为40比较好,这样php-cgi进程多了,处理速度就会快很多.否则处理不过来就出现了502

request_terminate_timeout为时间限制,如果不设置参数,php-cgi就会一直执行下去,如果像magento这种大家伙,不设置个时间那么php-cgi就会一直执行下去直到死掉,一死掉就又出现了502的错误了.

通过清心醉

LNAMP升级Nginx+Php+Mysql

LNAMP的组合的配置规则,其实好比WAMP的多PHP版本选择

比如MYSQL,有个默认的MYSQL配置,可以使用的是MYSQL5.1,但如果有升级安装MYSQL5.5

目录就会存在有:MYSQL,MYSQL5.1,MYSQL5.5

而默认的MYSQL就是当前使用的

好了言归正转

升级脚本

解压后,直接执行sh php_up53.sh

sh mysql_up55.sh

sh nginx_up.sh 1.8.0 #针对这个,以后可以根据NGINX发行的版本进行无止境的升级! 资料来自于网上

 

升级估计要2个钟的时间,PHP和MYSQL比较大,具体看你的VPS配置了.

针对升级MYSQL无法使用的问题:

vi /www/wdlinux/init.d/mysqld

查找:basedir= datadir=

修改为:

basedir=/www/wdlinux/mysql

datadir=/www/wdlinux/mysql/var

即可

 

通过清心醉

wdcp安装配置及安全问题解决方案

最近安装Ecshop,因为对PHP的版本要求比较低,又懒的配置服务器,于是使用快速LNAMP的部署环境.

安装也简单,解压直接执行脚本就可以自动安装.

然后通过访问IP:8080端来进入后台

先来说说创建站点吧

有一个是创建整站(包括WEB,FTP,MYSQL),一般是用于个人租了VPS做空间使用的多点.设置不同的数据库和FTP及站点目录的访问用户/密码.

当然这不是作者要说的,不过创建新站点雷同,只是新站点不受FTP,MYSQL限制,直接使用ROOT权限.

创建站点,需要弄以下几个:

1 域名:

2 绑定域名(比如带www和不带www,如果你的网站不支持跳转后面可以设置302)

3 目录(必须在写的目录里面的public_html文件夹里放站点资料)

4 使用IP(针对VPS多IP的解决方法,在系统设置里填写IP即可.)

 

至于还有一个就是安全问题,设置后台访问域名和端口,简直就是做废.

人家知道你的网站是WDCP做的,只要猜解端口,直接后面加上/phpmyadmin或者用IP的方式直接就可以打开PHPMYADMIN的访问页,等于直接暴露MYSQL给人家暴力破解,更无奈的是,如果后台被入侵,WDCP后台有执行SSH的权限,人家可以直接把你VPS给拿下.

说到这里,很多人会想到拦截,什么办法最好呢?当然拉

linux特有的.htaccess

直接在.htaccess写上访问IP,需要登陆的时候时候SSH连接修改下确.htaccess里面的文件允许IP即可.

通过清心醉

HTTP无法启用之443占用

虽然安装了Windows和Linux下APACHE+PHP+MYSQL服务,但为了更好的进行测试,选择在WINOWS下安装个虚拟机来进行LINUX平台架设.

当VM内安装好了CENTO后,本机起用HTTP时却错误,原来是443端口被占用.

因为安装VM的时候有个HTTPS端口 这时候我们修改下APACHE的HTTPS端或者安装VM的时候修改下HTTPS端即可!

通过清心醉

Magento重写URL之重建索引

前几天写了个中文URL的插件,包括中文及其他字符允许

比如作者的网店  点击查看MAGENTO之URL

其实重写过后,重新刷新索引或者没用,这时候

用phpmyadmin进入magento数据库

找到core_url_rewrite表段,然后选择”清空”

之后重新在后台进行索引即可!

通过清心醉

Ecshop-二维码分享mobile和电脑端同步

由于Ecshop的mobile端使用了MVC的分层,而二维码的扫描生成的时候是根据电脑端的产品ID进行截取,然后转化为mobile端的URL。

比如我有个产品,产品的电脑端URL为127.0.0.1/goods.php?id=100;

作者根据产品的ID,重写为mobile的地址:

$id=$_GET[‘id’];
if(isset($id)&&!empty($id))
{
if(is_numeric($id))
{
$url=”http://127.0.0.1/mobile/index.php?m=default&c=goods&a=index&id=”.$id;
}
}

这样就有个小小的问题,因为Ecshop不是使用自适应(如果是MAGENTO,根据URL就自动跳转合适的分辨率)。

如果用户电脑端访问,那就看的很难看了!

从URL里可以看出使用goods控制器的index方法

我们可以在方法里这么写

$id=$_GET[‘id’];
if(isset($id)&&!empty($id))
{
if(is_numeric($id))
{
$ua = strtolower($_SERVER[‘HTTP_USER_AGENT’]);
$uachar = “/(nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|cldc|midp|mobile)/i”;
if(($ua == ” || preg_match($uachar, $ua))&& !strpos(strtolower($_SERVER[‘REQUEST_URI’]),’wap’))
{

}
else
{
$url=”http://127.00.1/goods.php?id=”.$id;
echo “<script>setTimeout(\”this.location=’$url’\”,1);</script>”;
}
}
}

 

 

通过清心醉

Ecshop用户未登陆购买产品二次开发

默认的用户登陆,都是在user.php文件里执行。

可产品购买流程等,都是在flow.php里执行,如果用户没有登陆,会GET请求回flow.php本页的step=login。

然后大约264行有这么一句:if ($user->login($_POST[‘username’], $_POST[‘password’],isset($_POST[‘remember’])))

#在这严重鄙视下EC,面向对象的思维根本就没完整。在user.php里做了用户名/邮件/电话号码及二维码图片登陆,导致我这里又要重写一个。

首先写个手机判断方法:

function is_telephone($phone)
{
$chars = “/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$/”;
if (preg_match($chars, $phone))
{
return true;
}
else
{
return false;
}
}

然后::修改IF语句:if ($user->login($_POST[‘username’], $_POST[‘password’],isset($_POST[‘remember’])))

改为:

$username=$_POST[‘username’];
if(is_email($username)) //首先判断是否符合邮件
{
$sql =”select user_name from “.$ecs->table(‘users’).” where email='”.$username.”‘”; //SQL语句
$username_e = $db->getOne($sql); //如果有存在的数据赋值给变量
if($username_e) //如果存在不为空的话
{
$username=$username_e; //重新赋值
}
}
if(is_telephone($username))
{
$sql =”select user_name from “.$ecs->table(‘users’).” where mobile_phone='”.$username.”‘”;
$username_e = $db->getOne($sql);
if($username_e)
{
$username=$username_e;
}
}
if ($user->login($username, $_POST[‘password’],isset($_POST[‘remember’])))
{
update_user_info(); //更新用户信息
recalculate_price(); // 重新计算购物车中的商品价格

// 检查购物车中是否有商品 没有商品则跳转到首页
$sql = “SELECT COUNT(*) FROM ” . $ecs->table(‘cart’) . ” WHERE session_id = ‘” . SESS_ID . “‘ “;
if ($db->getOne($sql) > 0)
{
ecs_header(“Location: flow.php?step=checkout\n”);
}
else
{
ecs_header(“Location:index.php\n”);
}

exit;
}

同时为了方便提醒用户可以以上三种方法登陆;

修改flow.dwt文件:找到对应的input添加:

placeholder=”用户名/邮箱/手机号”

 

通过清心醉

Ecshop使用积分购买产品

一说起积分,大家都不陌生了。在商店了购买产品送积分,然后通过积分兑换产品或者使用积分代替现金购买产品。那么Ecshop里的积分规则又是如何呢?

在数据库users表段里有这么一个字段->pay_points,就是用来存储用户的积分数据的。

先来说说积分是如何产生的:

当用户购买一件价格为¥500产品的时候,下了订单成功,并且成功支付了,当从第三方收款返回来的时候,自动更新订单状态。同时以产品的价格(¥500,如果价格为¥500.5,也当500计算)写入pay_points字段内,表示用户已经有了500的积分。

生成积分的公式:

1元=1积分;10元=10积分;依此类推

至于积分的使用就不同了。

作者说过了,积分可以用来代替现金用来购买产品。

比如后台上传这么一个产品,

产品价格:200.00

积分购买金额:10

当加入购物车进行结算生成订单的时候,有这么一项:其他信息->使用积分购买

假设用户有2000积分,但最高只能使用1000,为什么呢?产品后台不是设置了积分购买金额=10吗?

因为那是积分的元数,其实就是10元

积分购买金额其实就是=参数*100;所以如果设置为10,最多可以用1000积分来享受优惠。

等下了订单的时候,产品的价格就为190元了。因为积分已经使用了1000代替10元。

虽然这价格显示是190元,但如果用户成功的购买之后,返送的积分其实还是200,在这ecshop使用产品自身价格来做积分获取,不管使用了多少积分都是如此。

如果用户下了订单,不付款,积分会一直扣住不返回,这时候只需要用户自行登陆取消订单,或者后台管理人员对久未付款的订单进行无效的时候,积分进行返回!

 

通过清心醉

PHP进行POST请求

今天做开发,涉及到了一个问题点,就是开发的微信登陆,验证了OPENID的合法性之后,需要进行登陆.

因为本身使用的电子商城已经有接收$_POST的用户参数.

而我是页面上直接请求,没有AJAX.

下面是方法:

###################################################################
//利用PHP进行POST请求
###################################################################
function qxz_post($url, $data)
{
$postdata = http_build_query($data,”, ‘&’);
//http_build_query方法里后面两个参数是过滤空格和&符号,因为传递的值是:a=1&b=2.这样接收的时候POST的名字就不同了!
$post = array
(‘http’ =>array( ‘method’ => ‘POST’,’header’ => ‘Content-type: application/x-www-form-urlencoded’,’content’ => $postdata));
$context = stream_context_create($post);
$result = file_get_contents($url, false, $context);
return $result;
}

然后构造请求的数组:

$data=array(‘password’=>’mima123′,’username’=>’清心醉’,’remember’=>’5′);
$url=’http://127.0.0.1/user.php?act=act_login’;
echo $this->qxz_post($url, $data);

通过清心醉

Ecshop时间戳设置原理

其实正确的来说应该是UNIX的时间戳.ECSHOP使用了该方法来记录时间,说真的,多此一举!

再进行二次开发的时候,看到很多本是使用时间存储数据,可偏是一堆堆的数字.

其实ECSHOP在写入MYSQL的时候,先获取当前的系统时间.(当然时区要设置为+8,如:ini_set(‘date.timezone’,’Asia/Shanghai’);)

比如获取的时间变量$time.经过strtotime($time)后就变成了时间戳,具体时间戳的开始计算时间自行GOOGLE.

写入之后就是一串数字了.

然后提取出来的时候.

比如:

$t=1431394669; //
echo date(‘Y-m-d H:i:s’, $t);

就还原出来了.

通过清心醉

Ecshop禁止名字内包含某字符

为什么这么写?其实很多人都会拉

strstr()的方法就可以搞定。

今天做微信的扫描登陆,其中有一个最让我头疼的,默非就是用户名的重复了。

通过微信扫描登陆获取的openid,判断数据库是否存在,如不存在,则创建新的用户。

用户名作者是使用了作者的网名小写qxz_+用户最大的ID+1

比如微信扫描之后,系统要添加一个用户(当前用户的最大ID为23)

那么生成的用户帐户就是qxz_24的了。问题来了,如果用户自行注册的话,已经申请了qxz_24的名字,那这就会产生BUG了,虽然你也可以进行ID+1的方式,那就很不好了。

所以修改下文件,禁止名字中包含有”qxz_”这4个字段

1:修改user_passport.dwt模板,找到注册的那一块,在JS里进行判断。(当然也可以不用,毕竟这里不写入数据库)

2:修改user.php文件

找到:$username = isset($_POST[‘username’]) ? trim($_POST[‘username’]) : ”;

在下面加入:

if(strstr($username,’qxz_’)) //判断是否包含微信登陆特有的
{
echo “名字包含qxz_,禁止注册”;exit;
}

这样,qxz_的名字前缀就专门可提供给微信登陆的用户使用了。

如果有mobile端的

查找到你的注册PHP文件,如果有使用MVC的话我相信你看的懂上面的了很快就能找到了。

比如作者的,MVC里对$username有用户名/手机/邮箱的判断注册

为了保险起见,在3个判断之后,我在进行一次

if(strstr($username,’qxz_’)) //判断是否包含微信登陆特有的
{
echo “名字包含qxz_,禁止注册”;exit;
}

的判断,保证有该字段的名字/邮箱(电话肯定更不用说了,正则都过不去!)不会存在qxz_;

通过清心醉

PHP向服务器发送请求

今天给ECSHOP二次开发,增加扫描登陆的功能。

却在一个问题点上卡死了。

官网说了请求到某页面,然后获取返回的JSON数据。

以往如果我们是使用JAVASCRIPT进行请求的话,返回的数据是在页面上显示的。

算是用上了一个新的方法:

$get_url=file_get_contents($url); //发出请求并接收返回值
$data=(array)json_decode($get_url,true);//JSON解码到数组

这里的$url就是定义的请求地址和参数,通过file_get_contents进行请求发送,接收返回值给$get_url

然后通过json_decode进行解码,虽然前面有定义array,但如果强制转化为数组,json_deconde的第二个参数为true即可。

通过清心醉

是什么问题导致UC游览器里不能看爱奇艺视频

因为客户的流失?还是其他关系呢?

最近回去了用UC游览器看iqiyi的视频,直接弹出不能观看,然后就有个安装UC自己的播放器的?

我就纳闷了,系统自带的都能看,你UC的不能看?

果然啊,国内的软件都这鸟德性,大多没有那么一点点的道德,没有那么一点点的素质.

果断删除,直上GOOGLE APP.

通过清心醉

xampp老版本SQL乱码问题

以前用XAMPP1.8开始的版本做MAGENTO的测试环境,MYSQL乱码的话,只需要在my.ini文件里修改下配置就是了

如:

mysql ::default-character-set=utf8
mysqld ::character-set-server=utf8
client ::default-character-set=utf8

当然针对Linux版的 ,也可以修改my.cnf文件。

公司使用的商城,使用的是PHP5.3以前的版本,XAMPP支持5.3以内最后一个版本就是1.7.1了,因为懒,懒的不想自己来配置,使用1.8版本的方式修改MYSQL的配置,一样还是乱码,这时候怀疑是导入数据的时候编码的问题。

我们在连接数据表导入的时候,加多一句

如:mysql -u root -p qingxinzui;

改为:mysql -u root -p qingxinzui –default-character-set=utf8;

强制修改为UTF8的格式,就可以很好的导入数据了。