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

《PHP和MySQL Web开发(原书第4版)》29.4 了解脚本架构

关灯直达底部

正如我们前面提到的,该应用程序使用一个脚本控制所有操作。该脚本叫做index.php,如程序清单29-2所示。该脚本比较长,我们逐段详细介绍。

程序清单29-2 index.php——Warm Mail系统的框架

<?php

//This file is the main body of the Warm Mail application.

//It works basically as a state machine and shows users the

//output for the action they have chosen.

//*****************************************************************************

//Stage 1:pre-processing

//Do any required processing before page header is sent

//and decide what details to show on page headers

//*****************************************************************************

include(/'include_fns.php/');

session_start;

//create short variable names

$username=$_POST[/'username/'];

$passwd=$_POST[/'passwd/'];

$action=$_REQUEST[/'action/'];

$account=$_REQUEST[/'account/'];

$messageid=$_GET[/'messageid/'];

$to=$_POST[/'to/'];

$cc=$_POST[/'cc/'];

$subject=$_POST[/'subject/'];

$message=$_POST[/'message/'];

$buttons=array;

//append to this string if anything processed before header has output

$status=/'/';

//need to process log in or out requests before anything else

if($username||$password){

if(login($username,$passwd)){

$status.=/"<p style=/"padding-bottom:100px/">Logged in

successfully.</p>/";

$_SESSION[/'auth_user/']=$username;

if(number_of_accounts($_SESSION[/'auth_user/'])==1){

$accounts=get_account_list($_SESSION[/'auth_user/']);

$_SESSION[/'selected_account/']=$accounts[0];

}

}else{

$status.=/"<p style=/"padding-bottom:100px/">Sorry,we could

not log you in with that username and password.</p>/";

}

}

if($action==/'log-out/'){

session_destroy;

unset($action);

$_SESSION=array;

}

//need to process choose,delete or store account before drawing header

switch($action){

case/'delete-account/':

delete_account($_SESSION[/'auth_user/'],$account);

break;

case/'store-settings/':

store_account_settings($_SESSION[/'auth_user/'],$_POST);

break;

case/'select-account/':

//if have chosen a valid account,store it as a session variable

if(($account)&&(account_exists($_SESSION[/'auth_user/'],$account))){

$_SESSION[/'selected_account/']=$account;

}

break;

}

//set the buttons that will be on the tool bar

$buttons[0]=/'view-mailbox/';

$buttons[1]=/'new-message/';

$buttons[2]=/'account-setup/';

//only offer a log out button if logged in

if(check_auth_user){

$buttons[4]=/'log-out/';

}

//*****************************************************************************

//Stage 2:headers

//Send the HTML headers and menu bar appropriate to current action

//*****************************************************************************

if($action){

//display header with application name and description of page or action

do_html_header($_SESSION[/'auth_user/'],/"Warm Mail-/".

format_action($action),

$_SESSION[/'selected_account/']);

}else{

//display header with just application name

do_html_header($_SESSION[/'auth_user/'],/"Warm Mail/",

$_SESSION[/'selected_account/']);

}

display_toolbar($buttons);

//*****************************************************************************

//Stage 3:body

//Depending on action,show appropriate main body content

//*****************************************************************************

//display any text generated by functions called before header

echo$status;

