经验分享-移动端固定输入框到底部兼容问题

很久没写教程啦,说好的手机模板开发也拖到前天才开始(虽然核心之前写了),可想而知不是一般的忙。至于赚了多少钱嘛就不提了,都是泪。所以还是分享下这次的经验吧。由于需要开发手机模板,把搜索和菜单做成一个类似微信的模式,于是乎如下图。

是不是很棒棒,感觉自己帅帅哒。点搜索会进入输入框,也可以切换回来。但是,,,点击输入框后会弹出输入法,如果用微信,QQ浏览器发现没问题,可是夸克浏览器(UC旗下)就有问题了。出现如下图界面。。。

一看就知道兼容问题啦。我先贴一下样式代码。大概如下:

  1. #search {
  2.     displayblock;
  3.     height48px;
  4.     z-index: 10;
  5.     positionfixed;
  6.     bottom: 0
  7.     left: 0;
  8. }

可是这种兼容问题挺尴尬的,一方面我越来越少写前端了,另一方面这种在手机上才能模拟的现象一时半会不知道怎么调试,由于周末出差,于是搁置先忙其他。今天下午想着不行啊这个必须解决才有动力继续下去。搜索了很多资料,方法都试了不可行。不过有一个方案倒是不错。如下:

 

但是我发现这一样行不通,于是我在想,能不能判断下,来定义bottom?ennnnnn,不对,定义top?于是乎:

  1. <script type=“text/javascript”>
  2.     var winHeight = $(window).height(); //获取当前页面高度
  3.     $(window).resize(function() {
  4.         var thisHeight = $(this).height();
  5.         if (winHeight – thisHeight > 50) {
  6.             $(‘#search’).css(‘top’, ‘0’);
  7.         } else {
  8.             $(‘#search’).css(‘top’, ‘auto’);
  9.         }
  10.     });
  11. </script>

这样成了,点击输入框它跑置顶上面去了,这不是和前面搜索到的不喜欢的方案一个道理了嘛?要么,展开一个阴影层,然后顺便加点关键词上去?感觉是下下策。既然可以重新获得屏幕高度,那么屏幕高度减去底部高度48不就可以了?

  1. <script type=“text/javascript”>
  2.     var winHeight = $(window).height(); //获取当前页面高度  
  3.     $(window).resize(function() {
  4.         var thisHeight = $(this).height();
  5.         newHeight = thisHeight – 48; //屏幕高度减去48得到的高度
  6.         if (winHeight – thisHeight > 50) {
  7.             $(‘#search’).css(‘top’, newHeight);
  8.         } else {
  9.             $(‘#search’).css(‘top’, ‘auto’);
  10.         }
  11.     });
  12. </script>

感觉就是棒棒哒的思路有没有?可是现实是,不行,而且,可笑的事实是 +48!!!而不是 -48 ???这哪根葱的道理哇???不合理但是就是解决了问题了。。。于是乎QQ和微信看了下,确实不对,再改回去-48的话,嗯,就没毛病了。。。所以一个+一个-?那,判断下浏览器就好了?然后我想了个问题,我好像始终只测试了QQ、微信、夸克?然后测试了谷歌浏览器、QQ浏览器、UC浏览器、发现-48是对的。唯独夸克奇葩。。那好吧,我,,,最终这样。。。

ennnnnnnn,这次,,,算是完美了。各种浏览器测试没问题。哦对了,补充下,我换安卓了。自然上面是兼容安卓的:QQ、微信、QQ浏览器、UC浏览器、夸克浏览器、谷歌浏览器、系统浏览器。至于IOS嘛,嗯,,要找下身边的人借一台看看了。如有后续再补充。

另外附上一个如何判断夸克浏览器的标识信息方法,自己打印出来的。上图有判断方法,光标位置上就是,有需要可以记录下来。

最后附上完美解决的截图:

 

css/js 图片自适应、自动满屏和拉伸问题解决

网站要自适应,其中一个工作就是必然要对图片的宽度进行处理。一般来说,网站图片插入的时候,编辑器会自动增加width和height的值,也就是图片的宽度高度,虽然可以去掉,也可以定义,但是也比较麻烦。下面给出几个方案

自适应大小

首先通过浏览器-审核元素-定位到img图标标签的上一层DIV,或者直接把所有图片的宽度都自适应。直接用img也可以。

上面图片可以看出定位到 .tab-content ,那么代码如下:

  1. .tab-content img {
  2. max-width:  100%;
  3. widthauto;
  4. heightauto;
  5. }

这里的max-width是定义最大宽度,也就是最大的宽度是多少,可以是固定值也可以是比例。

自动满屏

上面这个方法,有时候在屏幕比较大的时候,图片又显得比较小了。比如图片750px,实际的地方又按照比例分配剩下比较大的空间,想填充满屏,或者几乎满屏,可以这样。

  1. .tab-content img {
  2.     max-width100%;
  3.     widthauto;
  4.     heightauto;
  5.     min-width100%;
  6. }

这里介绍下,min-width 是定义最小宽度,也就是最小显示多少,可以是固定的值也可以是百分比。

图片拉伸解决

就象前面所说的,也是这个文章重点写的(毕竟上面的内容网上应该还是很多介绍的)。插入图片会自动载入宽度高度。定义了宽度,高度就会拉伸,但是页面又是就近原则处理的,也就是会收到height的影响。那么我们可以去掉这个高度吗?手工去掉显然太麻烦。所以用JS。

  1. var arr = $(‘img’);
  2. arr.each(function() {
  3.    $(this).css(‘height’,’auto’);
  4. });

上面这个方法,可以给img标签添加height=”auto”的定义。这样如果原来有定义高度的会被覆盖掉。

PS:需要jquery库的支持哈。

WHMCS 7.x 开发小经验小结-修改首页、修改菜单、简化注册

WHMCS是个很出名的IDC供应商管理系统,但是由于是加密程序,很多东西改起来不容易。比如你想做个注册页面,你就没法子做,因为你不知道密码的加密方式。不过有一些东西还是可以自定义的。

自定义首页

由于是加密程序,所以index.php你无法修改,怎么办呢?下面提供几个方案解决这个问题。

子站处理

要么把whmcs放一个子域名,比如user.xx.com

要么把whmcs放一个子目录,或者www.xx.com/user/

但是这两种建议是安装之前想好,否则的话,就要去更新授权了。要去购买的地方提交更改。

默认首页处理

静态首页:直接放index.html,一般这个会是默认首页。

动态首页:修改nginx或者apache服务器的配置文件,让默认首页改为home.php

  1. # nginx 例子
  2. server_name sdtclass.com blog.xukhost.com;
  3. index home.php index.html index.htm index.php default.html default.htm default.php;

如果是虚拟主机,并且是apache服务器的,也可以用.htaccess定义默认首页。

  1. # .htaccess例子
  2. Directory Index home.php index.html index.php

重写index.php

有的人不喜欢重写定义首页,比如我。因为潜意识里index才是首页呢。而且WHMCS里,首页也是指向index.php,所以我提供了另一个思路。

保存index.php,然后新建一个index.php,这样可以自定义首页的内容了。但是,,,WHMCS比较新的版本里,很多地址打开都依赖index.php。所以我们需要做一个处理。

比如公告页面的菜单连接是:index.php?rp=/announcements

但是,其实 http://blog.xukhost.com/announcements.php 就可以打开(不用复制了,这是举例)。代码又是加密的,我们又无法修改菜单里的连接,怎么办呢?所以我们只好写个PHP来处理了。

  1. <?php
  2. //判断是否有参数
  3. if($_GET) {
  4.     //rp参数
  5.     $url = $_GET[‘rp’];
  6.     //判断是否是rp这个参数
  7.     if($url) {
  8.         //重定向
  9.         Header(“Location: $url.php”);
  10.         exit// 退出
  11.     }
  12. }
  13. ?>
  14. //如果上面不成立,会输出下面内容。下面是首页内容

测试了可行是可行,发现下载页的不一样,不是download.php,而是downloads.php。于是。。

  1. <?php
  2. if($_GET) {
  3.     $url = $_GET[‘rp’];
  4.     if($url) {
  5.         //判断是否是下载页,如果是则定义链接。
  6.         if($url == ‘/download’) {
  7.             Header(“Location: downloads.php”);
  8.             exit;
  9.         }
  10.         Header(“Location: $url.php”);
  11.         exit// 退出
  12.     }
  13. }
  14. ?>
  15. // 首页内容

然后好像就完美了?后来发现,不行啊,有的带id参数啊。于是乎用了stripos函数,这个函数是用于判断字符串里是否有这个字符。

  1. stripos(string,find,start)

可以参考:http://www.php.net/manual/zh/function.stripos.php

或者参考:http://www.w3school.com.cn/php/func_string_stripos.asp

实际应用如下:

  1. <?php
  2. if($_GET) {
  3.     $url = $_GET[‘rp’];
  4.     if($url) {
  5.         if($url == ‘/download’) {
  6.             Header(“Location: downloads.php”);
  7.             exit;
  8.         }elseifstripos($url, ‘/announcements/’) !== false){
  9.             //判断如果URL含有这部分字符,也就是新闻页的字符
  10.             $pid = mb_substr($url,15 ); //提取第15个和后面的,也就是id
  11.             Header(“Location: announcements.php?id=$pid”);
  12.             //重定向到重新拼接的URL
  13.             exit;
  14.         }
  15.         Header(“Location: $url.php”);
  16.         exit// 退出
  17.     }
  18. }
  19. ?>
  20. // 首页内容

你以为事情真的那么简单吗,我也想啊。。然后我发现帮助中心的URL就比较特殊了。。

比如:http://www.xukhost.com/index.php?rp=/knowledgebase/15/755.html

好吧,这个,,只能正则了。。于是。。

  1. <?php
  2. if($_GET) {
  3.     $url = $_GET[‘rp’];
  4.     if($url) {
  5.         if($url == ‘/download’) {
  6.             Header(“Location: downloads.php”);
  7.             exit;
  8.         }elseifstripos($url, ‘/announcements/’) !== false){
  9.             $pid = mb_substr($url,15 );
  10.             Header(“Location: announcements.php?id=$pid”);
  11.             exit;
  12.         }elseif(preg_match(‘#/knowledgebase/(\d+)#i’, $url$match)) {
  13.           $pid = $match[1];
  14.             Header(“Location: knowledgebase.php?action=displayarticle&id=$pid”);
  15.             exit;
  16.         }
  17.         Header(“Location: $url.php”);
  18.         exit// 退出
  19.     }
  20. }
  21. ?>
  22. // 首页内容

定义引用

经过这样的反复,反复,再反复,我都怀疑人生了。。。我觉得不行吧,既然能让index.php处理,何不直接让他处理呢?

所以也可以是,,,index.php改名,新的index判断是否有参数,如果是就引用这个,不是则输出首页内容。。

好吧,你以为我耍你们呢,其实这两个方案都是可以的。上面那个21行的代码暂时测试没问题。两个方案二选一啦。

自定义菜单

看了很久的模板代码,发现个问题,WHMCS新版本的菜单都是系统生成的了。。。但是,游客访问的话,菜单第一个是指向index.php,而登陆后的话,则是指向会员中心页,你说我这个地方翻译成什么都尴尬好吧?

后面我发现了,其实写死就好了。。。自己利用模板提供的判断方法,判断和引用即可。。

  1. {if $loggedin}
  2.     <ul class=“nav nav-menu”>
  3.         {include file=“$template/includes/menu.tpl” navbar=$primaryNavbar}
  4.     </ul>
  5. {else}
  6.     <ul class=“nav nav-menu”>
  7.         {include file=“$template/includes/menus.tpl”}
  8.     </ul>
  9. {/if}

上面menu.tpl是自带的,我写了个新的menus.tpl,然后这个新的就可以自己写菜单了。。。当然了,登陆页的菜单,也可以引用另一个文件来解决。这样两个菜单就都可以自定义了。不带navber参数即可。

简化注册

这个利用两个东西,一个是隐藏,一个是赋值。

比如,公司,地址2,这两个输入框不是必填,直接隐藏。

  1. <div class=“form-group” style=“display: none;”>
  2.     <label class=“col-sm-3 control-label” for=“companyname”>{$LANG.clientareacompanyname}</label>
  3.     <div class=“col-sm-6”>
  4.         <input type=“text” name=“companyname” id=“companyname” value=“{$clientcompanyname}” class=“form-control”/>
  5.     </div>
  6. </div>

上面用CSS(display:none;),隐藏了整个输入框。可是呢必填项不仅仅要隐藏,而且要加默认值,这样就可以避免不填写带来的无法跳过验证了。(不加密多好,可以直接去掉判断字符串长度。。。)

  1. <div class=“col-sm-6”>
  2.     <input type=“text” name=“city” id=“city” value=“city” class=“form-control” {if !in_array(‘city’, $optionalFields)}required{/if} />
  3. </div>

这个value里的变量,改为写死的city,这时候就可以了。变量囊是你填写后注册不了的时候返回才输出的。所以改为写死的,然后加css隐藏即可。【不过我不建议隐藏,因为域名注册需要。】

官方文档和API

当然了,WHMCS官方也有提供API,可以修改的东西还是有不少的。也可以做插件的。

官方文档:https://docs.whmcs.com/Main_Page

API文档:https://developers.whmcs.com/api/

PHP技巧-支付宝公钥自动整理工具开发思路和完整代码

写了上一篇文章之后,心血来潮想写个页面,做个便民工具什么的。就算声明不会存储他人密钥,可是万一别人还是不放心呢?赖上我怎么办?授人以鱼不如授人以渔嘛,本站的核心就是这个啊。所以~~~

截取函数

首先,要把这个东西整理出来,我们要让这个支付宝公钥变成四个部分,也就是三行64,一行24。第一个想到的方法是跑循环,可是我觉得没必要吧,一来我没想到什么函数适合,二来我其实心底里有个很熟悉的函数,那就是“mb_substr”这个啦。以前改过不少模板的时候,经常会用这个函数的。

官方文档:http://php.net/manual/zh/function.mb-substr.php

先来介绍下,mb_substr这个函数有四个参数:

参数 作用
str 必填,要截取的字符串变量
start 必填,开始的位置,指针第一个是0
length 可选,截取的数量,从开始位置计算,如果没这个参数则取到结尾
encoding 可选,编码格式,如果没指定则使用内部字符编码

用法示例

首先把密钥赋值给一个变量,然后用这个函数来截取字符串,再赋值变量,然后输出。

代码如下:

  1. //把密钥赋值给 $key 
  2. $key = ‘MIGfMA0G*******DAQAB’;
  3. //用mb_substr处理
  4. //把$key从第一个开始,也就是指针0,截取64个,编码UTF8
  5. $key1 = mb_substr( $key, 0, 64, ‘utf-8’);
  6. //输出变量的值
  7. echo $key1;

注意一点是,指针从0开始,所以0就是第一个,那么,64就是第65个。所以第二行的话应该这么写:

  1. //错误写法
  2. $key2 = mb_substr( $key, 65, 64, ‘utf-8’);
  3. //正确写法
  4. $key2 = mb_substr( $key, 64, 64, ‘utf-8’);

由于密钥都是字母数字和特定符号,不会出现中文或特殊符号,所以其实编码是可以不声明的,不过为了以防万一可以全局声明下,这样就不用写太多无用的定义了。代码有时候需要简洁点好。最后一个只剩下24,所以也可以不用声明了。

  1. //声明编码
  2. header(“Content-type: text/html; charset=utf-8”);
  3. //截取最后一段
  4. $key4 = mb_substr($key, 192);
  5. //或者
  6. $key4 = mb_substr($key, 192, 24);

完整代码

下面是完整代码,复制代码到记事本,替换$key里面的值,改为你的密钥,然后重命名为key.php。把文件放在PHP主机环境下运行打开即可得到转换后的内容,然后直接复制内容做成支付宝公钥。

  1. <?php
  2. header(“Content-type: text/html; charset=utf-8”);
  3. //替换括号里的内容。
  4. $key = ‘MIGfMA0G*******DAQAB’;
  5. $key1 = mb_substr($key, 0, 64);
  6. $key2 = mb_substr($key, 64, 64);
  7. $key3 = mb_substr($key, 128, 64);
  8. $key4 = mb_substr($key, 192);
  9. echo “—–BEGIN PUBLIC KEY—–<br>”;
  10. echo $key1.“<br>”;
  11. echo $key2.“<br>”;
  12. echo $key3.“<br>”;
  13. echo $key4.“<br>”;
  14. echo “—–END PUBLIC KEY—–<br>”;
  15. ?>

扩展阅读

1,由于证书格式规定,所以加了第12行和17行;

2,PHP中,多个变量或字符串之间,用“.”连接起来;

3:如果第三个参数没设定,第四个请勿设定,否则报错;

4:这个函数如果未开启,请在php.ini里修改开启。

开启方法,搜索“php_mbstring”,把;extension前面的分号去掉。然后重启环境。

5:如果想验证长度,可以利用另一个函数“strlen”。

  1. echo strlen(trim($key1)).’–‘;
  2. echo strlen(trim($key2)).’–‘;
  3. echo strlen(trim($key3)).’–‘;
  4. echo strlen(trim($key4));

实际如出如图

PHP DEBUG技巧-Division by zero报错处理

这几天有个opencart客户买了个模板,由于是新手要我帮忙装和调试,一开始说有个什么错误,可是我去看没发现。我是中文看的,英文下才有报错。

由于是付费买正版,发现问题也着急,应该是找作者解决的,找半天没找到作者联系方式。由于也是老客户了,反正也不会是大问题,还是我自己看看吧。下面进入正题,不BB了。

错误提示

在打开某些产品分类或者某些产品页面的时候,特定语言才报错。

错误是:Division by zero in 巴拉巴拉

错误原因

这个错误的原因,就是运算的过程中,被除数是0。上过小学的都知道“0是不可以作为被除数的”。

解决思路

1:判断值为0的时候跳过运算;

2:如果非要赋值给一个变量,可以做判断后赋固定值或者输出false,后面代码判断如果变量是true才使用它进行下一步代码的实现。

DEBUGING

解决问题之前,先来个两个小知识点:

1、在opencart中,vqmod的优先等级是最高的

2、哪里报错不一定错误就在哪里,但是首先看的还是报错的地方。

从上图中,我们找到了vqcache下对应的文件对应行数,发现如下代码:

  1. // Cosyone custom code starts   
  2. if ((float)$result[‘special’]) {
  3.     $sales_percantage = ((($this->tax->calculate($result[‘price’], $result[‘tax_class_id’], $this->config->get(‘config_tax’)))-($this->tax->calculate($result[‘special’], $result[‘tax_class_id’], $this->config->get(‘config_tax’))))/(($this->tax->calculate($result[‘price’], $result[‘tax_class_id’], $this->config->get(‘config_tax’)))/100));
  4. else {
  5.     $sales_percantage = false;
  6. }

从这个代码可以看出有若干个参数,我们留意“/”后面的被除数就好,这里被除数有两个地方,其中第二个是正整数100,可以排除。那么问题就在下面这段代码中:

  1. $this->tax->calculate($result[‘price’], $result[‘tax_class_id’], $this->config->get(‘config_tax’))

我们从上面这个方法里看到三个参数,分别用print_r打印了下参数的值,结果发现第二个参数“$result[‘tax_class_id’]”是“000000”。很显然,如果这个是0,我们就要让:

$sales_percantage  = false ;

所以我们这里的代码要修改为:

  1. // Cosyone custom code starts   
  2. if ((float)$result[‘special’] && $result[‘tax_class_id’]) {
  3.     $sales_percantage = ((($this->tax->calculate($result[‘price’], $result[‘tax_class_id’], $this->config->get(‘config_tax’)))-($this->tax->calculate($result[‘special’], $result[‘tax_class_id’], $this->config->get(‘config_tax’))))/(($this->tax->calculate($result[‘price’], $result[‘tax_class_id’], $this->config->get(‘config_tax’)))/100));
  4. else {
  5.     $sales_percantage = false;
  6. }

也就是,加多一个判断依据,必须满足两个值都存在的前提下,才进行如下运算,否则是false。

修改代码,保存代码,上传文件,刷新页面,警告提示语消失,over。

但是,毕竟我们改的是缓存文件,真正要修改好代码,我们还是要把代码写到核心文件或者插件的文件里。

修改源

首先,我们从三个地方查找,分别是:

核心文件:/catalog/controller/product/category.php;

vqmod:/vqmod/xml/*.xml;

ocmod:上传插件的ocmod.xml文件备份,或者数据库查看:oc_modification表xml字段;

虽然vqmod的优先等级高于ocmod,但是其实先从比较方便的地方找起也是可以的。有个方法可以排除是否ocmod。如果是ocmod插件的,缓存文件名必定有“system_storage_modification”。

但是也由于vqmod优先等级最高,所以被ocmod缓存的文件的文件名也可能有这个字样,所以排查的顺序如上所述。【如果报错指向“/system/storage/modification/”则一定是ocmod插件引起】

核心文件的话,编辑器打开ctrl+F进行关键字查找修改。

如果是vqmod的xml,要么排除法排除不可能是的文件,然后从可能是的文件里查找。如果文件太多就用notepad++等编辑器或者IDE工具,可以进行目录搜索,从中找到文件。

如果是ocmod,则用MYSQL工具进行字段like %…% 搜索,或者用SQL语句:

  1. SELECT * FROM `oc_modification` WHERE `xml` like “%关键代码%”

由于这里存的数据被转义过,所以搜索的内容不要带有换行之类的,抓取比较有特点的代码进行查找和修改。修改的时候注意转义的影响哈。当然现在很多MYSQL管理工具这一点做的还是挺好的。建议最好修改插件的ocmod.xml文件,然后重新上传一次。平时插件装了后自己留备份还是有必要的。如果没文件就导出备份再修改。

扩展

上面的示例代码刚好是刚遇到的,所以拿来举例子。授人以鱼不如授人以渔,有的小问题大家花钱又心疼,想自己折腾也未尝不可以,以后还是会提供更多这类比较初级的解决方案给大家。下面另外举例子:

  1. $a = 0;
  2. $value = $key / $a;
  3. //这样可能会提示警告语
  4. if ($a) {
  5.     $value = $key / $a;
  6. }else{
  7.     $value = false;
  8. }
  9. //对$value进行赋值计算结果或者false,也可以赋值预设数字,以便后面进行引用。

上面的方法只是一些示例和排错的技巧,一种思路,具体情况具体分析,但是解决问题要有清晰的思路哈。学会一种技巧少走一些弯路,少花一些钱还是可以的。不过如果要赚钱,舍得花钱找技术开发更适合自己的网站,是很有必要的,花钱减少自己的时间浪费,也少出现一些不必要的麻烦,最重要的是专业的代码和业余的代码还是很大区别的。再者,一个很简单的道理“花钱就是投资”。

javascript小技巧-判断窗口位置变更class

最近在研究手机模板,期间就需要做一个判断滑动变更class属性的。也就是常见的菜单跟随一个原理。

先说理论:判断窗口的位置,然后来更改class的值。那么我们先写好两个地方的class值。然后做个判断来变更他们。

  1. .topbar{
  2.   displayblock;
  3.   overflowhidden;
  4.   padding10px;
  5.   clearboth;
  6.   background-color#fff;
  7. }
  8. .topbarg {
  9.     padding10px;
  10.     background-color: rgba(255, 255, 255, 0.56);
  11.     z-index: 100;
  12.     positionfixed;
  13.     top: 0;
  14.     left: 0;
  15.     width: 100%;
  16. }

而,要更改的这个代码,加入一个id,用于js判断是更改哪里的。

  1. <div class=“topbar”>
  2. <!– 跟随变化的地方 –>
  3. </div>
  4. <!– 上面代码改为如下 –>
  5. <div id=“top” class=“topbar”> </div>

上面的工资准备好,下面就来利用一段简单的JS来实现啦!

  1. <script type=“text/javascript”>
  2. window.onscroll = function(){
  3.     var scrollTop =  document.body.scrollTop || document.documentElement.scrollTop;
  4.     if(scrollTop > 50){
  5.         document.getElementById(‘top’).className = ‘topbarg’;
  6.     }else{
  7.         document.getElementById(‘top’).className = ‘topbar’;
  8.     }
  9. }
  10. </script>

这段代码,判断了离开顶部50px的时候,找到id=top的地方,替换class参数,如果不是,则替换回来。这个50px是.topbar自身总体的高度,这个可以后查看。

以上为方法,实际应用到网站时自己变通下。

 

phpmyadmin修改登陆超时

如果是本地测试环境,其实没必要那么快的超时登陆,因为有时候可能长时间不去操作,等下又切换过去。然后又要重新登陆,麻烦了点。虽然有的人设置空密码。也是会有麻烦的地方。

一:修改 php.ini

wamp路径:E:\wamp\bin\apache\apache2.4.9\bin\

lnmp路径:/usr/local/php/etc/

  1. ; 搜索
  2. session.gc_maxlifetime
  3. ; 后面的数字改大即可

phpmyadmin-time-phpini

二:修改 config.default.php

wamp路径:!:\wamp\apps\phpmyadmin4**\libraries/

lnmp路径:/home/wwwroot/phpmyadmin/libraries/

或者:/home/wwwroot/default/phpmyadmin/libraries/

  1. // 搜索
  2. $cfg[‘LoginCookieValidity’]
  3. // 把后面的数字改大,不可以大于php.ini配置的数字

phpmyadmin-times-config

php技巧-把RSS内容写入数据库实例教程

有时候,你需要在一个自己另外的网站上调用文章,可是,你又懒得每次去录入更新,如果不在一个主机上,远程连接数据库又不是很好的注意,那么怎么办?抓取!

如果去写个抓取的程序,是比较麻烦的,而且,也可能带来临时的速度影响。好在,可以获取RSS,这样比较方面。

如何用php获取RSS的示例,我前面有写过一篇文章:http://blog.xukhost.com/2819.html

但是,这样的做法,会造成每次打开网站都变慢,而且如果另一个站挂了还会拖慢更多。那么怎么办呢?写个定时脚本,把抓取的数据写入数据库,但是每次打开页面是从数据库查询即可。大家先去看我前面的那个文章。然后得到一些代码,那么这里面有个地方可以利用,看这里:

  1. //构造输出字符串 ,显示的地方,可以自定义!
  2. $rss_str .= “<div class=\”result_list\”><a href='”.$link.“‘ target=_blank>”.$title.“</a></div><div class=\”line\”></div>”;
  3. $is_item = 0;

这个地方是把数据处理了,最后面 echo $rss_str; 的。那么,我们就修改这里,改为SQL语句即可。

  1. $sqlup = “INSERT INTO  `dbname`.`rss_news` (`id`,`title`,`link`) VALUES (”,  ‘”.$title.“‘,  ‘”.$link.“‘)”;
  2. mysql_query($sqlup,$mysql);
  3. $sqlin=mysql_insert_id();

当然了,你需要写一个连接数据库的配置信息,和建立相关的数据表和字段,详情查看我前面写的php教程:

http://blog.xukhost.com/3023.html   and  http://blog.xukhost.com/3064.html

数据库的话,可以执行下面的语句来添加数据表和字段:

  1. CREATE TABLE `sdt_news` (
  2.   `id` int(2) NOT NULL auto_increment,
  3.   `title` varchar(128) NOT NULL,
  4.   `link` varchar(64) NOT NULL,
  5.   UNIQUE KEY `id` (`id`)
  6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

这里会建立一个 sdt_news 的数据表,同时建立“id、title、link”三个字段。

请自己在本地环境测试该功能,完成后再上线,如果完全看不懂或者部分不懂,请付费联系解决。

QQ  184923973

php技巧-判断浏览器语言跳转不同页面

昨天有一个客户的需求,就是中文浏览器跳转另一个域名,他说自己的opencart买了个插件,插件会根据不同语言跳转不同的二级域名且显示中文,然后要求我帮忙改规则文件让中文的跳转另一个主域名,一开始我没多想,就根据他思路去改规则文件[当时脑袋短路吧],由于那个插件工作原理我不知道,因为我手上没有,又是付费的,所以我只能通过普通的规则文件写法写了重定向定义,可是那样不行,改来改去还是不行,后来我用了下下策,建立个cn子目录来实现,可还是有BUG,默认加载是不存在cn这个二级目录域名的,也就是就算我规则文件改了生效了,也需要点击那个中文的才会进入cn的二级目录[废话好多,进入正题]

于是我查了资料,写了下面的判断语句,自己本地用个php做测试

  1. <?php
  2. $language = substr($_SERVER[‘HTTP_ACCEPT_LANGUAGE’],0,5);
  3. if($language == “zh-cn”) header(“Location: http://cn.abc.com”);
  4. else header(“Location: http://abc.com”);
  5. ?>

可问题来了,在谷歌下不能判断,即使我改为zh也不行,我在火狐下倒是可以的,经过调整测试,和网上的资料,把第一行后面的5改为4,还是不行,不过后来还是搞定了,用下面这样的代码:

  1. <?php
  2. $language = substr($_SERVER[‘HTTP_ACCEPT_LANGUAGE’], 0, 4);
  3. if(preg_match(“/zh-c/i”$language)){
  4. header(“Location: http://cn.abc.com”);
  5. }elseif(preg_match(“/zh/i”$language)){
  6. header(“Location: http://cn.abc.com”);
  7. }else{
  8. header(“Location: http://abc.com”);
  9. }
  10. ?>

但是,我用火狐的时候,出现一个浏览器提示,说有一个不正确的重定向,嗯,于是我去掉了最后一句的else那一句,也就是直接判断,处理,默认情况不处理,当然了,看具体你的需求了,没有的情况不处理,则去掉第七八行,下面是几个语言的示例:

“/en/i” 英语
“/fr/i” 法语
“/de/i” 德语
“/jp/i” 日语
“/ko/i” 朝鲜
“/es/i” 西班牙语
“/sv/i” 瑞典

其他语言可以自己在网上搜索资料替换即可!

上面代码加在index.php 的最前面即可!

language-phpif

看php100视频从零开始学php-php学习第九节[php+mysql的使用]

视频,ppt,示例文件,离线手册下载地址:https://s.yunio.com/2Nlwqu [密码:sdtclass]


最近由于工作忙没有更新,今天来写下关于php100视频第十节,也就是对应本教程第九节–php+mysql的使用!

跟着教程步骤来吧,大纲是:

1、PHP与mysql建立链接

2、如何去执行一个SQL语句

3、两种查询函数array / row区别

4、 其他常用Mysql函数介绍

关于部分内容这里不提及,毕竟这个是配合视频来看的,只拿重点来说明下!

连接数据库的方法:

mysql_connect: 开启 MySQL 链接

mysql_select_db: 打开一个数据库

格式是:

mysql_connect(“主机”, “用户名”, “密码”)

mysql_select_db(“打开数据库”,连接标识符);

如果不特别声明连接标识符,则默认为是上一次打开的连接。

其中,@屏蔽错误,or die 则相反,显示错误,可以定义显示错误的字,下面举例说明:

  1. <?php  
  2. //我在本地建立了一个csuser的用户名,密码是123456,建立了一个cs的数据库  
  3. $sql = @mysql_connect(“localhost”,“csuser”,“123456”);  
  4.   
  5. if($sql){  
  6. echo “成功<br>”;  
  7. //$sql是布尔值,做一个判断判断是否连接成功  
  8.   
  9. $db = mysql_select_db(“cs2”);  
  10.   
  11. if($db){  
  12. echo “db”//cs2改为cs则输出这个  
  13. }else{  
  14. echo “no db<br>”//cs2不存在,所以输出这个  
  15. }  
  16.   
  17. $sql2 = @mysql_connect(“localhost”,“csuser”,“1111”);  
  18. //没有 @ 则输出php错误提示,有则屏蔽错误  
  19.   
  20. $sql3 = @mysql_connect(“localhost”,“csuser”,“11111”or die (“连接错误”);  
  21. //也可以用 or die 来输出当错误的时候输出的提示语句!  
  22. echo 123;  
  23. //or die 错误的时候,后面不会继续跑了  
  24. ?>  

大家可以在自己电脑建立一个数据库,数据库用户,用户密码,然后导入一个数据测试!在上一节已经有相关sql文件可以做测试,可以下去看看!

第三行这里,是连接数据库,也就是打开一个主机!

第五六七行是做了一个判断,是否打开,因为传出来的值是布尔值【PS:真正要用的时候,不用做这个判断,这里是举例说明!】

第九行这里,打开一个数据库文件

第十一至十五行:判断数据库是否连接成功!

第十七行这里,输入了一个错误的密码,但是,由于在语句前面 加了个 @ 则屏蔽了错误提示!

第二十行:用 or die 的方法显示连接错误的语句!

注:or die后面的数据不会再跑!


那么,如何执行一个sql语句呢?在前面有说到一些sql语句的用法,如何执行?

mysql_query (SQL语句 ,连接标识符);

说明:mysql_query用来根据连接标识符向该数据库服务器的当前数据库发送查询,

如果连接标识符默认,则默认为是上一次打开的连接。

返回值:成功后返回一个结果标识符,失败时返回false。

  1. $sql = “SELECT * FROM  test”;  
  2. $result = @ mysql_query($sql$connor die(mysql_error());  

上面这里是一个举例说明,后面的mysql_error()函数是显示错误信息,也就是当错误的使用,用这个echo出数据库的错误信息,方便调试!

  1. <?php  
  2. //打开一个数据库  
  3. $mysql = @mysql_connect(“localhost”,“csuser”,“123456”);  
  4. mysql_select_db(“cs”);  
  5. //执行一个sql语句  
  6. $sql = “INSERT INTO test (id,uid,regdate,remark) values (”,’小草’,now(),’老师’)”;  
  7. mysql_query(“set names ‘GBK'”); //由于直接插入会乱码,因为上面有中文,所以需要定义编码  
  8. mysql_query($sql,$mysql);  
  9. echo mysql_insert_id(); //显示当前插入的ID值  
  10. ?>  

【PS:我弄的是GBK,我建议还是用UTF-8吧,我的文件起初都是GBK保存的,如果打开是乱码用记事本打开然后另存为utf-8】

在PHP里面,utf-8 写成utf8,也就是

  1. mysql_query(“set names ‘utf8′”);  

上面说完语句的使用,那么,查询语句怎么办呢?其实其他语句都是不需要输出的,但是查询的结果需要输出吧?所以下面介绍两个打印输出查询结果的函数:

mysql_fetch_row(result);

PS:简单的说,这个查询出来的是指针的值,也就是你只能通过指针的方法来取值,如果表的数据不多可以使用,表的字段多,要打印一次,然后来找也麻烦,不过,可以使用下面的函数:

mysql_fetch_array(result);

这个和上面的一样,但是这个可以打印字段名称,看下面代码就懂了!

  1. <?php  
  2. //打开一个数据库  
  3. $mysql = @mysql_connect(“localhost”,“csuser”,“123456”);  
  4. mysql_select_db(“cs”);  
  5. mysql_query(“set names ‘GBK'”); //声明编码  
  6.   
  7. $sql = “SELECT * FROM `test` WHERE 1”//查询语句  
  8. $xinxi = mysql_query($sql,$mysql); //把查询结果赋给$xinxi  
  9.   
  10. $shuchu = mysql_fetch_row($xinxi); //row   
  11. //$xinxi 的值用mysql_fetch_row做成数组赋给$shuchu  
  12.   
  13. print_r($shuchu); //打印指针  
  14.   
  15. echo “<br>”;  
  16. echo $shuchu[1]; //输出指针1对应的值  
  17.   
  18. $shuchu2 = mysql_fetch_array($xinxi); //array  
  19. //$xinxi 的值用mysql_fetch_array做成数组赋给$shuchu2  
  20.   
  21. echo “<br>”;  
  22. echo $shuchu2[uid]; //输出关键字uid对应的值  
  23.   
  24. echo mysql_num_rows($xinxi); //输出统计多少条目  
  25. return mysql_close(); //退出当前数据库  
  26.   
  27. ?>  

我们看一下,首先用sql语句查询,用mysql_query来输出值,然后用 mysql_fetch_row来把他做成一个数组,然后赋给$shuchu ,用print_r 打印指针,然后输出指针的值,也就是:

  1. $sql = “SELECT * FROM `test` WHERE 1”//查询语句  
  2. $xinxi = mysql_query($sql,$mysql); //把查询结果赋给$xinxi  
  3.   
  4. $shuchu = mysql_fetch_row($xinxi);   
  5.   
  6. print_r($shuchu); //打印指针  
  7.   
  8. echo $shuchu[1]; //输出指针1对应的值  

在表的字段不多的时候,可以这样,但是多的时候,这样还是比较麻烦的,所以可以这样:

  1. $sql = “SELECT * FROM `test` WHERE 1”;     
  2. $xinxi = mysql_query($sql,$mysql);  
  3.   
  4. $shuchu2 = mysql_fetch_array($xinxi);   
  5.   
  6. echo $shuchu2[uid];   

是不是简化了,方便了很多呢?看情况用吧!


其他常用mysql函数介绍:

mysql_num_rows  用于计算查询结果中所得行的数目 //上面举例了

mysql_insert_id 传回最后一次使用 INSERT 指令的 ID。//上面举例了

mysql_tablename 取得数据库名称

mysql_error   返回错误信息 //上面举例了

mysql_close 关闭 MySQL 链接 //上面举例了

OK,基础知识就到这里结束了!其实还是很简单的!但是要精通,就需要多写多练习代码了!

php-php+mysql-ljcw