首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》30.6 用户函数的实现

关灯直达底部

用户登录后,我们希望他们能够完成如下所示的5件事:

■查看可供订阅的邮件列表

■订阅或取消订阅邮件列表

■修改建立账户的方法

■更改密码

■登出

在图30-6中,可以看到这些选项的大部分。接下来,我们介绍每个选项的具体实现。

30.6.1 查看列表

在这个项目中,我们将实现很多选项,这些选项可以用来查看可供使用的列表及列表细节。在图30-6中,可以看到其中两个选项:/"Show My Lists/",该选项用来获得该用户订阅的邮件列表;/"Show Other Lists/",来获得该用户没有订阅的邮件列表。

如果回头看看图30-4,会发现还有另一个选项——/"Show All Lists/",该选项可以获得系统中所有可供使用的邮件列表。为了使系统真正可以升级,我们应增加分页功能(例如,每页显示10个查询结果)。出于简单的考虑,我们没有使用这项功能。

这3个选项将分别触发show-all-lists、show-other-lists和show-my-lists动作。我们可能已经意识到,所有这些动作的工作方式十分相似。以上3种动作的代码如下所示:

case/'show-all-lists/':

display_items(/'All Lists/',get_all_lists,/'information/',

/'show-archive/',/'/');

break;

case/'show-other-lists/':

display_items(/'Unsubscribed Lists/',

get_unsubscribed_lists(get_email),/'information/',

/'show-archive/',/'subscribe/');

break;

case/'/':

case/'show-my-lists/':

display_items(/'Subscribed Lists/',get_subscribed_lists(get_email),

/'information/',/'show-archive/',/'unsubscribe/');

break;

可以看到,所有这些操作都将调用output_fns.php库中的display_items函数,但是每一个操作对该函数的调用都有不同的参数。它们也将使用前面提到的get_email函数来获得用户的电子邮件地址。

图30-7所示的是这个函数的功能。

图 30-7 display_items函数用来列出用户未订阅的列表

以上就是/"Show Other Lists/"页面。

下面,让我们来看看display_items函数的代码,如程序清单30-7所示。

程序清单30-7 output_fns.php库中的display_items函数——该函数用来显示相关操作的条目列表

function display_items($title,$list,$action1=/'/',$action2=/'/',

$action3=/'/'){

global$table_width;

echo/"<table width=/"$table_width/"cellspacing=/"0/"

cellpadding=/"0/"border=/"0/">/";

//count number of actions

$actions=(($action1!=/'/')+($action2!=/'/')+($action3!=/'/'));

echo/"<tr>

<th colspan=/"/".(1+$actions)./"/"bgcolor=/"#5B69A6/">/"

.$title./"</th>

</tr>/";

//count number of items

$items=sizeof($list);

if($items==0){

echo/"<tr>

<td colspan=/"/".(1+$actions)./"/"align=/"center/">No

Items to Display</td>

</tr>/";

}else{

//print each row

for($i=0;$i<$items;$i++){

if($i%2){

//background colors alternate

$bgcolor=/"#ffffff/";

}else{

$bgcolor=/"#ccccff/";

}

echo/"<tr>

<td bgcolor=/"/".$bgcolor./"/"

width=/"/".($table_width-($actions*149))./"/">/";

echo$list[$i][1];

if($list[$i][2]){

echo/"-/".$list[$i][2];

}

echo/"</td>/";

//create buttons for up to three actions per line

for($j=1;$j<=3;$j++){

$var=/"action/".$j;

if($$var){

echo/"<td bgcolor=/"/".$bgcolor./"/"width=/"149/">/";

//view/preview buttons are a special case as they link to a file

if(($$var==/'preview-html/')||($$var==/'view-html/')||

($$var==/'preview-text/')||($$var==/'view-text/')){

display_preview_button($list[$i][3],$list[$i][0],$$var);

}else{

display_button($$var,/'&id=/'.$list[$i][0]);

}

echo/"</td>/";

}

}

echo/"</tr>n/";

}

echo/"</table>/";

}

}

该函数将输出一个条目表,每个条目都具有3个相关的操作按钮。该函数具有5个参数,它们依次如下所示。

■$title是显示在表顶部的标题——在图30-7中,我们提交的标题为/"Unsubscribed Lists/",正如我们前面讨论过的/"Show Other Lists/"的那段代码中所显示的。

■$list是表中每行显示的条目组成的数组。在这个例子中,它是该用户没有订阅的邮件列表组成的数组。我们将在get_unsubscribed_lists函数中构建该数组(在这个例子中),我们将在稍后的内容中介绍这些函数。这是一个多维数组,该数组中的每一行包括4块数据。依次如下。

■$list[n][0]包含条目标识符,通常是行号。该序号为按钮给出了将要操作的行号。在我们的例子中,使用数据库中的ID——稍后将详细介绍。

■$list[n][1]包含该条目名称。为特定条目显示的文本。例如,在图30-7中,表中第一行的条目名是PHP Tipsheet。

■$list[n][2]和$list[n][3]是可选的。使用它们来表示还有其他信息。它们分别对应更多的信息文本和更多的信息ID。我们在讨论“管理函数的实现”部分的/"View Mail/"动作时了解使用这两个参数的例子。

■该函数的第3、第4、第5个参数用来传递3个动作,这些动作将会显示在相应条目的按钮上。在图30-7中,3个动作按钮分别是/"Information/"、/"Show Archive/"和/"Subscribe/"。

通过传递动作名称,即information、show-archive和subscribe,可以获得/"Show All Lists/"页面上的这3个按钮。通过display_button函数,这些动作将被转换成带有文字的按钮,并且赋予它们相应的动作。

可以看到,在这些动作中,每一个Show动作都将以不同的方法调用display_items函数。除了具有不同的标题和动作按钮外,这3个动作还会使用不同的函数建立要显示的条目数组。/"Show All Lists/"使用get_all_lists函数。/"Show Other Lists/"使用get_unsubscribed_lists函数。而/"Show My Lists/"将使用get_subscribed_lists。所有这些函数的工作方式类似。这些函数都来自mlm_fns.php函数库。

下面,我们将了解get_unsubscribed_lists函数,因为它是我们已经使用的例子。该函数的代码如程序清单30-8所示。

程序清单30-8 mlm_fns.php库中的get_unsubscribed_lists函数——该函数用来建立用户没有订阅的邮件列表数组

function get_unsubscribed_lists($email){

$list=array;

$query=/"select lists.listid,listname,email from lists

left join sub_lists on lists.listid=sub_lists.listid

and email=/'/".$email./"/'where email is NULL

order by listname/";

if($conn=db_connect){

$result=$conn->query($query);

if(!$result){

echo/'<p>Unable to get list from database.</p>/';

return false;

}

$num=$result->num_rows;

for($i=0;$i<$num;$i++){

$row=$result->fetch_array;

array_push($list,array($row[0],$row[1]));

}

}

return$list;

}

可以看到,该函数要求传递一个邮件地址作为参数。这应该是我们正与之交互的订阅者的邮件地址。get_subscribed_lists函数也要一个邮件地址作为参数,显然,get_all_lists不需要任何参数。

给出订阅者邮件地址后,我们可以连接数据库并从中取出该订阅者没有订阅的所有邮件列表。可以使用LEFT JOIN来查找不匹配条目。通过遍历这个结果集,我们可以使用array_push内置函数来逐行建立数组。

现在我们已经了解了列表的产生过程,下面,我们将介绍与这些显示相关的动作按钮。