微信(weixin)大转盘抽奖页面、数据库以及抽奖算法(PHP源码)

 更新时间:2016年11月25日 15:42  点击:1761
目前最为流行的微信游戏了,就是抽奖活动,下面我看一站长整理了这款抽奖源码出来,下面我也转过来与各位朋友分享。

在做微信的过程中用到了微信抽奖,看了其他的作者都只是吧微信抽奖的页面共享出来了。我现在把转盘抽奖程序和微信抽奖页面都共享出来,有需要的自己把两者组合一下即可。

微信(weixin)大转盘抽奖

部份源码:配置文件

 代码如下 复制代码
<?php
return array (
  'DB_TYPE' => 'mysql',
  'DB_HOST' => '127.0.0.1',
  'DB_NAME' => 'ites',
  'DB_USER' => 'root',
  'DB_PWD' => '111111',
  'DB_PORT' => 3306,
  'DB_PREFIX' => 'it_',
  'APP_DEBUG' => 1,
  'SHOW_ERROR_MSG' => 1,
  'SHOW_PAGE_TRACE' => 1,
  'DATA_CACHE_TYPE' => 'Redis',
  'REDIS_HOST' => '127.0.0.1',
  'REDIS_PORT' => 6379,
  'DATA_CACHE_TIME' => 3600,
  'URL_CASE_INSENSITIVE' => true,
  'TMPL_STRIP_SPACE' => false,
  'URL_HTML_SUFFIX' => '',
  'SITE_NAME' => '11111',
  'SITE_URL' => 'http://www.111cn.net/',
  'WECHAT_TOKEN' => '你的',
  'WECHAT_APPID' => '你的',
  'WECHAT_APPSECRET' => '你的',
  'DATA_AUTH_KEY' => 'abcdddd',
);
?>

commond.php文件

 代码如下 复制代码

<?php
function isMobile($mobile) {
 return preg_match("/^(?:13d|14d|15d|18[0123456789])-?d{5}(d{3}|*{3})$/", $mobile);
}

function isEmail($email) {
 return strlen($email) > 6 && preg_match("/^[w-.]+@[w-.]+(.w+)+$/", $email);
}

/**
 * 发送HTTP请求方法,目前只支持CURL发送请求
 * @param  string $url    请求URL
 * @param  array  $params 请求参数
 * @param  string $method 请求方法GET/POST
 * @return array  $data   响应数据
 */
function http($url, $params, $method = 'GET', $header = array(), $multi = false){
 $opts = array(
   CURLOPT_TIMEOUT        => 30,
   CURLOPT_RETURNTRANSFER => 1,
   CURLOPT_SSL_VERIFYPEER => false,
   CURLOPT_SSL_VERIFYHOST => false,
   CURLOPT_HTTPHEADER     => $header
 );

 /* 根据请求类型设置特定参数 */
 switch(strtoupper($method)){
  case 'GET':
   $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
   break;
  case 'POST':
   //判断是否传输文件
   //$params = $multi ? $params : http_build_query($params);
   $opts[CURLOPT_URL] = $url;
   $opts[CURLOPT_POST] = 1;
   $opts[CURLOPT_POSTFIELDS] = $params;
   break;
  default:
   throw new Exception('不支持的请求方式!');
 }

 /* 初始化并执行curl请求 */
 $ch = curl_init();
 curl_setopt_array($ch, $opts);
 $data  = curl_exec($ch);
 $error = curl_error($ch);
 curl_close($ch);
 if($error) throw new Exception('请求发生错误:' . $error);
 return  $data;
}

/**
 * 不转义中文字符和/的 json 编码方法
 * @param array $arr 待编码数组
 * @return string
 */
function jsencode($arr) {
 $str = str_replace ( "\/", "/", json_encode ( $arr ) );
 $search = "#\u([0-9a-f]+)#ie";
 
 if (strpos ( strtoupper(PHP_OS), 'WIN' ) === false) {
  $replace = "iconv('UCS-2BE', 'UTF-8', pack('H4', '\1'))";//LINUX
 } else {
  $replace = "iconv('UCS-2', 'UTF-8', pack('H4', '\1'))";//WINDOWS
 }
 
 return preg_replace ( $search, $replace, $str );
}

