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 = ''): 数据库表操作.
- // 分页
- $sql = "";
- $query = $GLOBALS['db']->SelectLimit($sql, $record_number, ($page_number - 1) * $record_number);
- while ($res = $db->fetch_array($query)){}
现在我们以实例的方式来说明这些方法如何使用. 首先, 在 ecshop/admin 目录下新增文件 test_mysql.php, 文件内容如下:
- <?php
- define('IN_ECS', true);
- define('EC_CHARSET', 'utf-8');
- define('ROOT_PATH', 'D:/Program Files/Zend/Apache2/htdocs/ecshop/');
- define('DATA_DIR', 'data');
- $db_host = "localhost:3306";
- $db_name = "ecshop";
- $db_user = "root";
- $db_pass = "";
- require('../includes/cls_mysql.php');
- $db = new cls_mysql($db_host, $db_user, $db_pass, $db_name);
获取所有记录
getAll 方法用来从数据库中获取满足条件的所有记录. getAllCached 是它的缓存版本, cache key 是该方法的第二个参数, 如果缓存有效, 直接返回缓存结果, 否则重新执行数据库查询.
将下面的代码加到 test_mysql.php 的最后:
- test_getAll();
- function test_getAll()
- {
- global $db;
- $sql = "SELECT user_id, user_name, email FROM ecs_admin_user";
- $result = $db->getAll($sql);
- print_r($result);
- }
修改以后的 test_mysql.php 执行结果如下:
- Array
- (
- [0] => Array
- (
- [user_id] => 1
- [user_name] => admin
- [email] => admin@admin.com
- )
- [1] => Array
- (
- [user_id] => 2
- [user_name] => bjgonghuo1
- [email] => bj@163.com
- )
- [2] => Array
- (
- [user_id] => 3
- [user_name] => shhaigonghuo1
- [email] => shanghai@163.com
- )
- [3] => Array
- (
- [user_id] => 4
- [user_name] => amonest
- [email] => amonest@foxmail.com
- )
- )
获取单行记录
getRow 方法用来从数据库中获取满足条件的单行记录, 或者说是第一条记录. getRowCached 是它的缓存版本, cache key 是该方法的第二个参数, 如果缓存有效, 直接返回缓存结果, 否则重新执行数据库查询.
将下面的代码加到 test_mysql.php 的最后:
- test_getRow();
- function test_getRow()
- {
- global $db;
- $sql = "SELECT user_id, user_name, email FROM ecs_admin_user LIMIT 1";
- $result = $db->getRow($sql);
- print_r($result);
- }
修改以后的 test_mysql.php 执行结果如下:
- Array
- (
- [user_id] => 1
- [user_name] => admin
- [email] => admin@admin.com
- )
获取某栏位的所有值
getCol 方法用来从数据库中获取满足条件的某个栏位的所有值. getColCached 是它的缓存版本, cache key 是该方法的第二个参数, 如果缓存有效, 直接返回缓存结果, 否则重新执行数据库查询.
将下面的代码加到 test_mysql.php 的最后:
- test_getCol();
- function test_getCol()
- {
- global $db;
- $sql = "SELECT email FROM ecs_admin_user";
- $result = $db->getCol($sql);
- print_r($result);
- }
修改以后的 test_mysql.php 执行结果如下:
- Array
- (
- [0] => admin@admin.com
- [1] => bj@163.com
- [2] => shanghai@163.com
- [3] => amonest@foxmail.com
- )
获取单个值
getOne 方法用来从数据库中获取满足条件的单个值. getOneCached 是它的缓存版本, cache key 是该方法的第二个参数, 如果缓存有效, 直接返回缓存结果, 否则重新执行数据库查询.
将下面的代码加到 test_mysql.php 的最后:
- test_getOne();
- function test_getOne()
- {
- global $db;
- $sql = "SELECT email FROM ecs_admin_user WHERE user_id = 4";
- $result = $db->getOne($sql);
- print_r($result);
- }
修改以后的 test_mysql.php 执行结果如下:
amonest@foxmail.com
执行数据库查询
query 方法用来执行数据库查询, 例如 INSERT,UPDATE,DELETE 等.
将下面的代码加到 test_mysql.php 的最后:
- test_query();
- function test_query()
- {
- global $db;
- $sql = "UPDATE ecs_admin_user SET todolist ='你有一封新邮件!'WHERE user_id = 4";
- $db->query($sql);
- $sql = "SELECT todolist FROM ecs_admin_user WHERE user_id = 4";
- $result = $db->getOne($sql);
- print_r($result);
- }
修改以后的 test_mysql.php 执行结果如下:
你有一封新邮件!
数据库表操作
autoExecute 方法用来简化对数据表的 INSERT 和 UPDATE.
将下面的代码加到 test_mysql.php 的最后:
- test_autoExecute();
- function test_autoExecute()
- {
- global $db;
- $table = "ecs_role";
- $field_values = array("role_name" => "总经理办", "role_describe" => "总经理办", "action_list" => "all");
- $db->autoExecute($table, $field_values, "INSERT");
- // 执行的 SQL:INSERT INTO ecs_role (role_name, action_list, role_describe) VALUES ('总经理办', 'all', '总经理办')
- $role_id = $db->insert_id(); // 新记录的 ID:5
- $field_values = array("action_list" => "goods_manage");
- $db->autoExecute($table, $field_values, "UPDATE", "role_id = $role_id");
- // 执行的 SQL:UPDATE ecs_role SET action_list = 'goods_manage' WHERE role_id = 5
- $sql = "SELECT action_list FROM ecs_role WHERE role_id = $role_id";
- $result = $db->getOne($sql);
- print_r($result);
- }
修改以后的 test_mysql.php 执行结果如下:
goods_manage
来源: http://www.bubuko.com/infodetail-2564257.html