风吹走了我

基于ecshop手机微信站的微信支付开发

最近做了微信的手机登陆、手机支付,  手机微信登陆前面已经介绍过了, 现在介绍下微信支付。

这个接口是完全适应于ecshop, 以一个插件的形式(用的jsapi), 但是在其他地方的道理是一样的。

先来看下在ecshop中的目录结构      

 基于ecshop手机微信站的微信支付开发

其中 wxpay这个文件是官网提供的, 放在ecshop的根目录下面的  includes/modules下面。

插件代码在payment文件下面,  命名为   wxpay.php    (注意这个命名,不要改)。

然后看下  wxpay.php 这个的具体的代码。

<?php
/**
 * ECSHOP 微信插件  
 * ============================================================================
 *   微信支付
 *   author: ZHANGLIN
 * ============================================================================
 */

if (!defined('IN_ECS'))
{
    die('Hacking attempt');
}

$payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/wxpay.php';

if (file_exists($payment_lang))
{
    global $_LANG;

    include_once($payment_lang);
}

/* 模块的基本信息 */
if (isset($set_modules) && $set_modules == TRUE)
{
    $i = isset($modules) ? count($modules) : 0;

    /* 代码 */
    $modules[$i]['code']    = basename(__FILE__, '.php'); 

    /* 描述对应的语言项 */
    $modules[$i]['desc']    = 'wxpay_desc';

    /* 是否支持货到付款 */
    $modules[$i]['is_cod']  = '0';

    /* 是否支持在线支付 */
    $modules[$i]['is_online']  = '1';

    /* 作者 */
    $modules[$i]['author']  = 'ZHANGLIN';

    /* 网址 */
    $modules[$i]['website'] = 'https://mp.weixin.qq.com';

    /* 版本号 */
    $modules[$i]['version'] = '1.0.0';

    /* 配置信息 */
    $modules[$i]['config']  = array(
        array('name' => 'app_id',           'type' => 'text',   'value' => ''),
        array('name' => 'paysign_key',      'type' => 'text',   'value' => ''),
        array('name' => 'sign_type',        'type' => 'text',   'value' => 'sha1'), 
        array('name' => 'partner_key',      'type' => 'text',   'value' => ''),
        array('name' => 'app_sercert',      'type' => 'text',   'value' => ''),
        array('name' => 'parener_id',       'type' => 'text',   'value' => ''),
    ); 
    return;
}

/**
 * 类
 */
class wxpay
{

    /**
     * 构造函数
     *
     * @access  public
     * @param
     *
     * @return void
     */
    function wxpay()
    {
    }

    function __construct()
    {
        $this->wxpay();
    }

    /**
     * 生成支付代码
     * @param   array   $order      订单信息
     * @param   array   $payment    支付方式信息
     */
    function get_code($order, $payment)
    {
        if (!defined('EC_CHARSET'))
        {
            $charset = 'utf-8';
        }
        else
        {
            $charset = EC_CHARSET;
        }   

        //定义配置常量
        define('APPID' ,     $payment['app_id']);  //appid
        define('APPKEY' ,    $payment['paysign_key']); //paysign key
        define('SIGNTYPE',   $payment['sign_type']); //method
        define('PARTNERKEY', $payment['partner_key']);//通加密串
        define('APPSERCERT', $payment['app_sercert']); 
        define('PARTNERID',  $payment['parener_id']); 
        include_once(ROOT_PATH . "includes/modules/wxpay/WxPayHelper.php"); 
 
        $commonUtil = new CommonUtil();
        $wxPayHelper = new WxPayHelper();  
        $wxPayHelper->setParameter("bank_type", "WX");
        $wxPayHelper->setParameter("body", '马尼尔商品');
        $wxPayHelper->setParameter("partner", PARTNERID);
        $wxPayHelper->setParameter("out_trade_no", $order['order_sn']);
        $wxPayHelper->setParameter("total_fee", $order['order_amount']*100);
        $wxPayHelper->setParameter("fee_type", "1");
        $wxPayHelper->setParameter("notify_url", return_url(basename(__FILE__, '.php')));
        $wxPayHelper->setParameter("spbill_create_ip", real_ip());
        $wxPayHelper->setParameter("input_charset", "GBK");
        $package = $wxPayHelper->create_biz_package(); 

        echo '<script language="javascript">
        function callpay()
        {
            WeixinJSBridge.invoke("getBrandWCPayRequest",'.$package.',function(res){
            WeixinJSBridge.log(res.err_msg);
            alert(res.err_code+res.err_desc+res.err_msg);
            });
        }
        </script> ';
        $button = '<button type="button" class="btn_white" onclick="callpay()">微信支付</button>';

        return $button;
    } 