// 数据保存到文件
function data2file($filename, $arr=''){
 if(is_array($arr)){
  $con = var_export($arr,true);
  $con = "<?php return $con; ?>";
 } else{
  $con = $arr;
  $con = "<?php $con; ?>";
 }
 write_file($filename, $con);
}

/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key  加密密钥
 * @param int $expire  过期时间 单位 秒
 * @return string
 * @author winky
 */
function encrypt($data, $key = '', $expire = 0) {
    $key  = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
    $data = base64_encode($data);
    $x    = 0;
    $len  = strlen($data);
    $l    = strlen($key);
    $char = '';

    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) $x = 0;
        $char .= substr($key, $x, 1);
        $x++;
    }

    $str = sprintf('%010d', $expire ? $expire + time():0);

    for ($i = 0; $i < $len; $i++) {
        $str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1)))%256);
    }
    return str_replace(array('+','/','='),array('-','_',''),base64_encode($str));
}

/**
 * 系统解密方法
 * @param  string $data 要解密的字符串 (必须是encrypt方法加密的字符串)
 * @param  string $key  加密密钥
 * @return string
 * @author winky
 */
function decrypt($data, $key = ''){
    $key    = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
    $data   = str_replace(array('-','_'),array('+','/'),$data);
    $mod4   = strlen($data) % 4;
    if ($mod4) {
       $data .= substr('====', $mod4);
    }
    $data   = base64_decode($data);
    $expire = substr($data,0,10);
    $data   = substr($data,10);

    if($expire > 0 && $expire < time()) {
        return '';
    }
    $x      = 0;
    $len    = strlen($data);
    $l      = strlen($key);
    $char   = $str = '';

    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) $x = 0;
        $char .= substr($key, $x, 1);
        $x++;
    }

    for ($i = 0; $i < $len; $i++) {
        if (ord(substr($data, $i, 1))<ord(substr($char, $i, 1))) {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        }else{
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return base64_decode($str);
}

function getTaskStatusStr($status = 0,$type = 'apply' , $company = ''){
 if ($type == 'comment') return '尚未作出评价';
 switch ($status) {
  case 0:
   return $type == 'apply' ? '已发出任务申请' : $company.'对你发出了任务邀请';
  break;
  case 1:
   return $type == 'apply' ? '企业已通过申请' : '已同意企业的邀请';
  break;  
  case 2:
   return $type == 'apply' ? '企业已忽略你的申请' : '你已经忽略企业的邀请';
  break;
  case 3:
   return $type == 'apply' ? '你已完成该任务' : '该任务已经完成';
  break;  
  default:
   return '未知的状态';
  break;
 }
}


function getArea($cache = true){
 $area = S ( 'S_Area' );
 if (empty ( $area ) || ! $cache) {
  // 缓存不存在,或者参数读取缓存。
  $areaModel = D('Area');
  $area = $areaModel -> where ('status = 3')->order ( 'sort,itemid' )->getField('itemid,title,pid,arrparentid,child');
  //把市的省拚出来
  foreach ($area as $k=>$v){
   //如果是顶级
   if ($v['pid']==0){
    $areaArr[$v['itemid']]['itemid'] = $v['itemid'];
    $areaArr[$v['itemid']]['title'] = $v['title'];
    $areaArr[$v['itemid']]['pid'] = $v['pid'];
    $areaArr[$v['itemid']]['arrparentid'] = $v['arrparentid'];
    $areaArr[$v['itemid']]['child'] = $v['child'];
    //上级
    $areaArr[$v['itemid']]['upitemid'] = $v['itemid'];
    $areaArr[$v['itemid']]['uptitle'] = $v['title'];
   }
   //查出上级的名称和ID
   else {
    $areaArr[$v['itemid']]['itemid'] = $v['itemid'];
    $areaArr[$v['itemid']]['title'] = $v['title'];
    $areaArr[$v['itemid']]['pid'] = $v['pid'];
    $areaArr[$v['itemid']]['arrparentid'] = $v['arrparentid'];
    $areaArr[$v['itemid']]['child'] = $v['child'];
    //上级
    $areaArr[$v['itemid']]['upitemid'] = $area[$v['pid']]['itemid'];
    $areaArr[$v['itemid']]['uptitle'] = $area[$v['pid']]['title'];
   }
  }
  $area = $areaArr;
  S ( 'S_Area' , $area );
 }
 return $area;
}

?>

源码下载地址

http://file.111cn.net/upload/2014/3/wx.rar

 

正则表达试是我们在开发验证时会常用到的一些规则,下面我整理了在我们用户数据提交时的一些常用的正则表达式,希望这些整理数据对你有帮助。

正则表达式一直以来是我比较头痛的东西,不过工作中是离不开正则表达式的,代码、vim编辑器、awk等Linux命令都广泛应用正则表达式。这是我收集并且测试过的PHP代码中常用的正则表达式,首先建立测试函数:

 代码如下 复制代码

function regTest( $pattern, $str ) {
    var_dump( preg_match($pattern, $str) );
    preg_match_all($pattern,$str,$matches);
    var_dump( $matches );
    var_dump( preg_replace($pattern,$str,'Test') );
}

1. 匹配中文字符

 代码如下 复制代码

$pattern = "/[x{4e00}-x{9fa5}]/u";
$str = "飞晏-feiyan";
regTest( $pattern, $str );
//依次输出结果
//int(1)
//array(1) { [0]=> array(2) { [0]=> string(3) "飞" [1]=> string(3) "晏" } }
//string(28) "TestTest-feiyan"

关于汉字的匹配,网上很多给的都是“[u4e00-u9fa5]”,这个正则不一定完全正确。

2. 匹配tab缩进、空格和换行

 代码如下 复制代码

$pattern = "/[x{4e00}-x{9fa5}]/u";
$str = "飞晏-feiyan";
regTest( $pattern, $str );
//依次输出结果
//int(1)
//array(1) { [0]=> array(2) { [0]=> string(3) "飞" [1]=> string(3) "晏" } }
//string(28) "TestTest-feiyan"
//string(21) "HelloTestTest,TestPHP"

3. 匹配Email地址

 代码如下 复制代码
$pattern = "[w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*]";
$str = '如有问题,请联系service@lenovo.com或者contact@ibm.com。';
regTest( $pattern, $str );
//依次输出结果
//int(1)
//array(4) { [0]=> array(2) { [0]=> string(18) "service@lenovo.com" [1]=> string(15) "contact@ibm.com" } [1]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } [2]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } [3]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } }
//string(41) "如有问题,请联系Test或者Test。"

  
//使用Filter函数
filter_var($email, FILTER_VALIDATE_EMAIL);

我一般不自己写正则表达式去验证邮箱,使用PHP内置filter函数可以很方便的完成邮箱地址的验证。

4. 匹配国内手机号码和电话号码

 代码如下 复制代码
//固定电话匹配
$pattern = "[d{3,4}-d{7,8}]";
$str = '联系电话010-12345678';
regTest( $pattern, $str );
  
//最简单的匹配手机号匹配
$pattern = "[1d{10}]";
$str = '联系电话15812345678';
regTest( $pattern, $str );

5. 匹配HTML中的图片地址

 代码如下 复制代码

$pattern = '/<[img|IMG].*?src=['|"](.*?(?:[.gif|.jpg]))['|"].*?[/]?>/'; 

