教程06-微擎数据库函数和链式查询

数据基本操作

微擎系统数据库操作使用 PDO 兼容方式,以参数绑定的形式进行查询操作。
系统已对 PDO 兼容性进行检测及封装。下面具体说明一下数据库的几种基本操作方法。

tablename()

为了防止微擎系统的表与其它系统命名冲突,安装微擎时均会指定一个表前缀,在写SQL语句时,需要将表名称附加上表前缀。可以使用 tablename() 函数。

$sql = "SELECT * FROM ".tablename('users');
echo $sql;

//输出 SELECT * FROM ims_users

范围条件操作

微擎20160601以后的版本中,增加了pdo_getpdo_getallpdo_getcolumnpdo_getslicepdo_insertpdo_updatepdo_delete的范围条件的支持,具体支持的范围操作符如下:

$allow_operator = array('>', '<', '<>', '!=', '>=', '<=', '+=', '-=', 'LIKE', 'like');

示例:

//获取acid大于269的平台账号
$account = pdo_get('account', array('acid >' => '269'));

//增加一次用户的错误登录次数,两次变为2即可
pdo_update('users_failed_login', array('count +=' => 1), array('username' => 'mizhou'));

IN 和 NOT IN

当传入的条件数组的值为数组时,系统会自动转成成 IN 语句,如果和 <> 或 != (不等于)一起使用时,会自动转换为 NOT IN。

示例:

pdo_getall('users', array('uid' => array('1', '2', '3')));

//对应的SQL语句调用
pdo_fetchall("SELECT * FROM `ims_users` WHERE `uid` IN (:__uid_0,:__uid_1,:__uid_2)", array(':__uid_0' => 1, ':__uid_1' => 2, ':__uid_2' => 3));
pdo_getall('users', array('uid <>' => array('1', '2', '3')));

//对应的SQL语句调用
pdo_fetchall("SELECT * FROM `ims_users` WHERE `uid` NOT IN (:__uid_0,:__uid_1,:__uid_2)", array(':__uid_0' => 1, ':__uid_1' => 2, ':__uid_2' => 3));

IS NULL 和 IS NOT NULL

当且仅当值为大写的NULL字符串时,系统会认为这是需要查询NULL值,会将SQL写成 IS NULL 的形式,具体如下:

pdo_get('users', array('username' => 'NULL'));

//此语句会转化为 

SELECT * FROM user WHERE username IS NULL

聚合查询

当获取的字段中是聚合字段时,比如 COUNT(*)SUM()等,如果指定过别名,则可以真通过别名获取值,如果未指定别名,则可以通过字段排序的索引获取。

示例:

$usercount = pdo_get('users', array(), array('COUNT(*)', 'uid', 'MAX(uid)', 'MIN(uid) AS minuid'));

//$usercount 值为
Array (
	[0] => 103 //总数
	[uid] => 1 
	[2] => 179 //最大UID
	[minuid] => 1 //最小UID
)

链示查询

链式查询只支持一些常用简单的查询过于复杂的业务需求还是建议直接使用SQL语句。

查询用户表中的前十条男性的用户数据,代码如下:

$query = load()->object('query');
$row = $query->from('users')->where('type', '1')->orderby('uid', 'desc')->limit(10)->getall();

数据库函数各pdo_xxx功能列表

查询

  • pdo_get
  • pdo_getcolumn
  • pdo_getall
  • pdo_getslice
  • pdo_fetch
  • pdo_fetchcolumn
  • pdo_fetchall

变更

  • pdo_insert
  • pdo_update
  • pdo_delete

运行SQL

  • pdo_query
  • pdo_run

辅助函数

  • pdo_exists
  • pdo_fieldexists
  • pdo_indexexists
  • pdo_tableexists
  • pdo_fieldmatch
  • pdo_insertid
  • pdo_fetchallfields
  • pdo_debug

pdo_get()

根据条件(AND连接)到指定的表中获取一条记录

说明

array | boolean pdo_get($tablename, $condition = array(), $fields = array());

