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

《PHP和MySQL Web开发(原书第4版)》29.7 阅读邮件

关灯直达底部

在用户建立一些账户后,我们转移到重点问题上来:连接这些账户并读取邮件。

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;

可以看到,在这里,我们执行了相同的动作,如同用户选择了查看邮箱选项一样。下面我们接着讨论。