for ($i=0; $i<$numstories; $i++) { $storyinfo = split("\^", $stories[$i]); $storynum = $storyinfo[0]; // 故事编号(例如 33) $storydesc = $storyinfo[1]; // 故事标题(例如 "Great New Products This Year")。 $storyimg = $storyinfo[2]; // 图像 URL(例如 /uploadfile/2016/0108/20160108064824284.jpg")。 $dtext = $storyinfo[3]; // 故事摘要(更长的文本说明)。 $url = "<a href=\"index.php3?topic=$topic&story=$storynum\">$storydesc</a><br>"; if ($i<10) { $url = "<h2>" . $url . "</h2>"; if ($storyimg != "") { $url = "<p><img align=" . ($i%2==1 ? "right" : "left") . " src=\"$storyimg\"></p>\n" . $url; } $url = "<hr>" . $url; } else { $url = "<h3>" . $url . "</h3>"; } echo("$url\n"); echo("<p>$dtext</p>\n"); } split函数将故事信息的内容从一个字符串复制到一个数组中。请注意,脱字符号前面加了一个反斜杠从而成为“转义”字符。该程序将数组节点转换为说明性更强的变量名,从而使代码更易于阅读。然后就会构造URL。if/else 结构对前10个故事的处理与对其他故事的处理不同。前10个故事有一个分隔线,使用H2标记,并包括一张照片(如果有)。剩余的故事使用H3标记,没有分隔线,也没有照片。这个处理突出显示最新的故事,并保留较旧的故事供需要它们的读者访问。请注意,编号为奇数的的图像是右对齐的,而编号为偶数的图像是左对齐的。 作为本例的结束,为上面的 theTradeShow.txt 文件所生成的HTML代码如下所示: 清单 3. 为 theTradeShow.txt 文件所生成的 HTML 代码
清单 3. 为 theTradeShow.txt 文件所生成的 HTML 代码 <hr><p><img align=left src=/uploadfile/2016/0108/20160108064824284.jpg"></p> <h2><a href="index.php3?topic=TradeShow&story=33">Great New Products This Year</a><br></h2> <p>Thursday's product demo included a couple of exciting new surprises from competing firms in the industry.</p> <hr><p><img align=right src=/uploadfile/2016/0108/20160108064825783.jpg"></p> <h2><a href="index.php3?topic=TradeShow&story=12">Opening Event Well Attended</a><br></h2> <p>Ticket sales to the Trade Show opening event were up 15% from last year's show.</p> <hr><p><img align=left src=/uploadfile/2016/0108/20160108064826544.gif"></p> <h2><a href="index.php3?topic=TradeShow&story=5">Trade Show Opens</a><br></h2> <p>The Fourth Annual Trade Show opened 10/11/2000 to an enthusiastic reception from attendees.</p>
单击此处查看 index.php3的源代码。在开始下一部分之前您可能希望查看整组源代码。毕竟代码的大小还不到3K!
编辑页 "author.php3"
对编辑页的分析不会像对发送模块的分析那样详细,因为它比较长,而且我们已经讨论了许多基本概念。
为了简要说明一个 PHP 函数的基本结构,让我们看一下编辑模块中的complain函数。这是一个简单的函数,但它是一个很好的入门级材料。
清单 4. 一个 PHP 函数示例
//通知用户输入问题。 function complain($problem) { global $status; if ($status != "") $status = $status . "<br>\n"; $status = $status . $problem; }
您可以在代码中的任何地方调用这个函数。例如,complain("The URL is too long."); 接收全局变量 $status并将这个新的错误消息追加到其尾部,如果 $status不为空,则在错误消息前添加一个换行符。
Prepend
prepend函数是编辑模块中最重要的函数之一。它在文件的首行添加一个新条目。下面,我使用它将作者的新提交添加到主题菜单文件的开头。
清单 5. prepend 函数
//在一个现有文件的开头添加一行新内容。
function prepend($file,$string) {
// 有待改进 — 使用数据库提高这个算法的可伸缩性。
// 目前限制为 100 个故事。
if (file_exists($file)) { $filetext = file($file); $lines = count($filetext); } else { $lines = 0; } if ($lines > 100) $lines = 100; $handle = fopen($file,"w"); fputs ($handle, "$string\n"); for ($i=0; $i<$lines; $i++) fputs ($handle, $filetext[$i]); fclose ($handle); }
如果文件存在,整个正文将存入 $filetext数组中。然后统计出行数。如果文件不存在,则认为它有零行。长度限制为100 行(实际上是 101 行,因为第一行是在开始计数之前添加的)。文件打开,程序首先将当前的字符串写入文件中,然后再将剩余的行(最多100 行)写入文件中。这 100 行以后的任何内容将被丢弃。
这个函数依赖于 PHP
内建的几个重要的文件处理函数。下表说明了每个函数所进行的操作。
函数 说明
file_exists(string) 将字符串作为文件名,如果文件名当前存在,则返回 true。
file(string) 将字符串作为文件名,用一个数组返回文件的正文,每行分别对应一个数组元素。
请注意,行终止字符将位于数组中每行的尾部。
count(array) 返回数组中的元素个数。
fopen(string, mode) 字符串是一个文件名,模式是一个字符串,例如 "w" 表示写入,"r"表示读取。
打开文件,并返回一个句柄。
fputs(handle, string) 将字符串写入指定的输出文件中。必须指定一个文件句柄,
而不能以字符串形式指定文件名。
fclose(handle) 关闭文件,终止输出。
Save
save函数将作者的输入写入一个文件中。因这个函数太长,
在此我不能逐行分析它,但我会强调几个有趣的语句。
$entry = "$storynum^$storytitle^$storyimg^$synopsis";
上面的这个语句将$storynum、$storytitle、$storyimg和 $synopsis 变量连接起来,并用脱字符号作为分隔符。
内嵌的变量替代使它比显式连接更容易且更有趣。
prepend("Main.txt",$entry);
$topicfile = "$subject.txt";
prepend($topicfile,$entry);
$entry变量的值被添加到主故事菜单文件和主题特定的故事菜单文件中。所以,如果变量$subject 等于 "Politics",它就被添加到文件"Politics.txt" 中。