    /**
    *  响应操作
    */
    function respond()
    {
        if ( isset($_GET) )
        {
            //支付信息
            $sql = 'SELECT * FROM ' . $GLOBALS['ecs']->table('payment') .
            " WHERE pay_code = 'wxpay' AND enabled = 1"; 
            $payment = $GLOBALS['db']->getRow($sql);
            $payment = unserialize_config($payment['pay_config']);

            //=======================
            //  注意这里要作一个判断,  返回回来的值是否是微信支付成功后返回的值
           //========================  

            $order_sn = trim($_GET['out_trade_no']);  
            $order_id = $GLOBALS['db']->getOne("SELECT order_id FROM " . $GLOBALS['ecs']->table('order_info') . " WHERE order_sn = '$order_sn'");  
            $log_id = $GLOBALS['db']->getOne("SELECT log_id FROM " . $GLOBALS['ecs']->table('pay_log') . "  WHERE order_id = '$order_id'"); 
                    /* 改变订单状态 */
            order_paid($log_id, 2);

            return true;
        }
        else
        {
            return false;
        } 
    }
 
}

?>

 文中涉及到的附件下载:

wxpay.php.rar

wxpay

如何运用PHP函数array_push()实现数组元素的增加

当你使用PHP函数array_push()的时候,你将会很容易的做到在数组的头尾增加新的元素。我们下面就将实际操作代码写上,希望对有需要的朋友有所帮助。

下面的例子中首先示范如何使用PHP函数array_push()在数组的尾端新增元素:

  1. <? /* 首先我们建立一个数组 */   
  2.  
  3. $fruitArray = array("apple", "orange", "banana", "Peach", "pear");    
  4.  
  5. /* 使用array_push()函数在原有数组尾端新增一些元素 */   
  6.  
  7. array_push($fruitArray, "grape", "pineapple", "tomato");    
  8.  
  9. /* 现在把该数组的所有元素的键(key)与值(value)都显示在网页上 */   
  10.  
  11. while (list($key,$value) = each($fruitArray)) {   
  12.  
  13. echo "$key : $value<br>";   
  14.  
  15. }    
  16.  
  17. ?>     

显示结果如下:

0 : apple

1 : orange

2 : banana

3 : Peach

4 : pear

5 : grape

6 : pineapple

7 : tomato

现在来示范如何运用PHP函数array_push()从数组的开头新增一些元素。下面的程序代码和前面一个例子几乎完全相同,唯一的差别只是这里使用的函数是array_unshift()而不是 array_push()。

  1. <?   
  2.  
  3. /* 首先我们建立一个数组 */   
  4.  
  5. $fruitArray = array("apple", "orange", "banana", "Peach", "pear");    
  6.  
  7. /* 使用array_unshift()函数在原有数组开头新增一些元素 */   
  8.  
  9. array_unshift($fruitArray, "grape", "pineapple", "tomato");    
  10.  
  11. /* 现在把该数组的所有元素的键(key)与值(value)都显示在网页上 */   
  12.  
  13. while (list($key,$value) = each($fruitArray)) {   
  14.  
  15. echo "$key : $value<br>";   
  16.  
  17. }    
  18.  
  19. ?>   

显示结果如下:

0 : grape

1 : pineapple

2 : tomato

3 : apple

4 : orange

5 : banana

6 : Peach

7 : pear

以上两段代码分别介绍了PHP函数array_push()在数组头尾增加元素的办法。

ECShop空商品问题

使用ECshop做二次开发,自己写的模板调用商品列表时,有时会出现空商品的情况,即明明没有这个商品,却多出一个商品位置来,而该商品的链接,名字,图片等都是空的。

出现这种情况的原因是调用foreach或section时没有判断数组是否为空,数组中的元素是否为空。

所以规范的做法是,调用foreach前判断数组是否为空,调用其元素时判断字段是否为空。

写其它程序时也应该养成这种习惯。

PHP判断是否使用手机平板设备访问

近期对我的下载站做了个改进,针对手机平板等移动设备取消了每25秒只能下载一个文件的限制,通过PHP判断user-agent实现的。

代码:

