听了我的建议,我们单位的食堂准备使用一台指纹考勤机统计吃饭人次,这样院里好给食堂的承包人以相应饭补。以前买过一台彩屏指纹机,数据库是access的,今儿又买了一台准备放到食堂里,而且考虑到停电,还特地配备了电池盒。

 
    这台不是彩屏的,但更加灵敏,反应速度比原来买的那台快,而且快不少。看看参数把:
 
 
 
 
    但有一样,使用U盘下载考勤数据时,是加密的.txt文档,用他们公司的软件才能把数据导入为Access表中。当然也可以自己弄.txt到.mdb的过程,但极为痛苦,极度难受,还很耗时。对于本周就上线运行的食堂管理系统而言,这是显然不合适的。
    但是是可以实现的,这里是ocx,说下实现思路:
    首先只能使用IE浏览器,通过调用ocx实现相关功能,就和一卡通里的IC卡模块一样。接着实例化一个类,使用GetGeneralLogData()方法获取记录,麻烦的就在这了,得到的结果不是想当然的数组或是比较容易处理的类型。这块很耗时。
    可以看一下函数的原型:
  1. long GetGeneralLogData(long *apnEnrollNumber, long *apnVerifyMode,long *apnInOutMode, DATA *apnDateTime)
 
    执行成功返回1,失败返回对应的错误代码。要先用LoadGeneralLogData或USBLoadDataFromFile指令,不然该指令会执行失败。
    不多说了,附件里是ocx,呵呵,有兴趣的自己研究去吧。这个思路都是浮云,在规定的时间里完不成的。涉及到调试ocx插件等等潜在问题,而且不是一个OCX或DLL的FKAttend就能搞定。我的方案是,使用他们给的工具导成mdb文档,再导入到我这个一卡通的大数据库里,这样所有记录都能得到妥善保存。而且领导也能一个页面,足不出户,查看到食堂消费情况。
 
    所以要通过PHP,读取mdb并写入mysql。
    这次用的不是ThinkPHP,而是叫做DoitPHP的框架,也是头一次使用,还以为比TP好用,看官网说数据处理特别快,但是不太容易掌握,总体还是略显青涩。
    这是MDB文件上传模块:
  1. //数据库文件上传
  2. public function uploadAction(){
  3. //保存目录检测
  4. $dirurl = MDBDIR;
  5. $dir = $this->instance('file_list');
  6. $dir->make_dir($dirurl);
  7. $fileupload = $this->instance('file_upload');
  8. $new_file = $dirurl.MDBFILE;
  9. $result = $fileupload->upload($_FILES['upload'], $new_file);
  10. if(!$result){
  11. $this->assign('msg','文件上传失败!');
  12. $this->saveAction();
  13. }
  14. if(!$this->inputDBAction()){
  15. $this->assign('msg','文件导入数据库失败!');
  16. }else{
  17. $this->assign('msg',"文件已成功导入至数据库,请您在)."' >这里查询记录!");
  18. }
  19. $this->set_layout('usual');
  20. $this->assign('load_js_name','canteen');
  21. //display page
  22. $this->display('save');
  23. }
  1. //access数据库信息导入
  2. public function inputDBAction(){
  3. if(file_exists(MDBDIR.MDBFILE)){
  4. $access = $this->module('access');
  5. //注意mdb是有密码,但没有用户名
  6. $access->connect(MDBDIR.MDBFILE, '','2002', '', 0);
  7. $execarr = array();
  8. $result = $access->query("select * from ".mb_convert_encoding("考勤流水表", "GBK", "UTF-8")." where Used = No");
  9. while($arr = $access->fetch_array($result))
  10. {
  11. $execarr[] = $arr;
  12. }
  13. //现在写入数据库
  14. $att = $this->model('att_attendance');
  15. $flag = TRUE;
  16. foreach($execarr as $value){
  17. $data = $att->createRow();
  18. $data->userid = trim($value['UserID']);
  19. $data->flowtime = strtr(trim($value['FlowTime']),'/','-');
  20. $result = $att->save($data);
  21. if($result < 0){$flag = FALSE;break;}
  22. }
  23. return $flag;
  24. }
  25. }
  1. public function queryAction(){
  2. //权限验证
  3. $checkauth = $this->module('Checkauth');
  4. $checkauth->checkAuth(CANTEEN);
  5. //设定日期
  6. if(!isset($_POST['start']) && !isset($_POST['end'])){
  7. //默认返回最近1周的记录
  8. $now = getdate();
  9. //********根据今天来确定本周的日期,开始************
  10. if($now['wday']==0)$foo = -7;
  11. else $foo = 1-$now['wday'];
  12. $start = $now['year'].'-'.$now['mon'].'-'.($now['mday']+$foo);
  13. if($now['wday']==0)$foo = 0;
  14. else $foo = 7-$now['wday'];
  15. $end = $now['year'].'-'.$now['mon'].'-'.($now['mday']+$foo);
  16. //********根据今天来确定本周的日期,结束************
  17. $result = $this->model('att_attendance');
  18. //求出分组统计
  19. $att = $result->execute("select
    att_attendance.userid,att_member.name,count(att_attendance.userid) as
    total from att_attendance,att_member WHERE att_attendance.userid =
    att_member.userid GROUP BY userid");
  20. //求得总数,使用Mysql嵌套查询
  21. $sum = $result->execute("select
    sum(total) from (select
    att_attendance.userid,att_member.name,count(att_attendance.userid) as
    total from att_attendance,att_member WHERE att_attendance.userid =
    att_member.userid GROUP BY userid) as sum");
  22. //在这里继续,显示出分组结果和总数结果,只是还没有把时间增加进去
  23. }else{
  24. //对提交上来的start和end作出新的查询
  25. }
  26. $this->set_layout('usual');
  27. $this->assign('load_js_name','canteen');
  28. exit();
  29. //display page
  30. $this->display();
  31. }
 
 
 
 
 
 
 
 
 
 
    当然这里还用了一个access的PHP类,大家可以到我的这篇文章去看:
 
    五岳之巅原创,转载请注明出处。谢谢。
 

基于指纹考勤机的真实的PHP操作Access数据库成功案例(最终实现) 2011-11-2v的更多相关文章

  1. MFC通过ADO操作Access数据库

    我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...

  2. 直接通过ADO操作Access数据库

    我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...

  3. Python操作Access数据库

    我们在这篇文章中公分了五个步骤详细分析了Python操作Access数据库的相关方法,希望可以给又需要的朋友们带来一些帮助. AD: Python编 程语言的出现,带给开发人员非常大的好处.我们可以利 ...

  4. 关于操作Access数据库jdk选择问题

    关于操作Access数据库,使用jdk64位无法通过ODBC无法获取数据,只能通过jdk32位进行开发.

  5. JavaScript操作数据库JS操作Access数据库

    avaScript操作数据库JS操作Access数据库,跟其他语言操作差不多,总结了一下习惯代码,仅供参考学习.现在在F盘有文件abc.mdf,表名为Student,一共2个字段,Id数字类型主键,s ...

  6. System.Data.OleDb操作access数据库类,【bubuko.com】

    access数据库在应用了System.Data.OleDb后操作会很方便,这是一个常用的数据库操作类,其中两个方法,一个是返回datatable的,一个是执行sql语句返回影响记录的(一般是inse ...

  7. C#操作Access数据库(创建&修改结构)

    本文转自:http://www.cnblogs.com/liyugang/archive/2012/11/17/2775393.html 想要在程序中控制Access,不是数据,而是Access数据库 ...

  8. VC++中使用ADO方式操作ACCESS数据库

    ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为 ...

  9. ACCESS-关于DELPHI中操作ACCESS数据库中单精度数据的问题

    在近日几个帖子里面,和QQ群的讨论里面,我发现很多网友都遇到的问题都是因为不恰当地使用了单精度/双精度数值.因此想专门就这个话题谈一下. 单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面) ...

随机推荐

  1. 支线任务2-Basic Calculator

    问题描述: 题目要求我们实现一个简单的加减计算器,计算一个表达式的值,表达式除了数字之外还可能会含有括号,加减符号以及空格. 思路: 其实看到这个题自然就会想到利用后缀式求表达式值的算法作业题,况且这 ...

  2. c++ 计算指定半径圆的面积

    #include <iostream> #define PI 3.14 using namespace std; class Circle { float radius; public: ...

  3. Http缓存知识;HTTPS, HTTP2相关知识;百度统计和即时线上客服。

    安装 : 百度统计 来统计用户流量, Intercom 来做即时线上客服. 这两个是 JavaScript 插件放在 HTML 上的. HTTP缓存: https://developers.googl ...

  4. uva11551矩阵快速幂

    题目看了半天没看懂,,就是把一个数列更新r次,每次更新就是计算和,就是每一个数,只要出现了的表号都要加上去,具体看代码 矩阵快速幂实现加速 #include<map> #include&l ...

  5. poj3436网络流之最大流拆点

    这题看了半天看不懂题意...还是看的网上题意写的 加一个源点一个汇点,把每个点拆成两个,这两个点的流量是v,其他联通的边都设为无穷大 输入没有1的点就与源点连接,输出只有1的点就与汇点连接 还有这个输 ...

  6. JS object(对象)的学习汇总

    Object(对象)是在所有的编程语言中都十分重要的一个概念,对于事物我们可以把他们看作是一个对象,而每一个事物都有自己的表示的属性和对于某一信息作出的相应的操作.而这些东西就变成了事物的属性和方法. ...

  7. 049——VUE中使用animation与transform实现vue的动画效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. bzoj4129

    题解: 树上+可修改莫队 莫队的每一块 可以用一个栈 每一次dfs个数>sqrt(n)(自己选的)的时候就可以跳出了 然后不要忘记分出来最后一块 代码: #include<bits/std ...

  9. 《转》深入理解Activity启动流程(三)–Activity启动的详细流程2

    本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...

  10. 2017年7月ROS学习资料小结

    <孙子兵法·谋攻篇>:"上兵伐谋,其次伐交,其次伐兵,其下攻城:攻城之法为不得已." 任何发生在自己国土上的战争,即便胜利,也饱含屈辱. ----~~~~----Gaz ...