<?php/** * DSN解析 * 格式: mysql://username:[email protected]: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下的换行,\n被解析成了一个 “_”
第三条是Windows下的换行,\r\n被解析成了一对 “_”
如此一来,如果代码不够谨慎,在参数参入的dsn里混杂了换行,就会导致mysql连接失败。
其具体原因,是因为parseDSN方法,使用了php的parse_url函数,可以参照php官方文档:
时间: 2024-11-07 05:39:24