$str = '<img id="test_img" src="images/123.gif" alt="test" />'; 

regTest( $pattern, $str );


/**
     * 验证邮政编码
     * @param string $value
     * @param string $match
     * @return boolean
     */
    public static function isPostcode($value,$match='/d{6}/'){
$v = trim($value);
if(empty($v))
    return false;
return preg_match($match,$v);
    }
    /**
     * 验证IP
     * @param string $value
     * @param string $match
     * @return boolean
     */
    public static function isIP($value,$match='/^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/'){
$v = trim($value);
if(empty($v))
    return false;
return preg_match($match,$v);
    }

    /**
     * 验证身份证号码
     * @param string $value
     * @param string $match
     * @return boolean
     */
    public static function isIDcard($value,$match='/^d{6}((1[89])|(2d))d{2}((0d)|(1[0-2]))((3[01])|([0-2]d))d{3}(d|X)$/i'){
$v = trim($value);
if(empty($v))
    return false;
else if(strlen($v)>18)
    return false;
return preg_match($match,$v);
    }

    /**
     * *
     * 验证URLwww.111cn.net
     * @param string $value
     * @param string $match
     * @return boolean
     */
    public static function isURL($value,$match='/^(http://)?(https://)?([wd-]+.)+[w-]+(/[dw-./?%&=]*)?$/'){
$v = strtolower(trim($value));
if(empty($v))
    return false;
return preg_match($match,$v);  
    }

补充