参数

  • $tablename 参数指定要查询的数据表名,此处传入的表名不要使用tablename()函数
  • $condition 参数指定查询的条件,以是 AND 连接,支持大于,小于等范围查询
  • $fields 参数指定查询返回的字段列表

示例

//根据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 like '%mizhou%' AND status = '1' LIMIT 1
$user = pdo_get('users', array('username like' => 'mizhou', 'status' => 1), array('username'));

pdo_getcolumn()

根据条件(AND连接)到指定的表中获取一条记录的指定字段

说明

string | int pdo_getcolumn($tablename, $condition = array(), $field);

参数

  • $tablename 参数指定要查询的数据表名,此处传入的表名不要使用tablename()函数
  • $condition 参数指定查询的条件,以是 AND 连接,支持大于,小于等范围查询
  • $field 要获取的字段名称

示例

//根据uid获取用户的用户名
//生成的SQL等同于:SELECT username FROM ims_users WHERE uid = '1' LIMIT 1
$username = pdo_getcolumn('users', array('uid' => 1), 'username');

pdo_getall()

根据条件(AND连接)到指定的表中获取全部记录

说明

array | boolean pdo_getall($tablename, $condition = array(), $fields = array(), $keyfield = '', $orderby = array(), $limit = array());

参数

  • $keyfield 参数传入一个已存在的字段名称,结果数组键值就为该字段,否则为自然排序
  • $orderby 按xxx升/降排序
  • $limit 分页,array(当前页, 每页条页)
  • 其它参数同pdo_get函数

示例

//获取全部启用的用户
//生成的SQL等同于:SELECT `username`,`uid` FROM `ims_users` WHERE `status` = 2 ORDER BY `starttime` desc,`endtime` desc  LIMIT 0, 5
$user = pdo_getall('users', array('status' => 2), array('username', 'uid'), 'uid', array('starttime desc', 'endtime desc'), array(1,5));

pdo_getslice()

根据条件(AND连接)到指定的表中获取某个区间的记录

说明

array | boolean pdo_getslice($tablename, $condition = array(), $limit = array(), &$total = null, $fields = array(), $keyfield = '', $orderby = array());

参数

  • $limit 参数指定查询语句的LIMIT值,array(start, end) 或是直接传入范围 2,3
  • $total 参数指定查询结果的总条数,方便进行分页操作
  • 其它参数同pdo_getpdo_getall函数

示例

$user = pdo_getslice('users', array(), array(0, 10), $total, array('username', 'uid'), 'uid', array('starttime desc', 'endtime desc'));
echo $total;

pdo_fetch()

根据SQL语句,查询一条记录

说明

array | boolean pdo_fetch($sql, $params = array());

参数

  • $sql 参数指定要返回记录集的SQL语句
  • $params 参数指定为SQL语句中的参数绑定传值,防止SQL注入
    需要注意的是使用参数绑定时,SQL语中等号后不需要使用引号,传入的值必须与绑定的名称一致

示例

// :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 使用相同,只是此函数返回的不是一个数组而是一个字符串

说明

string | boolean pdo_fetchcolumn($sql, $params = array(), $column = 0);

参数

  • $sql 参数指定要返回记录集的SQL语句
  • $params 参数指定为SQL语句中的参数绑定传值,防止SQL注入
    需要注意的是使用参数绑定时,SQL语句中等号后不需要使用引号,传入的值必须与绑定的名称一致
  • $column 参数指定返回记录集的第几列数据

示例

// 获取用户的总数,返回的值是一个数字
$user_total = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename('users'));

pdo_fetchall()

根据SQL语句,查询全部记录,使用方法与pdo_fetch相同

说明

array | boolean pdo_fetchall($sql, $params = array(), $keyfield = '');

参数

  • $sql 参数指定要返回记录集的SQL语句
  • $params 参数指定为SQL语句中的参数绑定传值,防止SQL注入
    需要注意的是使用参数绑定时,SQL语中等号后不需要使用引号,传入的值必须与绑定的名称一致
  • $keyfield 参数传入一个已存在的字段名称,结果数组键值就为该字段,否则为自然排序

示例

// 需要注意的是,返回的数组的键值为用户的uid
$user = pdo_fetchall("SELECT username, uid FROM ".tablename('users'), array(), 'uid');

