中华网通行证
用户名 密码
  科技动态 硬件广场 下载基地 网络教室 网络冲浪 科学博览 移动时代 手机上网 桌面壁纸 科技商情  

生成支持“显示纪录”功能的代码

4、显示纪录。

关于纪录的显示,有很多方法:能用一个很简单的程序来显示(每次一行),也能复杂一点(每次显示多行),更复杂一点:即按要求显示(排序、5行、10行、文件大小、作者名等等)。

既然本教程的出发点是一个通用的教程。所以应该能满足较为复杂的要求。下面,我们一步步的实现我们的目标!

4.1、首先、将我们数据库里的数据显示出来。
看看这几个函数:

mysql_num_rows()
得到我们数据库里纪录的个数(当按某个条件查询时,它返回的是满足条件的纪录个数)。传回来的值是整数。
mysql_fetch_field() 取得数据库每个字段的所有信息,这里我们要利用它来显示字段名。
函数mysql_fetch_field()传递的参数是整数,传回来的值是一个“类”,包括以下属性
name - 栏位名称
table - 栏位所在表格的资料表名称
max_length - 栏位的最大长度
not_null - 若为 1 表示本栏位不能是空的 (null)
primary_key - 若为 1 表示本栏位是主要键 (primary key)
unique_key - 若为 1 表示本栏位为不可重覆键 (unique key)
multiple_key - 若为 1 表示本栏位为可重覆键 (non-unique key)
numeric - 若为 1 表示本栏位为数字型态 (numeric)
blob - 若为 1 表示本栏位为位元型态 (BLOB)
type - 栏位型态
unsigned - 若为 1 表示本栏位为无记号 (unsigned)
zerofill - 若为 1 表示本栏位为被零填满 (zero-filled)

mysql_fetch_object() 它传回来的是一个纪录的所有数据,用它就可以得到每个纪录。传回来的值是一个“类”
这里介绍了三个函数简单的信息,具体的应用请看我们的程序:

script_select.php
<?php
require('connect.inc');

//选择没有被删除的纪录
$str_sql="select * from $tablename where flag_deleted='N'";
$result=mysql_db_query($dbname,$str_sql,$link_id);
if (!$result)
{html_error_exit('MySQL 选择命令执行错误');}

//我们利用函数mysql_num_rows()得到满足条件的纪录数。
//这里还需要我们改进,如果用户进行查询,而没有用户需要的纪录,
//就应该显示:没有满足您的查询条件的纪录,或类似的语句
$number_of_rows=@mysql_num_rows($result);
if($number_of_rows<1)
{html_error_exit('这数据库里还没有纪录');}
else

//输出我们数据库里的纪录
{html_header();
print"<table border=1>";
print"<tr>";

//显示相应的字段名
while($field=mysql_fetch_field($result))
//注意函数mysql_fetch_field()的使用方式,传递的参数是整数,传回来的值是一个“类”
{
if($field->name <> 'flag_deleted') //这个用来区分是否别删除的字段没有显示的必要
{print"<td>$field->name";}
}

//输出每个纪录的详细的值
while ($record=mysql_fetch_object($result))
{
//下面是一整行,用来输出纪录,利用了PHP的“.”的连接功能
print("<tr><td>".$record->key_script.
"<td>".$record->date_created.
"<td>".$record->date_updated.
"<td>".$record->script_name.
"<td>".$record->script_size.
"<td>".$record->script_explain.
"<td>".$record->author_name.
"<td>".$record->author_email.
"<td>".$record->author_homepage);
}
html_footer();
}
?>

那么,这样就完了吗? 当然不行,您肯定希望程序以某种方式来显示数据,这就要涉及到“排序”功能。

4.2、排序

这当然难不倒MySQL,我们只需在在查询时加入排序指令就行了,如:

$str_sql="select * from $tablename where flag_deleted='N' order by $sort_field $sort_direction

其中$sort_field是要进行排序的字段,$sort_direction是排序的方式,其值有两个“ASC”、“DESC”

为了能动态的给这两个变量赋值,我们在输出字段名时,应该有交互按钮,所以我们加入以下代码。

while($field=mysql_fetch_field($result))
{
if($field->name <> 'flag_deleted')
{
print"<td>$field->name<br>";
print"<a href=\"$PATH_INFO?action=set_sort_field&sort_field= $field->name&sort_direction=ASC\">A</a>$nbsp;";
print"<a href=\"$PATH_INFO?action=set_sort_field&sort_field= $field->name&sort_direction=DESC\">D</a>";
}
}

OK! 这时我们的程序已经能够按照用户的要求排序了,您还想有其它功能吗?

也许将按序排列的列用红色显示是个好主意,下面我们来实现它。


注意这段代码,它实现数据的输出,我们要对它进行改写,加入颜色代码
print(
"<tr><td><font color=$key_scrit_color>".$record->key_script.
"</font><td><font color=$date_created_color".$record->date_created.
"</font><td><font color=$date_updated_color".$record->date_updated.
"</font><td><font color=$script_name_color".$record->script_name.
"</font><td><font color=$script_size_color".$record->script_size.
"</font><td><font color=$script_explain_color".$record->script_explain.
"</font><td><font color=$author_name_color".$record->author_name.
"</font><td><font color=$author_email_color".$record->author_email.
"</font><td><font color=$author_homepage_color".$record->author_homepage.
"</font>"
);

