2010-08-28 61 views
1

我主要是一个Java人,这就是为什么我需要一些帮助,我认为在PHP中做起来相当简单(而且对于Java也很简单,位...详细)。创建基本的PHP脚本来添加行到网页

简而言之,我想构建一个网页,其中包含用户添加的字符串项目列表。例如,在页面底部可能会出现一个用户可以在框中输入“Hello World”的地方,并点击提交按钮,将其添加到项目列表中。添加到列表的顶部或底部是无关紧要的 - 我稍后可能会调整它。

我是那种不只是喜欢答案,但同时我有没有想法哪里可以开始搜索。我之前没有做过PHP开发。我应该看什么样的构造或功能?我拥有它将运行的物理盒子(它现在就在我旁边),所以权限不是限制,也没有其他任何可能有助于这种情况的东西(尽管我不明白它会是什么需要这样一个简单的脚本)。我应该真正警惕哪种输入验证?此服务仅限于有权访问基于apache的网站的特定部分的人员,因此他们必须登录才能看到此计划页面,但我想涵盖所有可能的情况。

此外,我或许会像输出看起来像

的“Hello World”,由用户用户1添加

“这是一个额外的行”用户2

“再见世界”加入用户将在未来添加用户1

。我应该看什么来做到这一点?


更新来回答问题:

当涉及到实际的内容,我会倾向于一个简单的文件持有线上的每个输入行,为上校弹片建议的存储。认为数据库会过度杀伤,尽管我有足够的资源来实施它。如果用户提交“Hello World!”然后在文件中添加一行,说

“Hello World!”发布者User1

就足够了。

关于认证,这已经在apache的httpd.conf配置文件中设置。目前,这允许通过AuthGroupFile条目访问特定用户组。这是脚本的托管位置。要访问这个脚本,用户将已经使用他们的凭证对自己进行了身份验证。该认证目前适用于该网站的该部分。真的,这是一个中学关注我的。仅仅添加行就够了,没有谁说过什么的记录。如果可以轻松完成我已经实现的功能,这只是PHP上的糖。

+0

你也有一个MySQL/SQLite的/ PostgreSQL的,或你在一个文本文件中写?没有太大的区别,只是... – Amadan 2010-08-28 10:24:28

+0

你想使用什么样的存储? – 2010-08-28 10:24:42

+0

你有这个用户数据库/登录系统了吗?如果是 - 它是什么?如果没有 - 你的问题很荒谬,因为这个验证系统比这个小片段多10倍。 – 2010-08-28 10:27:01

回答

0

嗯,是的,在PHP中它很短。
假设基于Apache的使用授权

<? 
$file = "messages.txt"; 
if ($_SERVER["REQUEST_METHOD"]=="POST") { 
    $_POST['mess'] = str_replace(array("\r","\n"),"",$_POST['mess']; 
    file_put_contents($file, $_POST['mess']." ".$_SERVER["REMOTE_USER"]); 
    header("Location:".$_SERVER["PHP_SELF"]); 
    exit; 
} 
echo nl2br(htmlspecialchars(file_get_contents($file))); 
?> 
<form method="POST"> 
<input type="text" name="mess"> 
<input type="submit"> 
</form> 
+0

非常简洁,而且我确切地看到发生了什么,但是从我所看到的情况来看,这不会对输入应用任何卫生设施? – JBirch 2010-08-28 10:47:23

+0

@JBirch你没有提出任何保护的危险。但是好的,使它成为'echo nl2br(htmlspecialchars(file_get_contents($ file)));''和'$ _POST ['mess'] = str_replace(array(“\ r”,“\ n”),“”,$ _ POST ['mess'];' – 2010-08-28 10:55:14

+0

当提交按钮被按下时,有没有简单的方法来更新页面? – JBirch 2010-08-28 11:48:44

0

你将有几件事要做:

  • 选择一个数据存储。使用PHP时,MySQL是一种流行的选择。这听起来不像是高容量的,所以大多数任何持久性商店都可以工作。
  • 当接受输入时,您需要清理它以插入数据库(同样,如果使用MySQL,check the docs),然后您将执行INSERT语句将其放入数据库中。
  • 当显示页面时,您将连接到数据库(check the docs),查询数据存储区中的数据,在其上循环并在清理任何潜在的恶意数据后对每行进行回显。

简单例子可能是这样的:

<? 
// Assuming a database named "my_database" with a table called "chat_lines", which has "username", "line", and "timestamp" fields. 
$db = mysql_connect("localhost", "username", "password"); 
mysql_select_db("my_database", $db); 

// If data was posted to the script, scrub it and store it in the database. 
if($_POST["username"] && $_POST["line"]) { 
    mysql_query(sprintf("INSERT INTO chat_lines (username, line, timestamp) VALUES (\"%s\", \"%s\", NOW())", 
    mysql_real_escape_string($_POST["username"]), 
    mysql_real_escape_string($_POST["line"]) 
)); 
} 

// Fetch all lines from the database in reverse chronological order 
$result = mysql_query("SELECT * FROM chat_lines ORDER BY timestamp DESC"); 
while($row = mysql_fetch_assoc($result)) { 
    echo sprintf("<div>%s said %s</div>", strip_tags($result["username"]), strip_tags($result["line"])); 
} 
?> 

<form method="post"> 
    <div>Username: <input type="text" name="username" /></div> 
    <div>Line: <input type="text" name="line" /></div> 
    <input type="submit" /> 
</form> 

这个例子使有关用户的假设被允许进入任何用户名,他们想要的(也就是说,它不承担实施认证系统) ,数据存储和表的存在以及所有这些,但应该让你开始。 PHP文档相当广泛,并且可能非常有用。特别是,请阅读Getting StartedLanguage Reference

+0

由于您所提供的灵活性,我很想试试现场发布的答案,尽管我认为数据库真的在这里过度杀伤。我可能会将你的元素与Col Shrapnel结合起来。 但是,我真的很想自动命名。与其说人们不能相互冒充,这不是问题。更多的只是从使用的角度来保持它的简单性。 – JBirch 2010-08-28 10:49:53

+0

@JBirch尽管DB清理的整个想法是错误的。没有什么东西“投入消毒”。这完全是一个错误的概念。 – 2010-08-28 11:25:51