ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现。这样做的好处是实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小。另外,当网站需要做memcached缓存时,也可以很方便的实现。当然,这样做的后果就是数据库的选择非常狭窄,无法实现其它的非MySQL数据库。

ECShop的数据操作类文件是includes/cls_mysql.php,类名是cls_mysql。该类主要提供了下面 一些比较有用的方法:

  • getAll($sql)和getAllCached($sql, $cached = 'FILEFIRST'):获取所有记录。
  • getRow($sql, $limited = false)和getRowCached($sql, $cached = 'FILEFIRST'):获取单行记录。
  • getCol($sqlse)和getColCached($sql, $cached = 'FILEFIRST'):获取某栏位的所有值。
  • getOne($sql, $limited = false)和getOneCached($sql, $cached = 'FILEFIRST'):获取单个数值。
  • query($sql):执行数据库查询。
  • autoExecute($table, $field_values, $mode = 'INSERT', $where = ''):数据库表操作。

现在我们以实例的方式来说明这些方法如何使用。首先,在ecshop/admin目录下新增文件test_mysql.php,文件内容如下:

  1. <?php
  2. define('IN_ECS', true);
  3. define('EC_CHARSET', 'utf-8');
  4. define('ROOT_PATH', 'D:/Program Files/Zend/Apache2/htdocs/ecshop/');
  5. define('DATA_DIR', 'data');
  6. $db_host = "localhost:3306";
  7. $db_name = "ecshop";
  8. $db_user = "root";
  9. $db_pass = "";
  10. require('../includes/cls_mysql.php');
  11. $db = new cls_mysql($db_host, $db_user, $db_pass, $db_name);

获取所有记录

getAll方法用来从数据库中获取满足条件的所有记录。getAllCached是它的缓存版本,cache key是该方法的第二个参数,如果缓存有效,直接返回缓存结果,否则重新执行数据库查询。

将下面的代码加到test_mysql.php的最后:

  1. test_getAll();
  2. function test_getAll()
  3. {
  4. global $db;
  5. $sql = "SELECT user_id, user_name, email FROM ecs_admin_user";
  6. $result = $db->getAll($sql);
  7. print_r($result);
  8. }

修改以后的test_mysql.php执行结果如下:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [user_id] => 1
  6. [user_name] => admin
  7. [email] => admin@admin.com
  8. )
  9. [1] => Array
  10. (
  11. [user_id] => 2
  12. [user_name] => bjgonghuo1
  13. [email] => bj@163.com
  14. )
  15. [2] => Array
  16. (
  17. [user_id] => 3
  18. [user_name] => shhaigonghuo1
  19. [email] => shanghai@163.com
  20. )
  21. [3] => Array
  22. (
  23. [user_id] => 4
  24. [user_name] => amonest
  25. [email] => amonest@foxmail.com
  26. )
  27. )

获取单行记录

getRow方法用来从数据库中获取满足条件的单行记录,或者说是第一条记录。getRowCached是它的缓存版本,cache key是该方法的第二个参数,如果缓存有效,直接返回缓存结果,否则重新执行数据库查询。

将下面的代码加到test_mysql.php的最后:

  1. test_getRow();
  2. function test_getRow()
  3. {
  4. global $db;
  5. $sql = "SELECT user_id, user_name, email FROM ecs_admin_user LIMIT 1";
  6. $result = $db->getRow($sql);
  7. print_r($result);
  8. }

修改以后的test_mysql.php执行结果如下:

  1. Array
  2. (
  3. [user_id] => 1
  4. [user_name] => admin
  5. [email] => admin@admin.com
  6. )

获取某栏位的所有值

getCol方法用来从数据库中获取满足条件的某个栏位的所有值。getColCached是它的缓存版本,cache key是该方法的第二个参数,如果缓存有效,直接返回缓存结果,否则重新执行数据库查询。

将下面的代码加到test_mysql.php的最后:

  1. test_getCol();
  2. function test_getCol()
  3. {
  4. global $db;
  5. $sql = "SELECT email FROM ecs_admin_user";
  6. $result = $db->getCol($sql);
  7. print_r($result);
  8. }

修改以后的test_mysql.php执行结果如下:

  1. Array
  2. (
  3. [0] => admin@admin.com
  4. [1] => bj@163.com
  5. [2] => shanghai@163.com
  6. [3] => amonest@foxmail.com
  7. )

获取单个值

getOne方法用来从数据库中获取满足条件的单个值。getOneCached是它的缓存版本,cache key是该方法的第二个参数,如果缓存有效,直接返回缓存结果,否则重新执行数据库查询。

将下面的代码加到test_mysql.php的最后:

  1. test_getOne();
  2. function test_getOne()
  3. {
  4. global $db;
  5. $sql = "SELECT email FROM ecs_admin_user WHERE user_id = 4";
  6. $result = $db->getOne($sql);
  7. print_r($result);
  8. }

修改以后的test_mysql.php执行结果如下:


执行数据库查询

query方法用来执行数据库查询,例如INSERT,UPDATE,DELETE等。

将下面的代码加到test_mysql.php的最后:

[php] view plaincopy

 
  1. test_query();
  2. function test_query()
  3. {
  4. global $db;
  5. $sql = "UPDATE ecs_admin_user SET todolist = '你有一封新邮件!' WHERE user_id = 4";
  6. $db->query($sql);
  7. $sql = "SELECT todolist FROM ecs_admin_user WHERE user_id = 4";
  8. $result = $db->getOne($sql);
  9. print_r($result);
  10. }

修改以后的test_mysql.php执行结果如下:


数据库表操作

autoExecute方法用来简化对数据表的INSERT和UPDATE。

将下面的代码加到test_mysql.php的最后:

