zoukankan      html  css  js  c++  java
  • 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官方文档:




  • 相关阅读:
    MongoDB监控一 mongostat
    PHP 中 AJAX 中文乱码解决
    php常用的header头
    PHP判断访客是否移动端浏览器访问
    PHP部分字符串函数汇总
    memcached启动参数
    处理PHP中字符串的常用操作及函数
    Linux Top 命令解析
    XML的特殊字符
    Zookeeper学习(转自知乎)
  • 原文地址:https://www.cnblogs.com/xiangcaiduoyidian/p/7785081.html
Copyright © 2011-2022 走看看