我们不想让服务器计算的太多,所以在提交连接时把颜色代码加进去。这样我们又要改变输出字段的代码。

4.3 、颜色代码

while($field=mysql_fetch_field($result))
{
if($field->name <> 'flag_deleted')
{
print"<td>$field->name<br>";
print"<a href=\"$PATH_INFO?action=set_sort_field&sort_field =$field->name&$field->name"."color=red&sort_direction=ASC\">A </a>$nbsp;";
print"<a href=\"$PATH_INFO?action=set_sort_field&sort_field =$field->name&$field->name"."color=red&sort_direction=DESC\">D </a>";
}
}

这样我们的显示功能就完成了大半了。

4.4、同时显示五个、十个纪录

我们要利用变量纪录需要显示的纪录数和每页中显示多少纪录。

并用代码跟踪数据中的纪录数和页面需要显示的纪录数。

用程序计算从那个纪录开始显示。

为用户建立点击按钮“前五个纪录”、“后五个纪录”。

我们在前面的基础上加以改进,下面先来看看改进的地方.

为了让大家更好的读程序,我没有更多的更改前面的代码,我把下面的另存为script_select2.php(当然是在前面的基础上改进的)

首先、定义一些必要的变量。

这是我们在按需要显示时的缺省值
$initial_record=0;
$number_of_display=5;
每页显示五个纪录

如果客户端回送信号,我们应该改变相应的缺省值
这个用来跟踪页面需要显示的纪录
if ($arr_request[initial_record] !=0)
{$initial_record=$arr_request[initial_record];}


既然我们要按每页五行输出满足条件的纪录,那我们就的确定符合条件的纪录数
$str_sql_all_record="select * from $tablename where flag_deleted='N'";
$result=mysql_db_query($dbname,$str_sql_all_record,$link_id);
if (!$result){html_error_exit('MySQL 选择命令执行错误');}
$number_of_rows=@mysql_num_rows($result);

下面我们来看看我们的查询语句,因为我们可能碰到这种情况:程序初始化时按数据库里的缺省顺序排列,当用户端输入信息后,可能改变数据排列的顺序。这两种情况的查询语句一样吗?显然不一样,您可以试试看,看会不会报错。所以我们要实时生成查询代码。
if (strlen($sort_field)==0)
{
$str_sql="select * from $tablename where flag_deleted='N'
LIMIT $initial_record,$number_of_display";
}
else
{
$str_sql="select * from $tablename where flag_deleted='N'
order by $sort_field $sort_direction
LIMIT $initial_record,$number_of_display";
}
注意到语句中的LIMIT了吗?它用来限制SELECT语句返回的行数,给定2个参数时,第一个指定要返回的第一行的偏移量,第二个指定返回行的数目。
注意:数据库的初始行的偏移量是0(而不是1)。

有了上面的准备,我们可以进一步讨论了。

我们要实时的生成按钮“前五个纪录”、“后五个纪录”,在按钮中要纪录当前输出的纪录数,纪录的偏移量。另外,当正在显示刚开始的记录时,“前五个纪录”按钮不应该存在;当显示最后的记录时,“后五个纪录”按钮不应该存在。

所以,我们用下面的代码动态输出按钮:
判断偏移量是否在记录内
$prev_record=$initial_record-$number_of_display;
$next_record=$initial_record+$number_of_display;
如果最后剩下的记录不够我们要求的五个,那么应该显示实际的个数
if ($next_record>$number_of_rows)
{$next_record=$number_of_rows;}

显示前后连接
if($prev_record>=0)
{
$act="action=show_order_record";
$link_order="initial_record=$prev_record";
$sort="sort_field=$sort_field";
$color="$sort_field"."_color=red";
$sort_asc_desc="sort_direction=$sort_direction";
print"<a href=\"$PATH_INFO?$act&$link_order&$sort&$color&$ sort_asc_desc\">";
print"前 $number_of_display 个纪录</a> ";
}
if($next_record!=$number_of_rows)
{
$act="action=show_order_record";
$link_order="initial_record=$next_record";
$sort="sort_field=$sort_field";
$color="$sort_field"."_color=red";
$sort_asc_desc="sort_direction=$sort_direction";
print"<a href=\"$PATH_INFO?$act&$link_order&$sort&$color&$ sort_asc_desc\">";
print"后 $number_of_display 个纪录</a> ";
}

OK! 其它的不用改变,好了现在我们的数据可以一页一页的输出了。

  《PHP之星》 Siron/文


  
相关报道




本站检索



中华网推荐

·国家级治脑病新药思维源
·中藏药治疗脑病新突破
·治类风湿,强直性脊柱炎
·养肾·痛风·长寿
·肝病泌尿脑萎缩新药介绍
·强直性脊柱炎康复乐园
·让中医辩证不孕不育
·国医治股骨头坏死一绝
·乙肝为何久治不愈?
·二千元垄断批发做老板
·中医中药专治前列腺
·治牛皮癣白癜风已成现实
·专治痛风病的白衣天使
·不孕不育的杏林奇葩
·专卖店零售管理系统





   

网络教室编辑信箱