ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
#### 数据基本操作 微擎系统数据库操作使用 PDO 兼容方式,以参数绑定的形式进行查询操作。 系统已对 PDO 兼容性进行检测及封装。下面具体说明一下数据库的几种基本操作方法。 **tablename()** 为了防止微擎系统的表与其它系统命名冲突,安装微擎时均会指定一个表前缀,在写SQL语句时,需要将表名称附加上表前缀。可以使用 tablename() 函数。 ~~~ $sql = "SELECT * FROM ".tablename('users'); echo $sql; //输出 SELECT * FROM ims_users ~~~ #### 查询 查询是数据库操作中使用最频繁的操作,微擎系统封装了一些函数适用于不同的场景,以下逐个说明 **pdo_get** 根据条件(AND连接)到指定的表中获取一条记录 * $tablename 参数指定要查询的数据表名,此处传入的表名不要使用tablename()函数 * $condition 参数指定查询的条件,以是 AND 连接,不支持大于,小于等范围条件 * $fields 参数指定查询返回的字段列表 ~~~ array | boolean pdo_get($tablename, $condition = array(), $fields = array()); 示例: //根据uid获取用户的用户名和用户Id信息 //生成的SQL等同于:SELECT username, uid FROM ims_users WHERE uid = '1' LIMIT 1 $user = pdo_get('users', array('uid' => 1), array('username', 'uid')); //生成的SQL等同于:SELECT username FROM ims_users WHERE username = 'mizhou' AND status = '1' LIMIT 1 $user = pdo_get('users', array('username' => 'mizhou', 'status' => 1), array('username')); ~~~ **pdo_getall** 根据条件(AND连接)到指定的表中获取全部记录 * $keyfield 参数传入一个已存在的字段名称,结果数组键值就为该字段,否则为自然排序 * 其它参数同pdo_get函数 ~~~ array | boolean pdo_getall($tablename, $condition = array(), $fields = array(), $keyfield = '') { 示例: //获取全部启用的用户 //生成的SQL等同于:SELECT * FROM ims_users WHERE status = '1' $user = pdo_get('users', array('status' => 1)); ~~~ **pdo_getslice** 根据条件(AND连接)到指定的表中获取某个区间的记录,此函数和 pdo_getall 的区别是可以指定limit 值 * $limit 参数指定查询语句的LIMIT值,array(start, end) 或是直接传入范围 2,3 * $total 参数指定查询结果的总条数,方便进行分页操作 ~~~ array | boolean pdo_getslice($tablename, $condition = array(), $limit = array(), &$total = null, $fields = array(), $keyfield = '') 示例: $user = pdo_getslice('users', array(), array(0, 10), $total); echo $total; ~~~ **pdo_fetch** 根据SQL语句,查询一条记录 * $sql 参数指定要返回记录集的SQL语句 * $params 参数指定为SQL语句中的参数绑定传值,防止SQL注入 * 需要注意的是使用参数绑定时,SQL语中等号后不需要使用引号,传入的值必须与绑定的名称一致 ~~~ array | boolean pdo_fetch($sql, $params = array()); 示例: // :uid 是参数的一个占位符,没有使用引号,传入的第二个参数中要与SQL中的占位名称相同 $user = pdo_fetch("SELECT username, uid FROM ".tablename('users')." WHERE uid = :uid LIMIT 1", array(':uid' => 1)); // LIKE 占位的使用方法 $user = pdo_fetch("SELECT * FROM ".tablename('users')." WHERE username LIKE :username", array(':username' => '%mizhou%')); ~~~ **pdo_fetchcolumn** 根据SQL语句,查询第一条记录的第N列的值,此语句与 pdo_fetch 使用相同,只是此函数返回的不是一个数组而是一个字符串\ * $column 参数指定返回记录集的第几列数据 ~~~ string | boolean pdo_fetchcolumn($sql, $params = array(), $column = 0) 示例: // 获取用户的总数,返回的值是一个数字 $user_total = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename('users')); ~~~ **pdo_fetchall** 根据SQL语句,查询全部记录,使用方法与pdo_fetch相同 ~~~ array | boolean pdo_fetchall($sql, $params = array(), $keyfield = '') 示例: // 需要注意的是,返回的数组的键值为用户的uid $user = pdo_fetchall("SELECT username, uid FROM ".tablename('users'), array(), 'uid'); ~~~ #### 变更 以下说明插入,更新,删除操作的几个函数。 **pdo_insert** 对指定数据表插入一条新记录 * $tablename 参数指定要插入记录的数据表名,此处传入的表名不要使用tablename()函数 * $data 参数指定要插入的记录,格式为与数据表字段对应的关联数组 * $replace 参数指定插入方式使用 INSERT 语句或是 REPLACE 语句(查找到主键相同的数据选择update) ~~~ int | boolean pdo_insert($tablename, $data = array(), $replace = false) 示例: //添加一条用户记录,并判断是否成功 $user_data = array( 'username' => 'mizhou1', 'status' => '1', ); $result = pdo_insert('users', $user_data); if (!empty($result)) { $uid = pdo_insertid(); message('添加用户成功,UID为' . $uid); } ~~~ **pdo_update** 更新指定的数据表的记录 * $glue 参数指定前面 $condition 数组条件的关联字 AND 或是 OR ~~~ array | boolean pdo_update($tablename, $data = array(), $condition, $glue = 'AND') 示例: //更uid等于2的用户的用户名 $user_data = array( 'username' => 'mizhou2', ); $result = pdo_update('users', $user_data, array('id' => 2)); if (!empty($result)) { message('更新成功'); } ~~~ **pdo_delete** 删除指定条件的数据 ~~~ int | boolean pdo_delete($tablename, $condition = array(), $glue = 'AND') 示例: //删除用户名为mizhou2的记录 $result = pdo_delete('users', array('username' => 'mizhou2')); if (!empty($result)) { message('删除成功'); } ~~~ #### 运行SQL 当更新,插入,删除无法满足时,可以直接构造SQL语句进行操作 **pdo_query** 运行一条SQL语句 * $params 指定SQL语句中绑定参数的值,参数占位与 pdo_fetch 一致 ~~~ int | boolean query($sql, $params = array()) 示例: //更uid等于2的用户的用户名 $result = pdo_query("UPDATE ".tablename('users')." SET username = :username, age = :age WHERE uid = :uid", array(':username' => 'mizhou2', ':age' => 18, ':uid' => 2)); //删除用户名为mizhou2的记录 $result = pdo_query("DELETE FROM ".tablename('users')." WHERE uid = :uid", array(':uid' => 2)); if (!empty($result)) { message('删除成功'); } ~~~ **pdo_run** 批量执行SQL语句 * $stuff 函数将会将此参数指定的值,替换为当前系统的表前缀。 * 注:与pdo_query不同的是,pdo_run是可以一次执行多条SQL语句,每条SQL必须以;分隔 ~~~ boolean run($sql, $stuff = 'ims_') 示例: $sql = <<<EOF CREATE TABLE IF NOT EXISTS `ims_multisearch` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `weid` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `ims_multisearch_fields` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `reid` int(10) unsigned NOT NULL, `type` tinyint(1) unsigned NOT NULL DEFAULT '1', `title` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `idx_reid` (`reid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; EOF; pdo_run($sql); ~~~ #### 辅助函数 **pdo_fieldexists** 检查表中是否存在某个字段 * $tablename 参数指定要检查的表名称 * $fieldname 参数指定要检查是否存在的字段名 ~~~ boolean pdo_fieldexists($tablename, $fieldname) 示例: //如果shopping_goods表中不存在credit字段,则新增credit字段 if(!pdo_fieldexists('shopping_goods', 'credit')) { pdo_query("ALTER TABLE ".tablename('shopping_goods')." ADD `credit` int(11) NOT NULL DEFAULT '0';"); } ~~~ **pdo_indexexists** 检查表中是否存在某个索引 * $tablename 参数指定要检查的表名称 * $indexname 参数指定要检查是否存在的索引名 ~~~ boolean pdo_indexexists($tablename, $indexname) 示例: //如果site_slide表中不存在multiid索引,则新增multiid索引 if (!pdo_indexexists('site_slide', 'multiid')) { pdo_query("ALTER TABLE ".tablename('site_slide')." ADD INDEX `multiid` (`multiid`);"); } ~~~ **pdo_tableexists** 检查数据库中是否存在某个表 ~~~ boolean pdo_tableexists($tablename) ~~~ **pdo_debug** 调试运行SQL语句,显示执行过的SQL的栈情况 * $output 参数指定是否直接打印出调试信息 ~~~ array debug($output = true, $append = array()) 示例: pdo_debug(); //调用该函数结果如下 Array ( [0] => Array ( [sql] => SET NAMES 'utf8'; [error] => Array ( [0] => 00000 [1] => [2] => ) ) [1] => Array ( [sql] => SELECT `value` FROM `ims_core_cache` WHERE `key`=:key [params] => Array ( [:key] => setting ) [error] => Array ( [0] => 00000 [1] => [2] => ) ) ) ~~~