pdo_insert()

对指定数据表插入一条新记录

说明

int | boolean pdo_insert($tablename, $data = array(), $replace = false);

参数

  • $tablename 参数指定要插入记录的数据表名,此处传入的表名不要使用tablename()函数
  • $data 参数指定要插入的记录,格式为与数据表字段对应的关联数组
  • $replace 参数指定插入方式使用 INSERT 语句或是 REPLACE 语句(查找到主键相同的数据选择update)

示例

//添加一条用户记录,并判断是否成功
$user_data = array(
	'username' => 'mizhou1',
	'status' => '1',
);
$result = pdo_insert('users', $user_data);
if (!empty($result)) {
	$uid = pdo_insertid();
	message('添加用户成功,UID为' . $uid);
}

pdo_update()

更新指定的数据表的记录

说明

array | boolean pdo_update($tablename, $data = array(), $condition, $glue = 'AND')

参数

  • $tablename 参数指定要插入记录的数据表名,此处传入的表名不要使用tablename()函数
  • $data 参数指定要插入的记录,格式为与数据表字段对应的关联数组
  • $condition 参数指定要更新的前提条件
  • $glue 参数指定前面 $condition 数组条件的关联字 AND 或是 OR

示例

//更uid等于2的用户的用户名
$user_data = array(
	'username' => 'mizhou2',
);
$result = pdo_update('users', $user_data, array('uid' => 2));
if (!empty($result)) {
	message('更新成功');
}

pdo_delete()

删除指定条件的数据

说明

int | boolean pdo_delete($tablename, $condition = array(), $glue = 'AND')

参数

  • $tablename 参数指定要插入记录的数据表名,此处传入的表名不要使用tablename()函数
  • $condition 参数指定查询的条件,以是 AND 连接,支持大于,小于等范围查询
  • $glue 参数指定前面 $condition 数组条件的关联字 AND 或是 OR

示例

//删除用户名为mizhou2的记录
$result = pdo_delete('users', array('username' => 'mizhou2'));
if (!empty($result)) {
	message('删除成功');
}

pdo_query()

执行一条非查询语句

说明

int | boolean pdo_query($sql, $params = array())

参数

  • $params 指定SQL语句中绑定参数的值,参数占位与 pdo_fetch 一致

示例

//更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语句

说明

boolean pdo_run($sql, $stuff = 'ims_')

参数

  • $stuff 函数将会将此参数指定的值,替换为当前系统的表前缀。
    注:与pdo_query不同的是,pdo_run是可以一次执行多条SQL语句,每条SQL必须以;分隔。

示例

$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_exists()

返回满足条件的记录是否存在

说明

boolean pdo_exists($tablename, $condition = array())

参数

  • $tablename 表名
  • $condition 满足的条件

示例

//是否存在服务号,对应sql:SELECT * FROM `ims_account` WHERE `type` = 4  LIMIT 1
var_dump(pdo_exists('account', array('type' => ACCOUNT_SERVICE_VERIFY)));

pdo_fieldexists()

检查表中是否存在某个字段

说明

boolean pdo_fieldexists($tablename, $fieldname)

参数

  • $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()

检查表中是否存在某个索引

说明

boolean pdo_indexexists($tablename, $indexname)

参数

  • $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)

参数

  • $tablename 参数指定要检查的表名称

示例

if (!pdo_tableexists('site_slide')) {
	echo '表不存在';
}

pdo_fieldmatch()

检查某个表中的字段类型是不是符合

说明

boolean pdo_fieldmatch($tablename, $fieldname, $datatype = '', $length = '')

参数

  • $tablename 要检查的表名
  • $fieldname 要检测的字段名
  • $datatype 检测该字段是不是与此值相符
  • $length 检测该字段长度是不是与此值相符

示例

pdo_fieldmatch('users', 'uid', 'varchar'); // 类型不符合,返回 -1

pdo_fieldmatch('users', 'uid', 'int'); // 类型符合,返回 true

pdo_fieldmatch('users', 'uid', 'int', 5); // 长度不符合,返回 -1

