• ThinkPHP中的parseDSN方法的坑记录一下


    <?php
    /**
    * DSN解析
    * 格式: mysql://username:passwd@localhost:3306/DbName
    * @static
    * @access public
    * @param string $dsnStr
    * @return array
    */
    function parseDSN($dsnStr) {
    if( empty($dsnStr) ){return false;}
    $info = parse_url($dsnStr);

    if($info['scheme']){
    $dsn = array(
    'dbms' => $info['scheme'],
    'username' => isset($info['user']) ? $info['user'] : '',
    'password' => isset($info['pass']) ? $info['pass'] : '',
    'hostname' => isset($info['host']) ? $info['host'] : '',
    'hostport' => isset($info['port']) ? $info['port'] : '',
    'database' => isset($info['path']) ? substr($info['path'],1) : ''
    );
    }else {
    preg_match('/^(.*?)://(.*?):(.*?)@(.*?):([0-9]{1, 6})/(.*?)$/',trim($dsnStr),$matches);
    $dsn = array (
    'dbms' => $matches[1],
    'username' => $matches[2],
    'password' => $matches[3],
    'hostname' => $matches[4],
    'hostport' => $matches[5],
    'database' => $matches[6]
    );
    }
    $dsn['dsn'] = ''; // 兼容配置信息数组
    return $dsn;
    }

    var_dump(parseDSN("mysql://root:123456
    @localhost:3306/test")['password']);

    这里分别对解析的mysql连接参数dsn进行了3种情况的测试:

    第一条是不带换行的,密码123456是正常解析出来

    第二条是Unix下的换行, 被解析成了一个 “_”

    第三条是Windows下的换行, 被解析成了一对 “_”

    如此一来,如果代码不够谨慎,在参数参入的dsn里混杂了换行,就会导致mysql连接失败。

     其具体原因,是因为parseDSN方法,使用了php的parse_url函数,可以参照php官方文档:




  • 相关阅读:
    CentOS7 安装MongoDB 3.0服务
    PXE批量部署linux操作系统
    centos的软件安装方法rpm和yum
    第二章:Posix IPC
    第一章:简介
    Unix网络编程--卷二:进程间通信
    Unix网络编程--卷二:FAQ
    linux下samba环境搭建
    Linux下缓冲区溢出攻击的原理及对策(转载)
    lsof
  • 原文地址:https://www.cnblogs.com/xiangcaiduoyidian/p/7785081.html
Copyright © 2020-2023  润新知