表单验证匹配
验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$

验证账号,不能为空,不能有空格,只能是英文字母:^S+[a-z A-Z]$

验证账号,不能有空格,不能非数字:^d+$

验证用户密码,以字母开头,长度在 6-18 之间:^[a-zA-Z]w{5,17}$

验证是否含有 ^%&',;=?$ 等字符:[^%&',;=?$x22]+

匹配Email地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

匹配腾讯QQ号:[1-9][0-9]{4,}

匹配日期,只能是 2004-10-22 格式:^d{4}-d{1,2}-d{1,2}$

匹配国内电话号码:^d{3}-d{8}|d{4}-d{7,8}$
评注:匹配形式如 010-12345678 或 0571-12345678 或 0831-1234567

匹配中国邮政编码:^[1-9]d{5}(?!d)$

匹配身份证:d{14}(d{4}|(d{3}[xX])|d{1})
评注:中国的身份证为 15 位或 18 位

不能为空且二十字节以上:^[s|S]{20,}$

主要分享php中手机号、座机、邮箱、身份证(15或18位)、手机号截取(中间四位为*)的正则表达式,都是自己工作收集而来。如果有不对的地方。欢迎提出!
 代码如下 复制代码

//验证手机号
$match = '/^((13[0-9])|(15[^4,\d])|(18[0,5-9]))[0-9]{8}$/';
//验证座机
$match = '/^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/';
//验证身份证号15或18位
$match = '/(^d{15}$)|(^d{17}(d|X|x)$)/';
//Email验证
$match = '/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/';
//将手机号中间转换为 * 号
$tel = 18600000000;
$pattern = '/(d{3})d{4}(d{3})/';
$replacement = "$1****$2";
echo preg_replace($pattern,$replacement,$tel);

我们常用做商城时会希望把用户输入的数字转换在RMB大写形式了,下面我整理了几个可以处理万亿级的数字转换例子,大家一起来看看这些例子吧。

例子1

 代码如下 复制代码

function change_num($num)
 {
 $d = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
 $e = array('元','拾','佰','仟','万','拾万','佰万','仟万','亿','拾亿','佰亿','仟亿','万亿');
 $p = array('分','角');
 $zheng='整'; //追加"整"字
 $final = array(); //结果
 $inwan=0; //是否有万
 $inyi=0; //是否有亿
 $len_pointdigit=0; //小数点后长度
 $y=0;
 if($c = strpos($num, '.')) //有小数点,$c为小数点前有几位数
 {
 $len_pointdigit = strlen($num)-strpos($num, '.')-1; // 判断小数点后有几位数
 if($c>13) //简单的错误处理
 {
 echo "数额太大,已经超出万亿.";
 die();
 }
 elseif($len_pointdigit>2) //$len_pointdigit小数点后有几位
 {
 echo "小数点后只支持2位.";
 die();
 }
 }
 else //无小数点
 {
 $c = strlen($num);
 $zheng = '整';
 }
 for($i=0;$i<$c;$i++) //处理整数部分
 {
 $bit_num = substr($num, $i, 1); //逐字读取 左->右
 if($bit_num!=0 || substr($num, $i+1, 1)!=0) //当前是零 下一位还是零的话 就不显示
 @$low2chinses = $low2chinses.$d[$bit_num];
 if($bit_num || $i==$c-1)
 @$low2chinses = $low2chinses.$e[$c-$i-1];
 }
 for($j=$len_pointdigit; $j>=1; $j--) //处理小数部分
 {
 $point_num = substr($num, strlen($num)-$j, 1); //逐字读取 左->右
 if($point_num != 0)
 @$low2chinses = $low2chinses.$d[$point_num].$p[$j-1];
 //if(substr($num, strlen($num)-2, 1)==0 && substr($num, strlen($num)-1, 1)==0) //小数点后两位都是0
 }
 $chinses = str_split($low2chinses,2); //字符串转换成数组
 //print_r($chinses);
 for($x=sizeof($chinses)-1;$x>=0;$x--) //过滤无效的信息
 {
 if($inwan==0&&$chinses[$x]==$e[4]) //过滤重复的"万"
 {
 $final[$y++] = $chinses[$x];
 $inwan=1;
 }
 if($inyi==0&&$chinses[$x]==$e[8]) //过滤重复的"亿"
 {
 $final[$y++] = $chinses[$x];
 $inyi=1;
 $inwan=0;
 }
 if($chinses[$x]!=$e[4]&&$chinses[$x]!=$e[8]) //进行整理,将最后的值赋予$final数组
 $final[$y++] = $chinses[$x];
 }
 $newstring=(array_reverse($final)); //$final为倒数组,$newstring为正常可以使用的数组
 $nstring=join($newstring); //数组变成字符串
 if(substr($num,-2,1)==0 && substr($num,-1)<>0) //判断原金额角位为0 ? 分位不为0 ?
 {
 $nstring=substr($nstring,0,(strlen($nstring)-4))."零".substr($nstring,-4,4); //这样加一个零字
 }
 $fen="分";
 $fj=substr_count($nstring, $fen); //如果没有查到分这个字
 return $nstring=($fj==0)?$nstring.$zheng:$nstring; //就将"整"加到后面
 }