pdo_insertid()

获取上一步 INSERT 操作产生的 ID.

说明

int pdo_insertid()

参数

示例

pdo_insert('uni_account', array('name' => 'test', 'description' => 'test'));
$result = pdo_insertid();

pdo_fetchallfields()

获取所有字段名称

说明

array pdo_fetchallfields($tablename)

参数

  • $tablename 表名

示例

var_dump(pdo_fetchallfields('ims_account'));

pdo_debug()

调试运行SQL语句,显示执行过的SQL的栈情况

说明

array pdo_debug($output = true, $append = array())

参数

  • $output 是否要输出执行记录和执行错误信息
  • $append 加入执行信息,如果此参数不为空则 $output 参数为 false

示例

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] => 
			)
	)
)

链式查询概述

链式查询类,提供面向对象方式查询数据,链式查询只支持一些常用简单的查询过于复杂的业务需求还是建议直接使用SQL语句。

查询用户表中的前十条普通用户数据,代码如下:

$query = load()->object('query');
$row = $query->from('users')->where('type', '1')->orderby('uid', 'desc')->limit(10)->getall();

上方代码中,from, where, orderby, limit 就是被称之为链示调用,除了一开始必须要先指定 from() 哪个表和最后需要获取数据时调用 **get() **, **getall() **时,其它函数书写并不区分先后顺序。

但是这里并不推荐直接实例化 Query 对象进行数据查询,对于程序员来说以下的代码和上面在“语义”上并没有什么太大的区别,链示查询只是简化和方便了SQL语句的书写。我们看代码都能知道他是在查询什么数据,但是并不知道这样做的意义和作用是什么。

pdo_fetchall("SELECT * FROM `users` WHERE type = '1' ORDER BY id DESC LIMIT 10");

所以我们更推荐将 Query 类结合 Table 类来一起使用,比如以上的查询可以改造为:

class UsersTable extends We7Table {

	public function searchNewUserList() {
		return $this->query->from('users')->getall();
	}

	public function searchWithType($type) {
		$this->where('type', $type);
		return $this;
	}

	public function searchCount($limit) {
		$this->limit($limit);
		return $this;
	}
}

$usertable = new UsersTable();

$usertable->searchWithType(1);
$usertable->searchCount(10);

$list = $usertable->searchNewUserlist();

以上的代码,很明显的能明白查询者的意图,而且很灵活的进行修改,比如业务改变了要查询最新的20名普通用户,只需要

$usertable->searchCount(20);

即可。

在微擎中,所有的Query对象皆是以Table对象的形式存在,存放于 Framework/table 目录中,通过以下方式调用:

$users_table = table('users');
$users_table->searchWithFounder(ACCOUNT_MANAGE_GROUP_VICE_FOUNDER);
$users_table->searchWithPage($pindex, $psize);
$users = $users_table->getUsersList();

from()

说明

Query from($tablename, $alias = '')

指定要查询的表名

参数

  • $tablename 参数指定要查询的数据表名,此处传入的表名不要使用tablename()函数
  • $alias 表别名,方便以构造条件语句和关联时使用

示例

//如果指定别名,后续可以通过 别名.字段名 的形式来使用
$query = load()->object('query');
$row = $query->from('users', 'u')->select('u.username')->get();

select()

说明

Query select($field1, $field2, ...)

指定要查询的字段列表,相当于 SELECT * 、 SELECT name, username

参数

  • $field 指定要查询的字段名,可以是多个参数也可以是一个数组

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->select('uid', 'username')->get();

//也可以传入数组
$row = $query->from('users', 'u')->select(array('uid', 'username'))->get();

where()

说明

Query where(array | string $condition, $parameters = array())

指定查询条件,如果有多个条件可以连接多个where函数或是指定$condition为一个数组, 所有的查询条件将以 AND 连接

参数

  • $condition 指定要查询的条件字段,也支持 范围条件操作,’>’, ‘<’, ‘<>’, ‘!=’, ‘>=’, ‘<=’, ‘+=’, ‘-=’, ‘LIKE’, ‘like’
  • $parameters 指定查询条件的值

示例

