2010-08-28 101 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