也说网页扫描二维码登录跳转

场景:
1.支付宝APP扫码登录、支付
2.微信WEB扫码登录

web前端 jquery:

<img src="qrcode.php?id=xxx" />
<script>
var qrcode_id = xxx;

var e = function() {
    $.get('s.php?qid='+qid, function(data){
        var j = JSON.parse(data) || false;
        if (!j) {
            setTimeout(e,3000);
            return false;
        } else if ('bind' == j.state) {
            alert('手机已扫码');
            setTimeout(e,3000);
            return false;
        } else if ('redirect' == j.state) {
            windnow.location.href = j.redirect_uri;
        }
    });
}
e();
</script>

PHP s.php

<?php

// 开始检查时间
$startTime = time();

$db = new db();

$qid = $_GET['qid'];
$action = $_GET['action'];

// 如果当前二维码已经被别人使用过
if ($qr['bind'] && $qr['bind'] != $current_uid)
    exit( json_encode(['state'=>'fail']) );

// 绑定当前用户(手机扫描时会带上用户设备信息或设备已登陆用户信息)
if (!$qr['bind']) {
    $db->update($qid, ['bind'=>$current_uid]);
    exit( json_encode(['state' => 'bind']) );
}

// 如果当前qr已经被绑定并且是当前登录用户
if ($qr['bind'] == $current_uid && 'login' == $action) {
    // 更新数据库删除code
    // 生成session绑定用户
    exit( json_encode(['state' => 'redirect' , 'redirect_uri' => 'xxxxxxxxxxxxxx']) );
}

exit(json_encode(['state' => 'fail']));

PostgreSQL & PostGIS LBS检索

PostGIS安装,点这里

高性能ElasticSearch LBS检索解决方案点击这里
LBS 通用检索解决方案点击这里

1.建表

-- 只给出gis字段
select AddGeometryColumn('表名','要添加的字段名',4326,'geometry',2);
-- 4326对应的是WGS84坐标系 中国使用的是该类型

有关WGS84坐标系介绍及深入了解请点这里……

2.插入数据

insert into table_name
    (name,geometry_column)
values
    ('用户1', ST_GeometryFromText('POINT(longitude latitude)',4326))

3.附近的人搜索(在此之前先给geometry_column添加GiST索引)

select
    *,
    ST_Distance_Sphere(
                      geometry_column,
                      ST_GeometryFromText('POINT(longitude latitude)',
                      4326
                      ) distance
from
    table_name
order by
    geometry_column <-> ST_GeometryFromText('POINT(longitude latitude)',4326)
LIMIT 10 offset 0

结束

Postgis安装指南

1.下载
http://www.posgtis.net/
建议下载源码,自行编译安装

2.安装依赖

apt-get install libgeos++-dev  libproj-dev libjson0-dev libjson-c-dev -y

其他依赖:gdal,请在www.gdal.org下载
编译gdal

./configure --with-pg=/usr/local/postgresql/bin/pg_config --with-geos
make && make install

*gdal编译完成后会提示支持哪些功能扩展,建议能开启的都开启

3.安装Postgis
安装过程中提示缺少的lib*自行安装

./configure --with-pgconfig=/usr/local/postgresql/bin/pg_config && make && make install

4.登录Psql,在指定数据库中开启postgis扩展(不要问为啥已经安装了还要开启)

postgres#: create extension postgis;
CREATE EXTENSION
postgres#: create extension postgis_topology;
CREATE EXTENSION

安装完成。

PostgreSQL更改字段顺序

要注意这并不是一个好主意,如非必要,请不要尝试去修改一个表的字段顺序,有该需求请尝试去重建表。

1.通过pg_class查找[表,索引,视图等的名字],[表在磁盘上的文件的名字]
SELECT relname, relfilenode FROM pg_class WHERE relname='order_change_table'

查询结果为:order_change_table | 12666

2.通过pg_attribute查找[此列/字段所属的表],[字段名字],[字段数目]
SELECT attrelid, attname, attnum FROM pg_attribute WHERE attrelid=12666

查询结果为:12666 | id | 1 12666 | name | 2 12666 | password | 3 12666 | new_field | 4

3.更新pg_attribute的[attnum]字段(将要移动的字段先更新成数据库里面没有的值,再按顺序更新)。

UPDATE pg_attribute SET attnum=7 WHERE attname='new_field' AND attrelid=12666;
UPDATE pg_attribute SET attnum=6 WHERE attname='name' AND attrelid=12666;
UPDATE pg_attribute SET attnum=5 WHERE attname='password' AND attrelid=12666;
UPDATE pg_attribute SET attnum=2 WHERE attname='new_field' AND attrelid=12666;
UPDATE pg_attribute SET attnum=3 WHERE attname='name' AND attrelid=12666;
UPDATE pg_attribute SET attnum=4 WHERE attname='password' AND attrelid=12666;

4.再检索表,字段就已经改好顺序了。(缺点:一旦改错表就崩溃,事先一定要备份好。优点:直达根处)
SELECT * FROM order_change_table

AES-256 加密 PHP实现

class aes {

    static public $mode = MCRYPT_MODE_NOFB;

    static public function generateKey($length=32) {
        if (!in_array($length,array(16,24,32)))
            return False;

        $str = '';
        for ($i=0;$i<$length;$i++) {
            $str .= chr(rand(33,126));
        }

        return $str;
    }

    static public function encrypt($data, $key) {

        if (strlen($key) > 32 || !$key)
            return trigger_error('key too large or key is empty.', E_USER_WARNING) && False;

        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, self::$mode);
        $iv = mcrypt_create_iv($ivSize, (substr(PHP_OS,0,1) == 'W' ? MCRYPT_RAND : MCRYPT_DEV_URANDOM ));
        $encryptedData = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, self::$mode, $iv);
        $encryptedData = $iv . $encryptedData;

        return base64_encode($encryptedData);
    }

    static public function decrypt($data, $key) {

        if (strlen($key) > 32 || !$key)
            return trigger_error('key too large or key is empty.', E_USER_WARNING) && False;

        $data = base64_decode($data);
        if (!$data)
            return False;

        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, self::$mode);
        $iv = substr($data, 0, $ivSize);

        $data = substr($data, $ivSize);

        $decryptData = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, self::$mode, $iv);

        return $decryptData;
    }
}

调用

$key = aes::generateKey();

$encode = aes::encrypt('this is text data', $key);
$decode = aes::decrypt($encode, $key);

var_dump($encode);
var_dump($decode);

2016年4月22日更新

上面的方法并不是aes-256的加密。一直搞错了。PHP实现aes-256加密最好是使用OPENSSL。
Example:

// 加密

// 加密方式使用 aes-256-cfb 并获取iv长度
$iv_size = openssl_cipher_iv_length('aes-256-cfb');

// 生成IV
$iv = mcrypt_create_iv($iv_size,MCRYPT_RAND);

// 加密
$data = openssl_encrypt($data,'aes-256-cfb',$key,OPENSSL_RAW_DATA,$iv);
// 把IV放到data前面一并输出
echo base64_encode($iv.$data);