例子2

 1.支持天文数字,整数位理论上可以无限的长;
    2.支持小数,对于货币,一般精确到小数后两位,可以设置小数位是否四舍五入;
    3.支持自定义货币单位,有的系统要求大写是"圆",有的要求是"元",可以自定义;
    4.支持整数以0结束并含有小数的数字自定义末尾补"零",比如有的系统要求1960.30这样的数字转大写之后是"壹仟玖佰陆拾元叁角",而有的系统则要求"壹仟玖佰陆拾元零叁角",这两种情况按"正确填写票据和结算凭证的基本规定"都是正确的,现在可已自定义。

 

 代码如下 复制代码

 <?php
    /**
     * 人民币小写转大写
     *
     * @param string $number 数值
     * @param string $int_unit 币种单位,默认"元",有的需求可能为"圆"
     * @param bool $is_round 是否对小数进行四舍五入
     * @param bool $is_extra_zero 是否对整数部分以0结尾,小数存在的数字附加0,比如1960.30,
     *             有的系统要求输出"壹仟玖佰陆拾元零叁角",实际上"壹仟玖佰陆拾元叁角"也是对的
     * @return string
     * @site www.111cn.net     */
    function num2rmb($number = 0, $int_unit = '元', $is_round = TRUE, $is_extra_zero = FALSE)
    {
        // 将数字切分成两段
        $parts = <A class=infotextkey href="http://www." target=_blank>explode</A>('.', $number, 2);
        $int = <A class=infotextkey href="http://www.111cn.net/" target=_blank>isset</A>($parts[0]) ? strval($parts[0]) : '0';
        $dec = isset($parts[1]) ? strval($parts[1]) : '';

        // 如果小数点后多于2位,不四舍五入就直接截,否则就处理
        $dec_len = strlen($dec);
        if (isset($parts[1]) && $dec_len > 2)
        {
            $dec = $is_round
                    ? substr(strrchr(strval(round(floatval("0.".$dec), 2)), '.'), 1)
                    : substr($parts[1], 0, 2);
        }

        // 当number为0.001时,小数点后的金额为0元
        if(empty($int) && empty($dec))
        {
            return '零';
        }

        // 定义
        $chs = array('0','壹','贰','叁','肆','伍','陆','柒','捌','玖');
        $uni = array('','拾','佰','仟');
        $dec_uni = array('角', '分');
        $exp = array('', '万');
        $res = '';

        // 整数部分从右向左找
        for($i = strlen($int) - 1, $k = 0; $i >= 0; $k++)
        {
            $str = '';
            // 按照中文读写习惯,每4个字为一段进行转化,i一直在减
            for($j = 0; $j < 4 && $i >= 0; $j++, $i--)
            {
                $u = $int{$i} > 0 ? $uni[$j] : ''; // 非0的数字后面添加单位
                $str = $chs[$int{$i}] . $u . $str;
            }
            //echo $str."|".($k - 2)."<br>";
            $str = rtrim($str, '0');// 去掉末尾的0
            $str = preg_replace("/0+/", "零", $str); // 替换多个连续的0
            if(!isset($exp[$k]))
            {
                $exp[$k] = $exp[$k - 2] . '亿'; // 构建单位
            }
            $u2 = $str != '' ? $exp[$k] : '';
            $res = $str . $u2 . $res;
        }

        // 如果小数部分处理完之后是00,需要处理下
        $dec = rtrim($dec, '0');

        // 小数部分从左向右找
        if(!empty($dec))
        {
            $res .= $int_unit;

            // 是否要在整数部分以0结尾的数字后附加0,有的系统有这要求
            if ($is_extra_zero)
            {
                if (substr($int, -1) === '0')
                {
                    $res.= '零';
                }
            }

            for($i = 0, $cnt = strlen($dec); $i < $cnt; $i++)
            {
                $u = $dec{$i} > 0 ? $dec_uni[$i] : ''; // 非0的数字后面添加单位
                $res .= $chs[$dec{$i}] . $u;
            }
            $res = rtrim($res, '0');// 去掉末尾的0
            $res = preg_replace("/0+/", "零", $res); // 替换多个连续的0
        }
        else
        {
            $res .= $int_unit . '整';
        }
        return $res;
    }

    echo "<pre>";
    $number = "1000000000000000012345678900.501";
    echo $number.":".num2rmb($number);
    echo "n";
    $number = "1960.30";
    echo $number.":".num2rmb($number);
    echo "n";
    $number = "1960.30";
    echo $number.":".num2rmb($number, "圆", true, true);
    echo "n";
    $number = "123456789.005";
    echo $number.":".num2rmb($number);
    echo "n";
    $number = "123456789.005";
    echo $number.":".num2rmb($number, "元", false);
    echo "n";
    $number = "10000000000000000060009.101";
    echo $number.":".num2rmb($number);
    echo "n";
    $number = "1680.32";
    echo $number.":".num2rmb($number);
