在用户建立一些账户后,我们转移到重点问题上来:连接这些账户并读取邮件。
29.7.1 选择账户
我们需要选取一个用户账户以便从中读取邮件。当前选择的账户存储在会话变量$selected_account中。
如果该用户在系统中仅注册了一个账户,那么登录时会自动选取该账户,如下所示:
if(number_of_accounts($_SESSION['auth_user'])==1){
$accounts=get_account_list($_SESSION['auth_user']);
$_SESSION['selected_account']=$accounts[0];
}
来自mail_fns.php文件中的number_of_accounts函数用来判断用户是否有多个账户。该函数源代码如程序清单29-7所示。get_account_list函数将检索用户账户ID的数组。在这种情况下,用户仅有一个账户,因此也就是数组的第0个值。
程序清单29-7 mail_fns.php文件中的number_of_accounts函数——用来计算某个用户注册了多少个账户的函数
function number_of_accounts($auth_user){
//get the number of accounts that belong to this user
$query="select count(*)from accounts where
username='".$auth_user."'";
if($conn=db_connect){
$result=$conn->query($query);
if($result){
$row=$result->fetch_array;
return$row[0];
}
}
return 0;
}
get_account_list函数与我们以前看到的get_accounts函数类似,不同之处在于它仅仅检索账户名称。
如果用户注册了多个账户,需要选择使用其中的一个。在这种情况下,标题中将包括一个列表框,列出所有可供使用的邮箱。选择一个适当的邮箱后系统会自动为用户显示该邮箱内容,如图29-5所示。
图 29-5 从列表框中选定一个账户后,该账户的邮件将被下载并显示出来列表框的选项由output_fns.php文件中的do_html_header函数生成,如下代码段所示:
//include the account select box only if the user has more than one account
if(number_of_accounts($auth_user)>1){
echo"<form action=/"index.php?action=open-mailbox/"method=/"post/">
<td bgcolor=/"#ff6600/"align=/"right/"valign=/"middle/">";
display_account_select($auth_user,$selected_account);
echo"</td>
</form>";
}
在本书的例子中,我们一直尽量避免讨论HTML,但是由函数display_account_select生成的HTML值得我们仔细查看一下。
根据当前用户账户的不同,display_account_select函数将生成如下所示的HTML代码:
<select
onchange="window.location=this.options[selectedIndex].value
name=account">
<option
selected>
thickbook.com
</option>
<option
>
localhost
</option>
</select>
其中,大部分代码仅仅是一个HTML的select元素,当然,它也包括一些JavaScript。与PHP生成HTML的方式相同,JavaScript也可以用来生成客户端脚本。
对于该元素来说,无论什么时候发生了变化事件,JavaScript就将window.location选项赋值为当前的选项值。如果用户选择了列表框中的第一项,window.location将被设置为"index.php?action=select-account&account=10"。这样就会使浏览器载入这个URL。很明显,如果用户使用的浏览器不支持JavaScript或禁用了JavaScript,这段代码将不会产生任何结果。
output_fns.php文件中的display_account_select函数可以用来获得特定用户的所有可用账户列表并显示列表框。它也使用前面讨论过的get_account_list函数。
在列表框中选择一个选项将触发select_account事件。观察图29-5中所示的URL,可以看到该事件和选中的账户ID都被添加到URL的末尾了。
在URL末尾添加这些参数产生两个作用。首先,在index.php的预处理阶段,选中的账户ID将被存储在会话变量$selected_account中,如下所示:
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;
其次,当执行到该脚本的主体部分时,将运行如下所示代码:
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;
可以看到,在这里,我们执行了相同的动作,如同用户选择了查看邮箱选项一样。下面我们接着讨论。