绩效考核系统开发心得之三__数据库操作

来源:互联网 发布:js动态添加class属性 编辑:程序博客网 时间:2024/05/16 04:24

前言:

数据库操作是这次开发的一个让我头疼的点,因为老师最初设计的数据库是Access..而网页又要用php来写,这让我郁闷许久,因为我什么都不会...连php和SQL都是现学的。网络上查到关于php操作数据库的教程和例子,都是Mysql的..光是想办法连接数据库就折腾了快两个整天。最初试了odbc的库,发现例子不好用,连接不到数据库。后来找到了ADOdb的库,试了下发现能用,就干脆一直用这个库了。所以目前在网站中php与Access的连接中介就是ADOdb。

SQL操作:

简单凭记忆复习一下课上讲到的SQL语句吧。

select from

用于挑选表中的项目,

例如
select * from Student

这句SQL查询就会从student表里查出所有的项目,因为我们用到了 *。
据老师所说,不提倡使用*,因为假如数据库有更改,比如新增了某一列,就会多返回一列结果,这样程序就需要进行相应的适配,显然增加了工作量,如果详细的写上需要的列,那么加入数据库有了变化,程序也不一定非要改。
比如像这样:
select stuNo,stuName,stuType from Student
假如我们的数据库加入了新的列“stuSex”,也不必修改程序。

如果只是这样使用,我们会得到这一列的所有数据,而实际情况中,我们经常需要挑选一些符合我们要求的数据,这就需要 where了。
例如
select * from Student where stuNo = 1234567890
这样就会返回Student表中stuNo为1234567890的那个学生的所有信息了,选择更有针对性。
特别特别严重的强调!
注意匹配的数据类型,这里stuNo是数字,所以可以直接 = 1234567890 ,假如这里是stuName,是文字,就要用 = '张三'才可以,一定要加单引号!
殊不知这一个单引号坑了我多少年华岁月!

这样只能查一张表,如果需要借助其他表上的数据来定位呢?
比如,我想知道成绩表ScoreDetail上某一项目的申请人的学生信息。
这里涉及多表查询,需要同时查找两张表的数据。
这里我不得不吐槽一下我自己...当时做网站的时候还没有学习数据库的课程,遇到问题了都是Google,还以为SQL只是支持到单表查询为止呢,为了实现多表查询我分了两次查询,曲线救国,但也导致代码乱七八糟,根本谈不上优雅。这一点在v1.0版本中将会改正。
好了言归正传。
我们需要两张表,Student表和ScoreDetail表,我们需要Student表上的学生信息,但需要ScoreDetail来定位某一项目,我们姑且假定项目编号itemID = 1吧
那么,SQL语句应该是这样的
select * from Student where stuID = (
select stuID from ScoreDetail where itemID = 1)

这里使用了嵌套查询,也是我记的最清楚..理解的最快的一种方式了,爱不释手……
一目了然,用括号括起来的内容作为一个整体,得到的结果给等号去做判断,然后就和单表查询一样了。


order by

这是个排序的语句,需要注意的有两点
1.这句话只能放在最后。
2.产生的排序表是虚拟的一个按照你的要求排列的表,当movenext的时候,指针指向的是虚拟表的下一个,也就是按照排序的下一个。而不是原表中的下一个。

你可以在后边跟上两个选项,比如desc倒序排列,asc顺序排列。
例如
select * from ScoreDetail where stuID=1 order by scoreDate desc

按照时间顺序从新到旧显示stuID为1的学生的所有申报信息。

insert into

插入新项
insert into ScoreDetail (scoreDate,stuID,teaID,detailinfo,itemID) values ( 2013-10-19 , 1 , 2, '测试', 10 )

需要注意的是,values后边括号里的内容与前边括号里的属性要一一对应,否则会报错。当然也可以置空。

update

更新现有项目
update student set stuNo = 1 , stuName = '张三' , stuPass = 123456 WHERE stuID = 1 

需要注意的是,语句执行完之后,并没有得到即时的体现,需要关闭当前表,才会实质性的写入到磁盘里。


SQL语句大概就用到了这么多,因为目前还没有写项目删除功能,所以暂时没有用到remove语句,等到写完了我再来更新吧。

ADOdb操作

说实话我也并没有系统的了解ADOdb的各个特性,只是知道它试图提供一个标准的接口,用于php和各种数据库的连接,目前支持的数据库里包含了Access和Mysql,但愿我改写数据库操作的时候它能帮到忙...

连接数据库


//连接数据库$conn = new com("ADODB.Connection");$rs = new com("ADODB.RecordSet");$connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" . realpath("此处为路径");$conn->Open($connstr);$rs->Open("select * from student", $conn, 1, 3);

对于这一部分的内容..我只是照搬网上的例子,能用就好了……
不过有一个地方我倒是着重了解了一下,就是
$rs->Open("select * from student", $conn, 1, 3);
这个最后的参数3。把原文拿来大家看好了。

参数3就是游标类型。

在 ADO,定义了 4 中不同的游标(指针)类型:

  • 动态游标 - 允许您查看其他用户所作的添加、更改和删除
  • 键集游标 - 类似动态游标,不同的是您无法查看有其他用户所做的添加,并且它会防止您访问其他用户已删除的记录。其他用户所做的数据更改仍然是可见的。
  • 静态游标 - 提供记录集的静态副本,可用来查找数据或生成报告。此外,由其他用户所做的添加、更改和删除将是不可见的。当您打开一个客户端 Recordset 对象时,这是唯一被允许的游标类型。
  • 仅向前游标 - 只允许在 Recordset 中向前滚动。此外,由其他用户所做的添加、更改和删除将是不可见的。

可通过 CursorType 属性或 Open 方法中的 CursorType 参数来设置游标的类型。

注释:并非所有的提供者(providers)支持 Recordset 对象的所有方法和属性。


ADO中用于取值的方法

ADO Field 对象包含有关 Recordset 对象中某一列的信息。Recordset 中的每一列对应一个 Field 对象。


比如:
$rs->Fields["itemName"]->Value
就会显示这个列中itemName的值。

记录集中元素的个数

$rs->RecordCount();

执行SQL语句

$conn->Execute($sql)












原创粉丝点击