[php] view plaincopy

 
  1. test_autoExecute();
  2. function test_autoExecute()
  3. {
  4. global $db;
  5. $table = "ecs_role";
  6. $field_values = array("role_name" => "总经理办", "role_describe" => "总经理办", "action_list" => "all");
  7. $db->autoExecute($table, $field_values, "INSERT");
  8. // 执行的SQL:INSERT INTO ecs_role (role_name, action_list, role_describe) VALUES ('总经理办', 'all', '总经理办')
  9. $role_id = $db->insert_id(); // 新记录的ID:5
  10. $field_values = array("action_list" => "goods_manage");
  11. $db->autoExecute($table, $field_values, "UPDATE", "role_id = $role_id");
  12. // 执行的SQL:UPDATE ecs_role SET action_list = 'goods_manage' WHERE role_id = 5
  13. $sql = "SELECT action_list FROM ecs_role WHERE role_id = $role_id";
  14. $result = $db->getOne($sql);
  15. print_r($result);
  16. }

修改以后的test_mysql.php执行结果如下:

  1. goods_manage

ecshop操作数据库类的更多相关文章

  1. 非常不错的ASP操作数据库类,支持多数据库MSSQL,ACCESS,ORACLE,MYSQL等

    可同时操作多个不同类型的数据库. 完全不用考虑数据类型的差别,再也不用想字符型字段加不加单引号. 调用非常简单,对数据库的主要操作一般只需要一行代码. 支持mssql事务回滚. 可自动生成和输出sql ...

  2. PHP操作数据库类

    <?php /** * 功能: 数据库操作类 . * 作者: 赵铭哲 * 日期: 2016-05-23 * 时间: 9:43 */ namespace ZH\DataBase; use \Exc ...

  3. Python操作数据库类 Oracle、Sqlserver、PostgreSQL

    我在工作中经常使用Python,特点很明显,轻量,效率还不错,尤其在维护或者自动化方面. 下面是我使用到的访问数据库(Oracle.Sqlserver.PostgreSQL)的公共类. 一.Oracl ...

  4. C++ 操作数据库类

    #pragma once #include <string> #include <windows.h> #include <algorithm> #include ...

  5. mybatis 操作数据库(05)

    类型转换.动态排序,查询接口与mapper对应关系说明及其注意事项 一.MyBatis 自带写常见类型转换器.例如:java 类中 String 对应 mySQL中的varchar 二.自定义类型转换 ...

  6. 用于JDBC操作数据库的公共类

    /* * @(#)CommonSql.java 2011-9-5 * * Copyright 2011 Bianjing,All rights reserved. */ import java.sql ...

  7. JDBC操作数据库 封装好的工具类

    mysql sqlserver oracle 数据库的驱动jar包http://download.csdn.net/download/csdn576038874/8833683package cn.h ...

  8. SQLserver数据库操作帮助类SqlHelper

    1 SqlHelper源码 using System; using System.Data; using System.Xml; using System.Data.SqlClient; using ...

  9. .NET使用DAO.NET实体类模型操作数据库

    一.新建项目 打开vs2017,新建一个项目,命名为orm1 二.新建数据库 打开 SqlServer数据库,新建数据库 orm1,并新建表 student . 三.新建 ADO.NET 实体数据模型 ...

随机推荐

  1. ROS知识(5)----消息与服务的示例

    ROS中已经定义了较多的标准类型的消息,你可以用在这些标准类型的消息上再自定义自己的消息类型.这个在复杂数据传输很有用,例如节点和服务器进行交互时,就可能用到传输多个参数到服务器,并返回相应的结果.为 ...

  2. 直接拿来用!最火的iOS开源项目(一~三)

    结束了GitHub平台上“最受欢迎的Android开源项目”系列盘点之后,我们正式迎来了“GitHub上最受欢迎的iOS开源项目”系列盘点.今天,我们将介绍20个在GitHub上非常受开发者欢迎的iO ...

  3. Switch debouncer uses only one gate

    The circuit in Figure 1 produces a single debounced pulse each time you press S1. Moreover, the circ ...

  4. JLInk 各种版本图片收集

    所有图片来自网络, 版权归原始所有者拥有. JLink V5 JLink V6 JLink V7 JLink V8 JLink V9 JLink Ultra JLink Pro

  5. CC1150 针对低功耗无线应用设计的高度集成多通道射频发送器

    Low Power Sub-1 GHz RF Transmitter 单片低成本低能耗 RF 发送芯片 应用 极低功率 UHF 无线发送器 315/433/868 和 915MHz ISM/SRD 波 ...

  6. 无线遥控检测仪 A890-RES

    本产品为无线遥控接收器发射器的生产调试项目开发而设计,能自动识别接收并显示遥控器的所有信息:频率.芯片类型.周期.地址码.数据码,并能自动计算振荡阻值,35组自动保存.315M.433M 双频同时待机 ...

  7. Openfire 性能优化

    Openfire  是一个XMPP协议的IM Server. Openfire使用mysql配合它不知所谓几乎无效的的Cache机制就注定无法支撑高并发, 所以第一步,将数据库切换为比较强一点的Mon ...

  8. React的第一个例子

    准备: 官网:https://facebook.github.io/react/downloads.html Github地址:https://github.com/facebook/react 首先 ...

  9. Android 工程报错解决 Unable to resolve target 'android-17'

    转自:http://www.cnblogs.com/csulennon/p/3705177.html 换了系统后,重新安装了Android SDK和ADT插件,导入之前的工作空间.居然发现所有的And ...

  10. 固定的价格就意味着背叛——《practices of an agile developper》

    “对这个项目,我们必须要有固定的报价.虽然我们还不清楚项目的具体情况,但仍要有一个报价.到星期一,我需要整个团队的评估,并且我们必须要在年末交付整个项目.” Venkat & Andy 提出了 ...