if(!check_auth_user){

echo/"<p>You need to log in/";

if(($action)&&($action!=/'log-out/')){

echo/"to go to/".format_action($action);

}

echo/".</p>/";

display_login_form($action);

}else{

switch($action){

//if we have chosen to setup a new account,or have just added or

//deleted an account,show account setup page

case/'store-settings/':

case/'account-setup/':

case/'delete-account/':

display_account_setup($_SESSION[/'auth_user/']);

break;

case/'send-message/':

if(send_message($to,$cc,$subject,$message)){

echo/"<p style=/"padding-bottom:100px/">Message sent.</p>/";

}else{

echo/"<p style=/"padding-bottom:100px/">Could not send message.</p>/";

}

break;

case/'delete/':

delete_message($_SESSION[/'auth_user/'],

$_SESSION[/'selected_account/'],$messageid);

//note deliberately no/'break/'-we will continue to the next case

case/'select-account/':

case/'view-mailbox/':

//if mailbox just chosen,or view mailbox chosen,show mailbox

display_list($_SESSION[/'auth_user/'],

$_SESSION[/'selected_account/']);

break;

case/'show-headers/':

case/'hide-headers/':

case/'view-message/':

//if we have just picked a message from the list,or were looking at

//a message and chose to hide or view headers,load a message

$fullheaders=($action==/'show-headers/');

display_message($_SESSION[/'auth_user/'],

$_SESSION[/'selected_account/'],

$messageid,$fullheaders);

break;

case/'reply-all/':

//set cc as old cc line

if(!$imap){

$imap=open_mailbox($_SESSION[/'auth_user/'],

$_SESSION[/'selected_account/']);

}

if($imap){

$header=imap_header($imap,$messageid);

if($header->reply_toaddress){

$to=$header->reply_toaddress;

}else{

$to=$header->fromaddress;

}

$cc=$header->ccaddress;

$subject=/"Re:/".$header->subject;

$body=add_quoting(stripslashes(imap_body($imap,$messageid)));

imap_close($imap);

display_new_message_form($_SESSION[/'auth_user/'],

$to,$cc,$subject,$body);

}

break;

case/'reply/':

//set to address as reply-to or from of the current message

if(!$imap){

$imap=open_mailbox($_SESSION[/'auth_user/'],

$_SESSION[/'selected_account/']);

}

if($imap){

$header=imap_header($imap,$messageid);

if($header->reply_toaddress){

$to=$header->reply_toaddress;

}else{

$to=$header->fromaddress;

}

$subject=/"Re:/".$header->subject;

$body=add_quoting(stripslashes(imap_body($imap,$messageid)));

imap_close($imap);

display_new_message_form($_SESSION[/'auth_user/'],

$to,$cc,$subject,$body);

}

break;

case/'forward/':

//set message as quoted body of current message

if(!$imap){

$imap=open_mailbox($_SESSION[/'auth_user/'],

$_SESSION[/'selected_account/']);

}

if($imap){

$header=imap_header($imap,$messageid);

$body=add_quoting(stripslashes(imap_body($imap,$messageid)));

$subject=/"Fwd:/".$header->subject;

imap_close($imap);

display_new_message_form($_SESSION[/'auth_user/'],

$to,$cc,$subject,$body);

}

break;

case/'new-message/':

display_new_message_form($_SESSION[/'auth_user/'],

$to,$cc,$subject,$body);

break;

}

}

//*****************************************************************************

//Stage 4:footer

//*****************************************************************************

do_html_footer;

?>

这个脚本使用一个事件处理的方法。它包含对于每个事件应该调用哪个函数的知识或逻辑。在这种情况下,事件是由用户点击站点内不同的按钮触发的,每一个按钮对应一种动作。大多数按钮都是由display_button函数产生的,但是如果用户点击的按钮是提交按钮时,则是调用display_form_button函数。这些函数都在output_fns.php中。这些都转至表单的URL:

index.php?action=log-out

当调用index.php时,action变量值决定哪一个事件处理程序被触发。

该脚本由如下所示的4个主要部分组成:

1)在将页面标题发送到浏览器之前要做一些必要的处理,例如,开始一个会话,执行用户选择的动作所必须的预处理操作,并确定页面标题的内容。

2)为用户选择的动作处理和发送适当的标题和菜单条。

3)选择要执行哪一块代码,取决于用户所选的动作。不同的动作将触发不同的函数调用。

4)发送页面的页脚。

如果粗略地看一下代码,会发现这四个部分都用注释作了标记。

为了完全理解脚本程序,让我们来真正使用这个站点。