名著阅读 > PHP和MySQL Web开发(原书第4版) > 29.6 建立账户 >

29.6 建立账户

当用户第一次使用Warm Mail系统时,需要建立一些电子邮件账户。如果用户点击\"Account Setup\"按钮,将会把action变量的值设为account-setup并再次调用index.php脚本。用户将看到如图29-4所示的输出页面。

图 29-4 用户在可以阅读电子邮件前必须建立电子邮件账户

现在,让我们回过头来看看程序清单29-2。这一次,由于$action值的不同,我们看到不同的行为。我们将得到稍有不同的标题,如下所示:

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

format_action($action),

$_SESSION[\'selected_account\']);

更重要的是,我们将得到一个不同的正文,如下所示:

case\'store-settings\':

case\'account-setup\':

case\'delete-account\':

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

break;

这是一个典型的模式:每个命令都将调用一个函数。在这个例子中,我们调用了display_account_setup函数。该函数的代码如程序清单29-3所示。

程序清单29-3 来自output_fns.php文件的display_account_setup函数——获得并显示账户详细信息的函数

function display_account_setup($auth_user){

//display empty\'new account\'form

display_account_form($auth_user);

$list=get_accounts($auth_user);

$accounts=sizeof($list);

//display each stored account

foreach($list as$key=>$account){

//display form for each accounts details.

//note that we are going to send the password for all accounts in the HTML

//this is not really a very good idea

display_account_form($auth_user,$account[\'accountid\'],$account[\'server\'],

$account[\'remoteuser\'],$account[\'remotepassword\'],

$account[\'type\'],$account[\'port\']);

}

}

当我们调用该函数时,它将显示一个空白表单来添加新账户,接着是包括该用户所有当前邮件账户的可编辑文本框。display_account_form函数将显示如图29-4所示的表单。可以发现,在这里我们通过两种不同的方法来使用它:如果不带参数,将显示一个空表单,如果带有一组完整的参数,则显示一条已有的记录。这个函数在output_fns.php库中;它只是简单地输出HTML,因此我们这里不详细介绍它。

检索任何已存在账户的函数是get_accounts,它出自mail_fns.php库。函数代码如清单29-4所示。

程序清单29-4 来自mail_fns.php文件的get_accounts函数——为某个特定用户检索所有的账户细节

function get_accounts($auth_user){

$list=array;

if($conn=db_connect){

$query=\"select*from accounts where username=\'\".$auth_user.\"\'\";

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

if($result){

while($settings=$result->fetch_assoc){

array_push($list,$settings);

}

}else{

return false;

}

}

return$list;

}

可以看到,该函数将连接数据库,检索特定用户的所有账户并以数组的形式返回。

29.6.1 创建一个新账户

如果用户填写了账户表单并点击\"Save Changes\"按钮,store-settings动作将会被触发。下面,让我们来看看在index.php脚本中该动作的事件处理代码。在预处理阶段,执行如下所示的代码:

case\'store-settings\':

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

break;

store_account_settings函数将一个新账户的详细信息写入数据库。该函数的代码如程序清单29-5所示。

程序清单29-5 mail_fns.php文件的store_account_settings函数——为用户保存一个新账户详细信息的函数

function store_account_settings($auth_user,$settings){

if(!filled_out($settings)){

echo\"<p>All fields must be filled in.Try again.</p>\";

return false;

}else{

if($settings[\'account\']>0){

$query=\"update accounts set server=\'\".$settings[server].\"\',

port=\".$settings[port].\",type=\'\".$settings[type].\"\',

remoteuser=\'\".$settings[remoteuser].\"\',

remotepassword=\'\".$settings[remotepassword].\"\'

where accountid=\'\".$settings[account].\"\'

and username=\'\".$auth_user.\"\'\";

}else{

$query=\"insert into accounts values(\'\".$auth_user.\"\',

\'\".$settings[server].\"\',\'\".$settings[port].\"\',

\'\".$settings[type].\"\',\'\".$settings[remoteuser].\"\',

\'\".$settings[remotepassword].\"\',NULL)\";

}

if($conn=db_connect){

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

if($result){

return true;

}else{

return false;

}

}else{

echo\"<p>Could not store changes.</p>\";

return false;

}

}

}

可以看到,这个函数中有两个选项分别对应于插入一个新账户和更新一个已有的账户。函数执行相应的查询语句来保存账户详细信息。

在保存账户详细信息后,我们将返回到index.php的主体阶段:

case\'store-settings\':

case\'account-setup\':

case\'delete-account\':

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

break;

可以看到,我们像以前一样执行display_account_setup函数来列出用户的账户详细信息。新添加的账户就被包括进来了。