其实用的是穷举法,列出所有的移动平台并加以判断。

 function isMobile(){
  $agent = $_SERVER['HTTP_USER_AGENT']; 
  if(strpos($agent,"NetFront") || strpos($agent,"iPhone") || strpos($agent,"MIDP-2.0") || strpos($agent,"Opera Mini") || strpos($agent,"UCWEB") || strpos($agent,"Android") || strpos($agent,    "Windows CE") || strpos($agent,"SymbianOS")) {
   return true;
   } else{
   return false;
   } 

PHP常用正则表达式集锦

收集了些PHP常用正则表达式,不会时可以查查看看。
1。[size=12px]1。^d+$   //匹配非负整数(正整数 + 0)
2。^[0-9]*[1-9][0-9]*$   //匹配正整数
3。^((-d+)|(0+))$   //匹配非正整数(负整数 + 0)
4。^-[0-9]*[1-9][0-9]*$   //匹配负整数
5。^-?d+$     //匹配整数
6。^d+(.d+)?$   //匹配非负浮点数(正浮点数 + 0)
7。^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$  //匹配正浮点数
8。^((-d+(.d+)?)|(0+(.0+)?))$   //匹配非正浮点数(负浮点数 + 0)
9。^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$  //匹配负浮点数
10。^(-?d+)(.d+)?$  //匹配浮点数
11。^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
12。^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
13。^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
14。^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
15。^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
16。^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$    //匹配email地址
17。^[a-zA-z]+://匹配(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$  //匹配url
18。匹配中文字符的正则表达式: [u4e00-u9fa5]
19。匹配双字节字符(包括汉字在内):[^x00-xff]
20。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^x00-xff]/g,”aa”).length;}
21。匹配空行的正则表达式:n[s| ]*r
22。匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/
23。匹配首尾空格的正则表达式:(^s*)|(s*$)
* 正则表达式用例
* 1、 ^S+[a-z A-Z]$ 不能为空 不能有空格 只能是英文字母
* 2、 S{6,} 不能为空 六位以上
* 3、 ^d+$ 不能有空格 不能非数字
* 4、 (.*)(.jpg|.bmp)$ 只能是jpg和bmp格式
* 5、 ^d{4}-d{1,2}-d{1,2}$ 只能是2004-10-22格式
* 6、 ^0$ 至少选一项
* 7、 ^0{2,}$ 至少选两项
* 8、 ^[s|S]{20,}$ 不能为空 二十字以上
* 9、 ^+?[a-z0-9](([-+.]|[_]+)?[a-z0-9]+)*@([a-z0-9]+(.|-))+[a-z]{2,6}$邮件
* 10、 w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*([,;]s*w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*)* 输入多个地址用逗号或空格分隔邮件
* 11、 ^(([0-9]+))?[0-9]{7,8}$电话号码7位或8位或前面有区号例如(022)87341628
* 12、 ^[a-z A-Z 0-9 _]+@[a-z A-Z 0-9 _]+(.[a-z A-Z 0-9 _]+)+(,[a-z A-Z 0-9 _]+@[a-z A-Z
0-9 _]+(.[a-z A-Z 0-9 _]+)+)*$
* 只能是字母、数字、下划线;必须有@和.同时格式要规范 邮件
* 13 ^w+@w+(.w+)+(,w+@w+(.w+)+)*$上面表达式也可以写成这样子,更精练。
14 ^w+((-w+)|(.w+))*@w+((.|-)w+)*.w+$ [/size]
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行

匹配HTML标记的正则表达式: <(S*?)[^>]*>.*? | <.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^s* |s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:d{3}-d{8} |d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字

匹配身份证:d{15} |d{18}
评注:中国的身份证为15位或18位

匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d* |0$  //匹配非负整数(正整数 + 0)
^-[1-9]d* |0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d* |0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d* |0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d* |0.d*[1-9]d* |0?.0+ |0)$  //匹配浮点数
^[1-9]d*.d* |0.d*[1-9]d* |0?.0+ |0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d* |0.d*[1-9]d*)) |0?.0+ |0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
“^[\w-]+([url=file://\.[\w-]+)*@[\w-]+(\.[\w-]+)+___FCKpd___0quot]\.[\w-]+)*@[\w-]+(\.[\w-]+)+___FCKpd___0quot[/url];    //email地址
“^[a-zA-z]+://([url=file://\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?___FCKpd___0quot]\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?___FCKpd___0quot[/url];  //url
匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式: <(S*?)[^>]*>.*? | <.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s* |s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
!!!匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8} |d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
!!!匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15} |d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d* |0$  //匹配非负整数(正整数 + 0)
^-[1-9]d* |0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d* |0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d* |0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d* |0.d*[1-9]d* |0?.0+ |0)$  //匹配浮点数
^[1-9]d*.d* |0.d*[1-9]d* |0?.0+ |0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d* |0.d*[1-9]d*)) |0?.0+ |0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
“^[\w-]+([url=file://\.[\w-]+)*@[\w-]+(\.[\w-]+)+___FCKpd___0quot]\.[\w-]+)*@[\w-]+(\.[\w-]+)+___FCKpd___0quot[/url];    //email地址
“^[a-zA-z]+://([url=file://\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?___FCKpd___0quot]\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?___FCKpd___0quot[/url];  //urlview
plaincopy to clipboardprint?
正则几个基本概念:

1.贪婪:+,*,?,{m,n}等默认是贪婪匹配,即尽可能多匹配,也叫最大匹配

2.获取:默认用(x |y)是获取匹配,很多时候只是测试,不一定要求得到所匹配的数据,尤其在嵌套匹配
或大数据中就要用非获取匹配(?:x |y),这样提高了效率,优化了程序。

3.消耗:默认是消耗匹配,一般在预查中是非消耗匹配。
举个例子,2003-2-8要变为2003-02-08
如果用/-(d)-/第二次匹配将从8开始,从而只替换第一个2,错误
如果用/-(d)(?=-)/则第二次匹配从第二个-开始,即不消耗字符

4.预查:js中分为正向预查和负向预查
如上面的(?=pattern)是正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。还有(?!
pattern)是负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。负向预查有时会用在对
[^]的扩充,[^]只是一些字符,而?!可以使整个字符串。

5.回调:一般用在替换上,即根据不用的匹配内容返回不用的替换值,从而简化了程序,需要高版本支持

6.引用:num 对所获取的第num个匹配的引用。
例如,’(.)11′ 匹配AAA型。’(.)(.)21′ 匹配ABBA型。

正则表达式保留字
^ (carat)
. (period)
[ (left bracket}
$ (dollar sign)
( (left parenthesis)
) (right parenthesis)
| (pipe)
* (asterisk)
+ (plus symbol)
? (question mark)
{ (left curly bracket, or left brace)

构造 匹配于
字符
x 字符 x
\ 反斜线字符
n 八进制值的字符0n (0 <= n <= 7)
nn 八进制值的字符 0nn (0 <= n <= 7)
mnn 八进制值的字符0mnn 0mnn (0 <= m <= 3, 0 <= n <= 7)
xhh 十六进制值的字符0xhh
uhhhh 十六进制值的字符0xhhhh
t 制表符(‘u0009’)
n 换行符 (‘u000A’)
r 回车符 (‘u000D’)
f 换页符 (‘u000C’)
a 响铃符 (‘u0007’)
e 转义符 (‘u001B’)
cx T对应于x的控制字符 x

字符类
[abc] a, b, or c (简单类)
[^abc] 除了a、b或c之外的任意 字符(求反)
[a-zA-Z] a到z或A到Z ,包含(范围)
[a-z-[bc]] a到z,除了b和c : [ad-z](减去)
[a-z-[m-p]] a到z,除了m到 p: [a-lq-z]
[a-z-[^def]] d, e, 或 f

预定义的字符类
. 任意字符(也许能与行终止符匹配,也许不能)
d 数字: [0-9]
D 非数字: [^0-9]
s 空格符: [ tnx0Bfr]
S 非空格符: [^s]
w 单词字符: [a-zA-Z_0-9]
W 非单词字符: [^w]

PHP的excelreader类读取EXCEL中文乱码问题

之前曾经写过一遍关于PHP读取EXCEL时出现中文乱码的解决办法的文章,里面给出一个函数,可以进行编码转换,不过
那个方法不是太好,每次都得对单元格使用那个函数,而且偶尔还是会有乱码。

原理就不分析了,直接给出解决办法。

其实我用的EXCEL读取类类名是Spreadsheet_Excel_Reader,它本身支持设置输出的编码,以前一直没发现。

设置方法:

$myReader = new Spreadsheet_Excel_Reader();
$myReader->setOutputEncoding('GBK'); //GBK或者GB2312
$myReader->read("1.xls");

相比原来只添加了第二行代码,而且一劳永逸。

也有人说这样设置

$myReader = new Spreadsheet_Excel_Reader("1.xls",true,"GBK");

经测试,不管用,可能这个类的版本问题吧。

另外附上PHP excelreader类的下载链接 

Nginx下的wordpress的url重写规则

location / {
            root   /usr/share/nginx/html/blog.kiccp.com;
            index index.php  index.html index.htm;
            try_files $uri $uri/ /index.php?$args;
        }
location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
        root /usr/share/nginx/html/blog.kiccp.com;
        expires 24h;
        log_not_found off;
        }

php等比缩放图片并计算其margin

php等比缩放图片并计算其margin,适用于处理宽高比例不一致但要求显示一致的图片场合。


/*
 * 等比缩放图片并计算其margin
 * @param $picpath 图片路径
 * @param $pwidth  要显示的宽度
 * @param $pheight  要显示的高度
 * @return array 宽高,margin的top和left(bottom=top,right=left)
 */ 
function resizeImageWHM($picpath,$pwidth,$pheight){
 $imginfo=getimagesize($picpath);
 $owidth=$imginfo[0];
 $oheight=$imginfo[1];

 $ra=number_format(($owidth/$pwidth),3);//宽比
 $ra2=number_format(($oheight/$pheight),3);//高比
 if($owidth>$pwidth && $oheight>$pheight){
 if($ra>=$ra2){
	     $width=round($owidth/$ra);;
		 $height=round($oheight/$ra);
	  }else{
	     $width=round($owidth/$ra2);
		 $height=round($oheight/$ra2);
	  }	  
	
      
 }else{
    $width=$owidth;
	$height=$oheight;
 }
 
 $margin_top=0;
 if($height<$pheight){
    $margin_top=round(($pheight-$height)/2);
 }
 
 $margin_left=0;
 if($width<$pwidth){
    $margin_left=round(($pwidth-$width)/2);
 }
 
 $newsize['width']=$width;
 $newsize['height']=$height;
 $newsize['margin_top']=$margin_top;
 $newsize['margin_left']=$margin_left;

 return $newsize;
}

PHP获取MySQL数据表的结构信息(包括set结构的值)

在PHP官网上找到的一个获取MySQL数据表的结构信息的函数,稍微改进了下,替换掉过时的ereg函数。现在
这个函数比mysql_list_fields要强大,它能获取到集合结构(set)字段的所有值,这在生成HTML时是非常
有用的。

上代码:

function GetFieldInfo($table) { 
  global $cfg_dbname,$cfg_dbhost,$cfg_dbuser,$cfg_dbpwd;
  $con = mysql_connect($cfg_dbhost, $cfg_dbuser, $cfg_dbpwd);
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

$db_selected = mysql_select_db($cfg_dbname,$con);
  mysql_query("set names utf8");
  if($table == '') return false; 
  $fields = mysql_list_fields($cfg_dbname, $table); 
  if($fields){ 
    $columns = mysql_query('show columns from ' . $table); 
    if($columns){ 
      $num = mysql_num_fields($fields); 
      for($i=0; $i < $num; ++$i){ 
        $column = mysql_fetch_array($columns); 
        $field = mysql_fetch_field($fields, $i); 
        $flags = mysql_field_flags($fields, $i); 
        if($flags == '') $flags=array(); 
        else $flags = explode(' ',$flags); 
        if (preg_match('/enum.(.*)./',$column['Type'],$match)) 
          $field->values = explode(',',$match[1]); 
        if (preg_match('/set.(.*)./',$column['Type'],$match)) 
          $field->values = explode(',',$match[1]); 
        if(!$field->values) $field->values = array(); 
        $field->flags = $flags; 
        $field->len = mysql_field_len($fields, $i); 
        $result_fields[$field->name] = $field; 
        $result_fields[$i] = $field; 
      } 
      mysql_free_result($columns); 
    } 
    mysql_free_result($fields); 
    return $result_fields; 
  } 
  return false; 
}

ThinkPHP小知识点

分享ThinkPHP的几个小知识点:

1. URL中隐藏模块Home名称

define(‘BIND_MODULE’,’Home’);

2. 自定义函数库置于 /Common/Common目录下,需要在项目的配置文件中配置加载该函数库

/Conf/config.php, 添加 “LOAD_EXT_FILE”=>”common” ,则会自动加载 common.php

3. 模型新增数据使用 add ,更新时使用 save