博客

  • php反序列化失败怎么办

    php反序列化失败是因为序列化数据时的编码与反序列化时的编码不一致导致的,其解决办法就是使用处理过的单双引号,过滤“\r”的“mb_unserialize”方法即可成功反序列化。

    php unserialize 返回false的解决方法

    php 提供serialize(序列化) 与unserialize(反序列化)方法。

    使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。

    <?php

    $arr = array(

        'name' => 'fdipzone',

        'gender' => 'male'

    ); 

    $str = serialize($arr); //序列化

    echo 'serialize str:'.$str."\r\n\r\n";

     

    $content = unserialize($str); // 反序列化

    echo "unserialize str:\r\n";

    var_dump($content);

    ?>

    输出:

    serialize str:a:2:{s:4:"name";s:8:"fdipzone";s:6:"gender";s:4:"male";}

     

    unserialize str:

    array(2) {

      ["name"]=>

      string(8) "fdipzone"

      ["gender"]=>

      string(4) "male"

    }

    但下面这个例子反序列化会返回false

    <?php

    $str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"新晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"中国北京市 北京市移动";s:4:"miao";s:1:"5";}';

    var_dump(unserialize($str)); // bool(false)

    ?>

    检查序列化后的字符串,发现出问题是在两处地方

    s:5:"url"

    s:29:"http://www.baidu.com/test.html"

    这两处应为

    s:3:"url"

    s:30:"http://www.baidu.com/test.html"

    出现这种问题的原因是序列化数据时的编码与反序列化时的编码不一致导致,例如数据库是latin1和UTF-8字符长度不一样。

    另外有可能出问题的还有单双引号,ascii字符"\0"被解析为 '\0',\0在C中是字符串的结束符等于chr(0),错误解析后算了2个字符。

    \r在计算长度时也会出问题。

    解决方法如下:

    // utf8

    function mb_unserialize($serial_str) {

        $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );

        $serial_str= str_replace("\r", "", $serial_str);

        return unserialize($serial_str);

    }

     

    // ascii

    function asc_unserialize($serial_str) {

        $serial_str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str );

        $serial_str= str_replace("\r", "", $serial_str);

        return unserialize($serial_str);

    }

    例子:

    echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';

     

    // utf8

    function mb_unserialize($serial_str) {

        $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );

        $serial_str= str_replace("\r", "", $serial_str);

        return unserialize($serial_str);

    }

     

    $str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"新晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"中国北京市 北京市移动";s:4:"miao";s:1:"5";}';

     

    var_dump(unserialize($str));    // false

     

    var_dump(mb_unserialize($str)); // 正确

    使用处理过单双引号,过滤\r的mb_unserialize方法就能成功反序列化了。

    使用unserialize

    bool(false)

     

    使用mb_unserialize

    array(9) {

      ["time"]=>

      int(1405306402)

      ["name"]=>

      string(6) "新晨"

      ["url"]=>

      string(1) "-"

      ["word"]=>

      string(1) "-"

      ["rpage"]=>

      string(30) "http://www.baidu.com/test.html"

      ["cpage"]=>

      string(1) "-"

      ["ip"]=>

      string(15) "117.151.180.150"

      ["ip_city"]=>

      string(31) "中国北京市 北京市移动"

      ["miao"]=>

      string(1) "5"

    }

    本文原创发布php中文网,出处:https://www.php.cn/php-ask-460021.html

  • php如何实现ftp上传

    php实现ftp上传的方法:首先通过“ftp_connect”函数连接FTP服务器 ;然后使用username和password登录;最后通过“ftp_put()”函数实现ftp上传即可。

    1. 使用PHP操作FTP-用法

    <?php

    // 联接FTP服务器

    $conn = ftp_connect(ftp.server.com);

    // 使用username和password登录

    ftp_login($conn, “john”, “doe”);

    // 获取远端系统类型

    ftp_systype($conn);

    // 列示文件

    $filelist = ftp_nlist($conn, “.”);

    // 下载文件

    ftp_get($conn, “data.zip”, “data.zip”, FTP_BINARY);

    // 关闭联接

    ftp_quit($conn);     

    //初结化一个FTP联接,PHP提供了ftp_connect()这个函数,它使用主机名称和端口作为参数。在上面的例子里,主机名字为 “ftp.server.com”;如果端口没指定,PHP将会使用“21”作为缺省端口来建立联接。

    //联接成功后ftp_connect()传回一个handle句柄;这个handle将被以后使用的FTP函数使用。

    $conn = ftp_connect(ftp.server.com);     

    //一旦建立联接,使用ftp_login()发送一个用户名称和用户密码。你可以看到,这个函数ftp_login()使用了 ftp_connect()函数传来的handle,以确定用户名和密码能被提交到正确的服务器。

    ftp_login($conn, “john”, “doe”);     

    // close connection

    ftp_quit($conn);     

    //登录了FTP服务器,PHP提供了一些函数,它们能获取一些关于系统和文件以及目录的信息。

    ftp_pwd()     

    //获取当前所在的目录

    $here = ftp_pwd($conn);     

    //获取服务器端系统信息ftp_systype()

    $server_os = ftp_systype($conn);     

    //被动模式(PASV)的开关,打开或关闭PASV(1表示开)

    ftp_pasv($conn, 1);     

    //进入目录中用ftp_chdir()函数,它接受一个目录名作为参数。

    ftp_chdir($conn, “public_html”);     

    //回到所在的目录父目录用ftp_cdup()实现

    ftp_cdup($conn);     

    //建立或移动一个目录,这要使用ftp_mkdir()和ftp_rmdir()函数;注意:ftp_mkdir()建立成功的话,就会返回新建立的目录名。

    ftp_mkdir($conn, “test”);     

    ftp_rmdir($conn, “test”);     

    //上传文件,ftp_put()函数能很好的胜任,它需要你指定一个本地文件名,上传后的文件名以及传输的类型。比方说:如果你想上传 “abc.txt”这个文件,上传后命名为“xyz.txt”,命令应该是这样:

    ftp_put($conn, “xyz.txt”, “abc.txt”, FTP_ASCII);     

    //下载文件:PHP所提供的函数是ftp_get(),它也需要一个服务器上文件名,下载后的文件名,以及传输类型作为参数,例如:服务器端文件为his.zip,你想下载至本地机,并命名为hers.zip,命令如下:

    ftp_get($conn, “hers.zip”, “his.zip”, FTP_BINARY);     

    //PHP提供两种方法:一种是简单列示文件名和目录,另一种就是详细的列示文件的大小,权限,创立时间等信息。     

    //第一种使用ftp_nlist()函数,第二种用ftp_rawlist().两种函数都需要一个目录名做为参数,都返回目录列做为一个数组,数组的每一个元素相当于列表的一行。

    $filelist = ftp_nlist($conn, “.”);     

    //函数ftp_size(),它返回你所指定的文件的大小,使用BITES作为单位。要指出的是,如果它返回的是 “-1”的话,意味着这是一个目录

    $filelist = ftp_size($conn, “data.zip”);     

    ?>

    2. FTP上传类 (ftp.php)

    <?php

    /********************************************

    * MODULE:FTP类

    *******************************************/

    class ftp

    {

      public $off;             // 返回操作状态(成功/失败)

      public $conn_id;           // FTP连接     

      /**

      * 方法:FTP连接

      * @FTP_HOST -- FTP主机

      * @FTP_PORT -- 端口

      * @FTP_USER -- 用户名

      * @FTP_PASS -- 密码

      */

      function __construct($FTP_HOST,$FTP_PORT,$FTP_USER,$FTP_PASS)

      {

        $this->conn_id = @ftp_connect($FTP_HOST,$FTP_PORT) or die("FTP服务器连接失败");

        @ftp_login($this->conn_id,$FTP_USER,$FTP_PASS) or die("FTP服务器登陆失败");

        @ftp_pasv($this->conn_id,1); // 打开被动模拟

      }

        

      /**

      * 方法:上传文件

      * @path  -- 本地路径

      * @newpath -- 上传路径

      * @type  -- 若目标目录不存在则新建

      */

      function up_file($path,$newpath,$type=true)

      {

        if($type) $this->dir_mkdirs($newpath);

        $this->off = @ftp_put($this->conn_id,$newpath,$path,FTP_BINARY);

        if(!$this->off) echo "文件上传失败,请检查权限及路径是否正确!";

      }

        

      /**

      * 方法:移动文件

      * @path  -- 原路径

      * @newpath -- 新路径

      * @type  -- 若目标目录不存在则新建

      */

      function move_file($path,$newpath,$type=true)

      {

        if($type) $this->dir_mkdirs($newpath);

        $this->off = @ftp_rename($this->conn_id,$path,$newpath);

        if(!$this->off) echo "文件移动失败,请检查权限及原路径是否正确!";

      }

        

      /**

      * 方法:复制文件

      * 说明:由于FTP无复制命令,本方法变通操作为:下载后再上传到新的路径

      * @path  -- 原路径

      * @newpath -- 新路径

      * @type  -- 若目标目录不存在则新建

      */

      function copy_file($path,$newpath,$type=true)

      {

        $downpath = "c:/tmp.dat";

        $this->off = @ftp_get($this->conn_id,$downpath,$path,FTP_BINARY);// 下载

        if(!$this->off) echo "文件复制失败,请检查权限及原路径是否正确!";

        $this->up_file($downpath,$newpath,$type);

      }

        

      /**

      * 方法:删除文件

      * @path -- 路径

      */

      function del_file($path)

      {

        $this->off = @ftp_delete($this->conn_id,$path);

        if(!$this->off) echo "文件删除失败,请检查权限及路径是否正确!";

      }

        

      /**

      * 方法:生成目录

      * @path -- 路径

      */

      function dir_mkdirs($path)

      {

        $path_arr = explode('/',$path);       // 取目录数组

        $file_name = array_pop($path_arr);      // 弹出文件名

        $path_p = count($path_arr);        // 取层数     

        foreach($path_arr as $val)          // 创建目录

        {

          if(@ftp_chdir($this->conn_id,$val) == FALSE)

          {

            $tmp = @ftp_mkdir($this->conn_id,$val);

            if($tmp == FALSE)

            {

              echo "目录创建失败,请检查权限及路径是否正确!";

              exit;

            }

            @ftp_chdir($this->conn_id,$val);

          }

        }

            

        for($i=1;$i<=$path_p;$i++)         // 回退到根

        {

          @ftp_cdup($this->conn_id);

        }

      }

        

      /**

      * 方法:关闭FTP连接

      */

      function close()

      {

        @ftp_close($this->conn_id);

      }

    }

    // class class_ftp end

    事例:

    /************************************** 测试 ***********************************

    $ftp = new ftp('222.13.67.42',21,'hlj','123456');     // 打开FTP连接

    $ftp->up_file('aa.wav','test/13548957217/bb.wav');     // 上传文件

    //$ftp->move_file('aaa/aaa.php','aaa.php');        // 移动文件

    //$ftp->copy_file('aaa.php','aaa/aaa.php');        // 复制文件

    //$ftp->del_file('aaa.php');                // 删除文件

    $ftp->close();                       // 关闭FTP连接

    //******************************************************************************/

    3. PHP用FTP函数创建目录

    <?php

    // create directory through FTP connection

    function FtpMkdir($path, $newDir) {

         

        $server='ftp.yourserver.com'; // ftp server

        $connection = ftp_connect($server); // connection

         

        

        // login to ftp server

        $user = "me";

        $pass = "password";

        $result = ftp_login($connection, $user, $pass);

        

      // check if connection was made

       if ((!$connection) || (!$result)) {

        return false;

        exit();

        } else {

         ftp_chdir($connection, $path); // go to destination dir

        if(ftp_mkdir($connection,$newDir)) { // create directory

          return $newDir;

        } else {

          return false;    

        }

      ftp_close($conn_id); // close connection

      }

        

    }

    ?>

    本文原创发布php中文网,出处:https://www.php.cn/php-ask-460019.html

  • 如何解决curl_init php报错问题

    curl_init php报错的解决办法:首先在“php.ini”文件中将“extension=php_curl.dll”注释去掉;然后配置ext目录;最后将“libssh2.dll”放到“apache/bin”目录下并重启即可。

    1、首先在php.ini文件中将extension=php_curl.dll注释去掉,如下图所示:

    2、配置ext目录,需要绝对路径,extension_dir = "D:/InstallFile/php-5.6.9-Win32-VC11-x64/ext",如下图所示:

    3、在apache/bin目录中需要有libssh2.dll,ssleay32.dll, libeay32.dll,由于我的缺少了libssh2.dll,因此需要从网上下载一个,将libssh2.dll放到apache/bin目录,然后重启apache即可。

    本文原创发布php中文网,出处:https://www.php.cn/php-ask-460016.html

  • php如何将科学计数法转数字

    php将科学计数法转数字的实现方法:首先通过if语句判断指定的数值是否为科学计数法;然后提取科学计数法中有效的数据;接着正式处理该数据;最后调用“convert_scientific_number_to_normal”方法实现转换即可。

    PHP将科学计数法转换为正常的数字

      每天,都会遇到些稀奇古怪的BUG,然后有遇到一个数字变成科学计数法的问题。问题来源于当前输出的一个数字太大了,然后存不下了。比如

    echo 14735037137891444444;

    echo 0.00000000000000000000000000001;

      然后输出的结果为:

    1.4735037137891E+19

    1.0E-29

      这种情况也算常见了,只是数字太大或太小导致的,然后数据库的存储字段直接是字符串,结果就出现了种种神奇的问题。

      然后就在网上找了个同样神奇的函数,确实有效,但也满坑的。然后就自己写了个,逻辑有点复杂,但没涉及到数字运算,精度应该是有保证的。

    <?php

    /**

     * 将科学计数法的数字转换为正常的数字

     * 为了将数字处理完美一些,使用部分正则是可以接受的

     * @author loveyu

     * @param string $number

     * @return string

     */

    function convert_scientific_number_to_normal($number)

    {

        if(stripos($number, 'e') === false) {

            //判断是否为科学计数法

            return $number;

        }

        if(!preg_match(

            "/^([\\d.]+)[eE]([\\d\\-\\+]+)$/",

            str_replace(array(" ", ","), "", trim($number)), $matches)

        ) {

            //提取科学计数法中有效的数据,无法处理则直接返回

            return $number;

        }

        //对数字前后的0和点进行处理,防止数据干扰,实际上正确的科学计数法没有这个问题

        $data = preg_replace(array("/^[0]+/"), "", rtrim($matches[1], "0."));

        $length = (int)$matches[2];

        if($data[0] == ".") {

            //由于最前面的0可能被替换掉了,这里是小数要将0补齐

            $data = "0{$data}";

        }

        //这里有一种特殊可能,无需处理

        if($length == 0) {

            return $data;

        }

        //记住当前小数点的位置,用于判断左右移动

        $dot_position = strpos($data, ".");

        if($dot_position === false) {

            $dot_position = strlen($data);

        }

        //正式数据处理中,是不需要点号的,最后输出时会添加上去

        $data = str_replace(".", "", $data);

        if($length > 0) {

            //如果科学计数长度大于0

            //获取要添加0的个数,并在数据后面补充

            $repeat_length = $length - (strlen($data) - $dot_position);

            if($repeat_length > 0) {

                $data .= str_repeat('0', $repeat_length);

            }

            //小数点向后移n位

            $dot_position += $length;

            $data = ltrim(substr($data, 0, $dot_position), "0").".".substr($data, $dot_position);

        } elseif($length < 0) {

            //当前是一个负数

            //获取要重复的0的个数

            $repeat_length = abs($length) - $dot_position;

            if($repeat_length > 0) {

                //这里的值可能是小于0的数,由于小数点过长

                $data = str_repeat('0', $repeat_length).$data;

            }

            $dot_position += $length;//此处length为负数,直接操作

            if($dot_position < 1) {

                //补充数据处理,如果当前位置小于0则表示无需处理,直接补小数点即可

                $data = ".{$data}";

            } else {

                $data = substr($data, 0, $dot_position).".".substr($data, $dot_position);

            }

        }

        if($data[0] == ".") {

            //数据补0

            $data = "0{$data}";

        }

        return trim($data, ".");

    }

    简单的测试数据

    1.12E8 ------------- 112000000

    1.12E3 ------------- 1120

    1.12E2 ------------- 112

    1.12E0 ------------- 1.12

    1.12E-1 ------------ 0.112

    1.12E-2 ------------ 0.0112

    1.12E-8 ------------ 0.0000000112

    0.112E1 ------------ 1.12

    0.112E2 ------------ 11.2

    0.112E4 ------------ 1120

    0.112E-2 ----------- 0.00112

    0000.112E-2 -------- 0.00112

    0000.112000E-2 ----- 0.00112

    .112E-2 ------------ 0.00112

    .112E2 ------------- 11.2

    以上就是php如何将科学计数法转数字的详细内容,更多请关注php中文网其它相关文章!

    本文原创发布php中文网,出处:https://www.php.cn/php-ask-460015.html​

  • PHP数据类型转换(字符转数字,数字转字符)

    PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:

    ● (int)、(integer):转换成整形

    ●(float)、(double)、(real):转换成浮点型

    ●(string):转换成字符串

    ●(bool)、(boolean):转换成布尔类型

    ●(array):转换成数组

    ●(object):转换成对象

    PHP数据类型有三种转换方式:

    ● 在要转换的变量之前加上用括号括起来的目标类型

    ● 使用3个具体类型的转换函数,intval()、floatval()、strval() 【记忆:想转换的目的类型+val()】

    ● 使用通用类型转换函数settype(mixed var,string type)

    第一种转换方式: (int) (bool) (float) (string) (array) (object)
    <?php
    $num1=3.14;  
    $num2=(int)$num1;  
    var_dump($num1); //输出float(3.14)  
    var_dump($num2); //输出int(3)  
    ?>

    第二种转换方式: intval() floatval() strval()
    <?php
    $str="123.9abc";  
    $int=intval($str);     //转换后数值:123  
    $float=floatval($str); //转换后数值:123.9  
    $str=strval($float);   //转换后字符串:"123.9"   
    ?>

    第三种转换方式: settype();
    <?php
    $num4=12.8;  
    $flg=settype($num4,"int");  
    var_dump($flg);  //输出bool(true)  
    var_dump($num4); //输出int(12)  
    ?>

    本文原创发布php中文网,出处:https://www.php.cn/php-weizijiaocheng-394451.html

  • MySQL 日期和时间戳的转换 | 以及DATE_FORMAT()用法

    一、MySQL 日期和时间戳的转换


    1.日期转时间戳
    — 转十位
    select UNIX_TIMESTAMP('2018-12-25 12:25:00');
    结果:1545711900

    — 转十三位
    SELECT REPLACE(unix_timestamp(current_timestamp(3)),'.','');
    结果:1545711900021


    2.时间戳转日期:FROM_UNIXTIME(unix_timestamp) –unix_timestamp为时间戳

    select FROM_UNIXTIME(1545711900);
    结果:2018-12-25 12:25:00

    3.时间戳转日期,自定义返回日期格式:FROM_UNIXTIME(unix_timestamp,format) — format请参考后面的截图

    select FROM_UNIXTIME(1545711900,'%Y-%m-%d %T');
    — 结果:2018-12-25 12:25:00
     

    二、DATE_FORMAT(date,format)函数用于以不同的格式显示日期/时间数据

    • date 参数是合法的日期。format 规定日期/时间的输出格式
    • 可以使用的格式有

      ————————————————
      版权声明:本文为CSDN博主「慌途L」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/qq_25112523/article/details/85251808

  • PHP计算今天、昨天、本周、本月、上月开始时间和结束时间

    /**
     * PHP计算今天、昨天、本周、本月、上月开始时间和结束时间
     */
    
    $today = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d'), date('Y')));
    $today_end = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1);
    echo $today, '<br>';//今天开始时间
    echo $today_end, '<br>';//今天结束时间
    
    $yesterday_start = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')));
    $yesterday_end = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1);
    echo $yesterday_start, '<br>';//昨天开始时间
    echo $yesterday_end, '<br>';//昨天结束时间
    
    $w = date('w') == 0 ? 7 : date('w');
    $this_mon = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - $w + 1, date('Y')));
    $this_sun = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') + (7 - $w), date('Y')));
    echo $this_mon, '<br>';//本周一时间
    echo $this_sun, '<br>';//本周日时间
    
    $last_week_mon = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - $w + 1 - 7, date('Y')));
    $last_week_sun = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - $w, date('Y')));
    echo $last_week_mon, '<br>';//上周一
    echo $last_week_sun, '<br>';//上周日
    
    $last_yue_start = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, str_pad(1, 2, 0, STR_PAD_LEFT), date('Y')));
    $last_month_days = date('t', strtotime(date('Y') . '-' . (date('m') - 1) . '-' . str_pad(1, 2, 0, STR_PAD_LEFT)));
    $last_yue_end = date('Y-m-d H:i:s', mktime(0, 0, 0, date('m') - 1, $last_month_days, date('Y')));
    
    echo $last_yue_start, '<br>';//上月1号
    echo $last_yue_end, '<br>';//上月末
  • PHP开发网站-微信登录、绑定

    准备工作:

    1、微信登录时在微信开放平台(open.weixin.qq.com)上面,注册登录之后,认证开发者资质,在管理中心添加网站应用,相关信息准备齐全,通过审核之后,可以获取到APPID和APPSECERT,然后在应用详情里面查看微信登录接口状态,如果为已获得,表示可以正常开发了。
    2、 通过获取用户基本信息接口中的UnionID来区分用户的唯一性,不过需要注意的是:公众号只有在被绑定到微信开放平台帐号下后,才会获取UnionID。只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。换句话说, 同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。

    ps:登录和绑定其实是一套流程,就算绑定,也是操作的snsapi_login的scope接口,就是说,登录是点击扫码获取openid登录,绑定也是点击扫码获取openid绑定。

    流程:

    1、用户同意授权,获取code
    2、通过code获取网页授权access_token
    3、刷新access_token
    4、拉取用户信息

    正式开发:

    1、这个方法用来触发微信登录请求(用户在网站上点击微信登录跳转的URL)

    /*
     * Appid在开放平台创建应用后获取的
     * redirect_uri是用户在微信端扫码确认登录之后的回调地址
     */
    public function wxLogin(){
        $appid = $this->appid;
        $redirect_uri = urlencode($this->redirect_uri);
        $scope = "snsapi_login";
        $state = "wxLogin";
        $url = "https://open.weixin.qq.com/connect/qrconnect?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=".$scope."&state=".$state."#wechat_redirect";
        return redirect($url);
    }
    

    2、这是用户扫码之后从微信的二维码页面会跳转到我们服务器的处理页面,用户扫码登录成功之后会携带code和state参数(通过code参数来获取网页授权access_token,拉取用户信息)

    /**
     * 微信登录
     * @param Request $req
     * @return Ambigous <\Illuminate\Routing\Redirector, \Illuminate\Http\RedirectResponse>
     */
    public function weixin(Request $req){
        $appid="";     //在开放平台创建应用后获取的
        $appkey="";  //应用签名
        $code=$req->code;//触发微信登录请求接口后返回的code参数
        $url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appkey.'&code='.$code.'&grant_type=authorization_code';
    
        $data=file_get_contents($url);
        $data=json_decode($data);
    
        $access_token=$data->access_token;
        $openid=$data->openid;
    
    
        $url1='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid;
        $call=file_get_contents($url1);
        $call=json_decode($call);
        //openid存在,直接登录,openid不存在,先注册再登录
        $user=User::where(['type'=>User::USER_TYPE_WEIXIN, 'openid'=>$call->unionid])->first();
    
        if ($user) {//当用户存在时直接登录
            self::homeLogin($user->id,$user->name);return redirect('/user/index');
        }
        //获取从微信获取的用户信息
        $name=$call->nickname;
        $img=$call->headimgurl;
        $sex=$call->sex;
        $openid=$call->openid;
        $unionid = $call->unionid;
        $id=User::insertGetId(array(
            'name'=>$name,
            'nickname'=>$name,
            'type'=>User::USER_TYPE_WEIXIN,
            'openid'=>$unionid,
            'img'=>$img,
        ));
    
        self::homeLogin($id,$name);
        return redirect('/user/index');
    }


    作者:2d8f44a33137
    链接:https://www.jianshu.com/p/f4813119dc97
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 编程中常用的单词缩写

    在编程时我们经常会用到一些缩写,下面是结合网上的和我个人总结的一些缩写。(仅供参考)
    A
    absolute -> abs
    address -> addr
    application -> app
    argument -> arg
    arguments -> args
    array -> arr
    assemble -> asm
    asynchronize -> async
    attribute -> attr
    attributes -> attrs
    average -> avg

    B
    background -> bg
    button -> btn
    buffer -> buf

    C
    calculate -> calc
    configure -> conf
    control -> ctrl
    count -> cnt
    current -> curr

    D
    database -> db
    delete -> del
    description -> desc
    destination -> dest
    document -> doc

    E
    error -> err
    escape -> esc

    F
    function -> fn

    I
    image -> img
    increment -> inc
    index -> idx
    information -> info
    initialize -> init
    insert -> ins

    J
    javascript -> js

    L
    length -> len
    library -> lib

    M
    manager -> mgr
    message -> msg

    N
    number -> num

    O
    object -> obj
    option -> opt
    options -> opts

    P
    parameter-> param
    password -> pwd
    picture -> pic
    point -> pt
    position -> pos
    previous -> prev
    property -> prop

    S
    source -> src
    string -> str

    T
    temporary -> tmp

    V
    value -> val

    W
    window -> wnd
     

    命名缩写
    通用    缩写    翻译    控件    缩写    翻译
    address    addr    地址    calendar    cdr    日历
    application    app    应用程序    messageDialog    msgdlg    消息框
    asynchronization    asyn    异步    drawer    drw    抽屉
    average    avg    平均数    buttonGroup    btngrp    按钮分组
    bitmap    bmp    位图    checkBox    chk    复选框
    buffer    buf    缓冲区    container    cntr    容器
    character    char    字符    button    btn    按钮
    color    clr    颜色    comboBox    cmb    下拉框
    command    cmd    命令    lable    lbl    标签
    delete    del    删除    progressBar    prg    进度条
    destination    dest/dst    目的地    pageIndicator    pgindic    Tab分页控件
    decrease    dec    减少    radioButton    rdo    单选框
    device    dev    设备    rangeSlider    rngsld    滑块
    different    diff    不同的    scrollView    svw    视图滚动
    directory    dir    目录    scrollBar    vsb(垂直)/hsb(水平)    滚动条
    document    doc    文档    slider    sld    滑动器
    dynamic    dyna    动态的    spinBox    spn    旋转框
    environment    env    环境    splitView    spltvw    分割视图
    error    err    错误    stackView    stackvw    堆栈视图
    execute    exec    执行    statusBar    statbr    状态条
    group    grp    组    swipeView    swpvw    滑动控件
    image    img    图像    switch    sw    开关
    information    info    信息    tabBar    tbbr    tab栏
    initialize    init    初始化    textField    txtfld    文本输入框
    library    lib    库    toolBar    tlbr    工具栏
    maximum    max    最大值    toolTip    tltp    提示框
    minimum    min    最小值    toolButton    tlbtn    工具按钮
    message    msg    消息    treeView    trvw    树形视图
    number    num    数字,数,数量    layout    lyt    布局
    object    obj    对象    mainMenu    mmnu    菜单栏
    parameter    Param    参数(形参)    groupBox    gbx    组合框
    package    pkg    打包    pictureBox    pic    图片框
    position    pos    位置    listView    lvw    列表视图
    previous    pre    前一个    window    win(wnd)    窗口
    process/Procedure    proc    进程/过程    form    frm    表单
    pointer    ptr    指针    textBox    txt    文本框
    password    pwd    密码    linkLabel    llbl    超链接标签框
    public    pub    公共的    dialog    dlg    对话框
    reference    ref    引用    scrollIndicator    scrlindic    滚动指示器
    source    src    源            
    string    str    字符串            
    summation    sum    和            
    synchronization    sync    同步            
    system    sys    系统            
    table    tbl    表格            
    temporary    tmp    临时            
    text    txt    文本            
    variable    var    变量            
    addition    add    加法/添加            
    argument    arg    实参            
    array    arr    数组            
    calculate    calc    计算            
    configuration    config    配置            
    column    col    列            
    control    ctrl    控制            
    hexadecimal    hex    十六进制            
    original    orig    原件            
    return    rtn    返回            
    repeat    rpt    重复            
    signal    sig    信号            
    status    stat    状态            
    stack    stk    栈区            
    standard    std    标准            
    trigger    trig    触发            
    background    bg    背景            
    escape    esc    退出            
    user    usr    用户            
    list    lst    列表            
    server    srv    服务            
    manager    mgr    管理者            
    insert    ins    插入            
    point    pt    点            
    function    func    函数            
    back    bk    返回            
    break    brk    间断            
    data    dat    日期            
    edit    edt    编辑            
    flag    flg    标志            
    grid    grd    网格            
    increment    inc    增量            
    length    len    长度            
    oracle    ora    甲骨文数据库            
    panorama    pano    全景            
    print    prn    打印            
    program    prg    程序            
    statistic    stat    统计            
    administrator    adm    管理员            
    database    db    数据库            
    change    chg    改变            
    click    clk    点击            
    compare    cmp    比较            
    coordinates    coord    坐标            
    copy    cpy    复制            
    current    cur    当前的            
    dictionary    dict    字典            
    display    disp    显示            
    driver    drv    驱动            
    extend    ex/ext    扩展            
    frame    frm    框架/帧            
    index    idx / ndx    索引            
    horizontal    horz    水平            
    instance    ins    实例            
    increase    inc    增加            
    link    lnk    链接            
    middle    mid    中间            
    multiply    mul    乘            
    resource    res    资源            
    select    sel    选择            
    test    tst    测试            
    vertical    vert    垂直