thinkphp中连接oracle时封装方法无法用的解决办法
程序员文章站
2023-11-13 12:50:10
最近收集了一些关于thinkphp连接oracle数据库的问题,有很多朋友按照连接mysql的方法来操作,导致有一些方法在oreale中无法正常使用。比如说:findall...
最近收集了一些关于thinkphp连接oracle数据库的问题,有很多朋友按照连接mysql的方法来操作,导致有一些方法在oreale中无法正常使用。比如说:findall,select方法无法使用,获取不到需要的数据。create和add方法无法创建和写入数据到数据库中。
其实根据以前问题我做了几天调试,找到了问题所在,并成功在我自己一个小项目练习中使用正常,那么现在就将我的经验分享给大家。
1,数据库的连接及配置文件的内容我就不说了, 上面已经做了解释。我这里只根据一个数据表的例子来说明我的操作。
2,表结构如下:
3,这个表中有3个字段,id主键,用户名username和密码password,因为oracle数据库把表名和字段都是转成大写的,同时不支持id主键自增,我只有使用另外的方法来实现这个功能,比如:id自动序列+触发器实现id自增。
public function index() {
header("content-type:text/html; charset=utf-8");
$m_user = new usermodel();
$user_list = $m_user->select();
$this->assign('title', '用户管理');
$this->assign('userlist', $user_list);
$this->display();
}
//添加用户提交处理
public function create_post() {
$m_user = new usermodel();
$data['username'] = $this->_post('username');
$data['password'] = md5($this->_post('pwd'));
if ($m_user->create()) {
$query_result = $m_user->add($data);
if (false !== $query_result) {
$this->success('用户添加成功');
} else {
$this->error('用户添加错误');
}
} else {
header("content-type:text/html; charset=utf-8");
exit($m_user->geterror() . ' [ <a href="javascript:history.back()">返 回</a> ]');
}
}
action解释:
$m_user=new usermodel();
这个方法最好这么写,因为做.net的原因,一直都这么写的。针对具体的模型进行实例化,严格规定我就要对user表进行操作了。
获取post数据的代码就不多解释了。
$m_user->create();
这是thinkphp的一个方法,很好,可以帮你过滤掉非法的东西,建议使用。
$query_result = $m_user->add($data);
这一段就是数据的添加,我习惯指定要添加的数据,也是因为这一段需要根据$m_user实例化,并过滤字段。当然了,我们只要做好model的代码,就不会有问题。下面的代码就不解释。官方文档都有。
我的model是这样的:usermodel.class.php
?protected $fields = array(
'id', 'username', 'password'
);
model解释:这才是重点,这有这样,new出来的$m_user的映射字段数组才不会为空,这样才能和post的数据进行对应,才会让过滤方法正常识别,不被过滤。
6,经过了以上的操作,针对oracle的数据库操作就完成了,我现在也可以任意使用thinkphp提供的方法来操作数据了,包括分页(limit),find(),findall等等。
连接mysql或许没有问题,但是在oracle中,封装的方法无法调用时,一定要在model层中加入字段的定义。
其实根据以前问题我做了几天调试,找到了问题所在,并成功在我自己一个小项目练习中使用正常,那么现在就将我的经验分享给大家。
1,数据库的连接及配置文件的内容我就不说了, 上面已经做了解释。我这里只根据一个数据表的例子来说明我的操作。
2,表结构如下:
3,这个表中有3个字段,id主键,用户名username和密码password,因为oracle数据库把表名和字段都是转成大写的,同时不支持id主键自增,我只有使用另外的方法来实现这个功能,比如:id自动序列+触发器实现id自增。
4,thinkphp中,action是控制器,model是模型,视图是以模板方式体现的。
首先,说控制器,我只做增加和获取列表的方法介绍。
其次,说模型,这里才是成功的主要原因。为什么?thinkphp是有字段映射的,这个在对mysql的支持非常完美,基本不用写model,但是对oralce就不行了,当使用m->add()来添加数据时,字段会被$this->_facade()方法过滤掉。这样生成的sql语句就是没法执行的,肯定是错误的,导致数据添加不到数据库中,那么使用select()方法也是一样被过滤。
再次,当我单步调试时,断点被过滤的时候,过滤方法使用到了new出来的model,这个model会有一个字段映射的数组在里面,这个过滤方法就是和这个字段数组进行对比,如果不一致就过滤掉,结果我调试发现,new出来的model根本没有把字段映射加进去,数组直接为空,当然就没法和添加的数据字段一一对应了。这就是错误的关键。
下面就来说解决方法,其实很简单,按照基本的mvc结构,不管是php还是java还是.net都有这样的结构,那么按照严格的标准,model层的代码是必须写的,就是要和数据库的字段做映射。但是很多用mysql的,就直接没有去写model里面的代码。这种习惯被用到了oracle中,就出了问题。
5,下面针对我上面的数据表写出我的代码:
我的action是这样的:useraction.class.php。控制器我只对添加和查找做例子,因此代码如下:
复制代码 代码如下:
public function index() {
header("content-type:text/html; charset=utf-8");
$m_user = new usermodel();
$user_list = $m_user->select();
$this->assign('title', '用户管理');
$this->assign('userlist', $user_list);
$this->display();
}
//添加用户提交处理
public function create_post() {
$m_user = new usermodel();
$data['username'] = $this->_post('username');
$data['password'] = md5($this->_post('pwd'));
if ($m_user->create()) {
$query_result = $m_user->add($data);
if (false !== $query_result) {
$this->success('用户添加成功');
} else {
$this->error('用户添加错误');
}
} else {
header("content-type:text/html; charset=utf-8");
exit($m_user->geterror() . ' [ <a href="javascript:history.back()">返 回</a> ]');
}
}
action解释:
复制代码 代码如下:
$m_user=new usermodel();
这个方法最好这么写,因为做.net的原因,一直都这么写的。针对具体的模型进行实例化,严格规定我就要对user表进行操作了。
获取post数据的代码就不多解释了。
复制代码 代码如下:
$m_user->create();
这是thinkphp的一个方法,很好,可以帮你过滤掉非法的东西,建议使用。
复制代码 代码如下:
$query_result = $m_user->add($data);
这一段就是数据的添加,我习惯指定要添加的数据,也是因为这一段需要根据$m_user实例化,并过滤字段。当然了,我们只要做好model的代码,就不会有问题。下面的代码就不解释。官方文档都有。
我的model是这样的:usermodel.class.php
复制代码 代码如下:
?protected $fields = array(
'id', 'username', 'password'
);
model解释:这才是重点,这有这样,new出来的$m_user的映射字段数组才不会为空,这样才能和post的数据进行对应,才会让过滤方法正常识别,不被过滤。
6,经过了以上的操作,针对oracle的数据库操作就完成了,我现在也可以任意使用thinkphp提供的方法来操作数据了,包括分页(limit),find(),findall等等。
连接mysql或许没有问题,但是在oracle中,封装的方法无法调用时,一定要在model层中加入字段的定义。
上一篇: PHP代码审核的详细介绍