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下的换行,\n被解析成了一个 “_”

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

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

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

 

 




转载于:https://www.cnblogs.com/xiangcaiduoyidian/p/7785081.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值