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

<?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-08-30 10:51:17

ThinkPHP中的parseDSN方法的坑记录一下的相关文章

深入解析thinkphp中的addAll方法

原因: 在做中控系统中遇到了一个给用户批量分配角色的问题,刚开始想到的是循环插入,但立马给否定了,循环操作数据库开发者的大忌啊,于是查找手册找到数据写入看到批量操作:addAll(),测试成功,以为万事大吉了,但当第二次操作时提示失败,找原因,原来是数据库中已经存在的数据addAll()没有覆盖导致了错误 解决方法: 查找Thinkphp源码翻到Library/Think/Model.class.php找到了addAll方法:public function addAll($dataList,$o

ThinkPHP中的魔术方法

本文实例分析了ThinkPHP中的__initialize()和类的构造函数__construct().分享给大家供大家参考.具体分析如下: thinkphp中的__construct是不可以随便用的,因为你的模块类继承上级类,上级类有定义好的; 1.__initialize()不是php类中的函数,php类的构造函数只有__construct(). 2.类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化.

关于django中的get_or_create方法的坑

最近在项目中发现了这样的一个坑,那就是我们的需求是不能添加一个相同的对象到数据库中,就通过某些字段的值组合成唯一值到数据库中去查找数据,如果没有找到对象,那就创建一条新的数据库记录,而刚好django又提供了这种方法,那就是get_or_create.可是在测试的时候发现会加入相同的对象. 而解决方法就是:其实我们可以从数据库级别来使这几个字段组合唯一,这样如果有重复的数据就会加不进去. class Meta: unique_together = (("xxx", "xxxx

关于thinkphp中的G方法使用

最近在研究thinkphp框架发现其中有好多东西很值得借鉴今天看了一下函数G()很适合调试出页面执行的时间和使用的内存情况具体的代码如下 <?php /** * 记录和统计时间(微秒)和内存使用情况 * 使用方法: * <code> * G('begin'); // 记录开始标记位 * // ... 区间运行代码 * G('end'); // 记录结束标签位 * echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位 * echo G('begin',

app中h5交互的一些坑 记录笔记

1.ios开发镶嵌 h5页面 存在input 圆角问题(安卓直角) 解决办法 inpput{ -webkit-appearance: none; border-radius: 0px; } 2.ios 镶嵌页面 当原生键盘输入时 底部按钮悬浮 在屏幕中间 解决办法:(ps 显示用的 position:fixed ) xxx{ position: absolute; } 3.与app交互是转跳页面时 需要确认需求 是否回退时 还需要返回此页面 如果需要则 不能使用 常规 url 转跳 . 4.待续

thinkphp 5 count()方法在控制器,模板中的使用方法

thinkphp中关于count()方法的使用: 控制器中:echo count($arr)模板中:{$arr | count}模板中if判断语句中 <if condition="count($arr)">.....</if> 在模板中的if语句里的condition 进行大小判断 eq:等于 neq:不等于 lt:小于 gt:大于 原文地址:https://www.cnblogs.com/tine/p/8669370.html

ThinkPHP 更新数据 save方法

ThinkPHP save() 方法 ThinkPHP 中使用 save() 方法来更新数据库,并且也支持连贯操作的使用. 例子: public function update(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); // 需要更新的数据 $data['email'] = '[email protected]'; // 更新的条件 $condition['userna

ThinkPHP中的模型二

ThinkPHP中的模型 1.为什么要创建数据对象 案例:使用ThinkPHP完成部门管理 ① 设计数据库 ② 创建Dept控制器 路径:./Application/Admin/Controller创建控制器 规则:DeptController.class.php 编程程序三步走 ③ 复制add.html模板到./Application/Admin/View/Dept文件夹,更改模板路径 ④ 更改View/Index/index.html左侧导航 ⑤ 获取添加功能的上级部门(使用模型) 路径:.

thinkphp中的ajax分页

thinkphp中用ajax分页和普通的ajax分页的区别在于处理位置的不同,thinkphp是在控制器的方法中处理ajax传的值,然后返回数据.下面是一个点击事件触发后,显示的内容用ajax分页. 下面的示例是同一个类别下,根据点击不同的分类显示出点击的分类的数据. 需要修改的地方用黄色背景标示. 1.ajax处理页面 $(".php_list").click(function(){//点击事件,可以根据自己的要求修改.也可以放在$(document).ready(function(