//users表指定了别名,后续的字段如果需要可以写上别名前缀
$query = load()->object('query');
$row = $query->from('users', 'u')->where('u.type', '1')->where('uid >=', '2')->get();

//也可将条件写到一起
$row = $query->from('users', 'u')->where(array('u.type' => 1, 'uid >=' => 2))->get();

whereor()

说明

Query whereor(string | array $condition, $parameters = array())

与 where 一样使用,不同的是本函数是以 OR 来连接

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->where('type', '1')->whereor('uid', 2)->get();

//生成SQL如下

SELECT * FROM users AS U WHERE type = '1' OR uid = '2' LIMIT 1

having()

说明

Query having(string | array $condition, $parameters = array())

指定要查询的条件,与 where 参数及使用方法一样,不同的 having 在聚合函数之后执行,一般要与groupby一起使用

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->having('count(*) >', 2)->groupby('type')->getall();

groupby()

说明

Query groupby($field)

指定要分组的字段

参数

  • $field 要分组查询的字段名

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->groupby('u.type')->get();

orderby()

说明

Query orderby($field, $direction = 'ASC')

指定查询结果排序字段和方式

参数

  • $field 要排序的字段名
  • $direction 排序方式,可以为 ASC 或是 DESC

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->orderby('u.uid', 'DESC')->get();

leftjoin()

说明

Query leftjoin($tablename, $alias = '')

指定要左关联的表,当需要rightjoin时,请调换一下顺序书写即可

参数

  • $tablename 参数指定要查询的数据表名,此处传入的表名不要使用tablename()函数
  • $alias 表别名,方便以构造条件语句和关联时使用

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->leftjoin('users_profile', 'b')->on('u.uid', 'b.uid')->where('u.uid', '1')->get();

//如果关联条件有多个时,请使用数组形式
on(array('u.uid' => 'b.uid', 'u.username' => 'b.realname'))

innerjoin()

说明

Query innerjoin($tablename, $alias = '')

与 leftjoin 使用方法一样

on()

说明

Query on($condition, $parameters = array())

指定关联查询中的关联条件

参数

与 where 函数一样,多个关联条件可以使用数组形式,一个关联查询只可出现一个on语句

limit()

说明

Query limit(start, size)

指定要查询从第几行起的多少行,与SQL语句中的Limit意思一样

参数

  • $start 查询从第几行起
  • $size 查询多少行

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->limit(1, 10)->getall();

page()

说明

Query page(pageindex, pagesize)

根据分页获取数据,转换成 limit 语句为 LIMIT (pageindex - 1) * pagesize, pagesize

参数

  • $pageindex 当前页码
  • $pagesize 一页多少条数据

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->page(1, 10)->getall();

get()

说明

array get()

获取一条记录

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->get();

getall()

说明

array getall($keyfield = '')

获取所有记录

参数

  • $keyfield 获取记录集数组指定为键值的字段,默认是自然排序

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->limit(1, 10)->getall('uid');

getcolumn()

说明

Mixed getcolumn($field = '')

获取一条记录中指定字段的值

参数

  • $field 具体获取哪个字段的值

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->getcolumn('username');

count()

说明

int count()

只获取结果集的数量有多少

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->count();

exists()

说明

boolean exists()

获取满足某个条件的数据是否存在

示例

$query = load()->object('query');
$is_found = $query->from('users', 'u')->where('uid', 10)->exists();

getLastQueryTotal()

说明

int getLastQueryTotal()

当查询中使用了limit限制语句时,可以在完成查询后,调用此函数来获取整个表的数据量,一般用于分页使用

示例

$pindex = max(1, intval($_GPC['page']));
$psize = 20;

$query = load()->object('query');
$row = $query->from('users', 'u')->page($pindex, $psize)->getall();

$total = $query->getLastQueryTotal();
$pager = pagination($total, $pindex, $psize); //页码HTML

getLastQuery()

说明

array getLastQuery()

获取最后执行的SQL语句及参数,主要用于调试代码

示例

$query = load()->object('query');
$row = $query->from('users', 'u')->get();

print_r($query->getLastQuery());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字化转型高高老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值