?>

例子3

看上面的个人更喜欢下面这个

 代码如下 复制代码

//把数字金额转换成中文大写数字的函数
function num2rmb ($num){
 $c1="零壹贰叁肆伍陆柒捌玖";
 $c2="分角元拾佰仟万拾佰仟亿";

 $num=round($num,2);
 $num=$num*100;
 $NewNum = ceil($num);
 if(strlen($NewNum)>10){
 return "金额太大";
 }

 $i=0;
 $c="";

 while (1){
 if($i==0){
 $n=substr($num,strlen($num)-1,1);
 }else{
 $n=$num %10;
 }

 $p1=substr($c1,2*$n,2);

 $p2=substr($c2,2*$i,2);
 if($n!='0' || ($n=='0' &&($p2=='亿' || $p2=='万' || $p2=='元' ))){
 $c=$p1.$p2.$c;
 }else{
 $c=$p1.$c;
 }

 $i=$i+1;
 $num=$num/10;
 $num=(int)$num;

 if($num==0){
 break;
 }
 }//end of while| here, we got a chinese string with some useless character

 //we chop out the useless characters to form the correct output
 $j = 0;
 $slen=strlen($c);
 while ($j< $slen) {
 $m = substr($c,$j,4);

 if ($m=='零元' || $m=='零万' || $m=='零亿' || $m=='零零'){
 $left=substr($c,0,$j);
 $right=substr($c,$j+2);
 $c = $left.$right;
 $j = $j-2;
 $slen = $slen-2;
 }
 $j=$j+2;
 }

 if(substr($c,strlen($c)-2,2)=='零'){
 $c=substr($c,0,strlen($c)-2);
 } // if there is a '0' on the end , chop it out

 return $c;
}// end of function

php生成二维码一般都是使用用一些插件来实现了,下面我们利用phpqrcode来给各位朋友实现生成二维码的同时现加一个水印logo上去,下面看例子。

给手机app作一个二维码的接口,要求支持iso,android,win8手机,找了第三个方工具phpqrcode。

1,下载地址

源码下载:https://github.com/t0k4rt/phpqrcode


2,加水印图片,片段代码

 代码如下 复制代码

    $logo = 'logo.png';

    if(is_file($logo))
    {
        $QR = imagecreatefromstring(file_get_contents($filename));
        $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);
        imagepng($QR,$filename);
    }

 

[!--infotagslink--]

相关文章

  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#几种排序算法

    作者:Sabine 【导读】本文介绍了C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序  冒泡排序 using System; namespace BubbleSorter { public class Bubb...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • Intellij IDEA连接Navicat数据库的方法

    这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • mysqldump命令导入导出数据库方法与实例汇总

    mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
  • Mysql数据库错误代码中文详细说明

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • Linux 下使用shell脚本定时维护数据库的案例

    这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • PHP连接公司内部服务器的MYSQL数据库的简单实例

    “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29
  • C#连接加密的Sqlite数据库的方法

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16