|
|
|
| Для меня долгое время (почти 3 месяца) это было чем-то непонятным и казалось совсем ненужным... Сегодня же я задался целью разобраться как это реализовано в php, все оказалось очень просто (благодаря изучению яваскрипта). На чтение чудо-учебника Колесниченко где этому вопросу посвящено аж целых две страницы ушло 5 минут, на борьбу с ошибками целых 20 и вот он результат(это подобие гостевой без дизайна, постраничной навигации и админки):
Класс гостевой guest.class.php:
<?php
class guest{
var $date;
var $name;
var $message;
var $path = "data/messages.txt";
function getDate(){
$this->date = date("d/m/Y H:i:s");
return $this->date;
}
function getName(){
if(empty($_POST['name'])){
$this->name = "Аноним";
}else{
$this->name = htmlspecialchars($_POST['name']);
$this->name = trim($this->name);
$this->name = str_replace("\n", "", $this->name);
$this->name = str_replace("|", "", $this->name);
$this->name = substr($this->name, 0, 15);
}
return $this->name;
}
function getMessage(){
$this->message = htmlspecialchars($_POST['message']);
$this->message = trim($this->message);
$this->message = str_replace("\n", "<br />", $this->message);
$this->message = str_replace("|", "", $this->message);
$this->message = substr($this->message, 0, 500);
return $this->message;
}
function addMessage(){
$date = $this->getDate();
$name = $this->getName();
$message = $this->getMessage();
$f=fopen($this->path, "a+");
flock($f, LOCK_EX);
fwrite($f, "$date|$name|$message\r\n");
flock($f, LOCK_UN);
fclose($f);
}
function showMessages(){
$messages = file($this->path);
krsort($messages);
if (!empty($messages)){
foreach($messages as $message){
$element=explode("|", $message);
echo "<div>".$element[0]."<br />".$element[1]."<br />".$element[2]."</div>";
}
}
}
}
?>
Главная страница index.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Гостевая</title>
</head>
<body>
<?php
include("guest.class.php");
$obj = new guest;
$obj->showMessages();
?>
<form action="handler.php" method="post">
Имя:
<input type="text" name="name" /><br />
Сообщение:<br />
<textarea name="message"></textarea><br />
<input name="add" type="submit" />
</form>
</body>
</html>
Файл обработчик handler.php:
<?php
if (isset($_POST['add']) && !empty($_POST['message'])){
include("guest.class.php");
$obj = new guest;
$obj->addMessage();
header("location: index.php");
}
?>
Сообщения хранятся в data/messages.txt.
Жду комментариев (насчет того, что var $message и т.д. тут лишние я знаю). Вот только у меня возник один вопрос: а почему
var $name = $_POST['name'];
приводит к ошибке? | |
|
|
|
|
|
|
|
для: Skinhead1
(23.06.2009 в 23:30)
| | <?php
class guest{
/*свойства*/
var $admin;
var $date;
var $email;
var $name;
var $message;
const path = "data/messages.txt";//константа
/*методы*/
function __construct(){//метод-конструктор класса, выполняется при создании объекта
session_start();
$this->admin = $_SESSION['admin'];
$this->date = date("d/m/Y H:i:s");
$this->email = $_POST['email'];
$this->name = $_POST['name'];
$this->message = $_POST['message'];
}
//методы доступные только внутри класса
private function checkEmail($email){
if(eregi('^([a-z0-9_]|\\-|\\.)+'.'@'.'(([a-z0-9_]| \\-)+\\.)+'.'[a-z0-9]{2,4}$', $email)){
$email = "<a href=\"mailto: $email\">$email</a>";
}else{
$email = "Не указан";
}
return $email;
}
private function getName($name){
$name = htmlspecialchars($name);
$name = trim($name);
$name = str_replace(" ", "", $name);
$name = str_replace(chr(160), "", $name);
$name = str_replace(":|:", "", $name);
$name = substr($name, 0, 20);
if (empty($name)){
$name = "Аноним";
}
return $name;
}
private function getMessage($message){
$message = htmlspecialchars($message);
$message = trim($message);
$message = str_replace("\n", "<br />", $message);
$message = str_replace(":|:", "", $message);
$message = substr($message, 0, 500);
return $message;
}
//методы доступные в любом месте
public function addMessage(){
$this->email = $this->checkEmail($this->email);
$this->name = $this->getName($this->name);
$this->message = $this->getMessage($this->message);
$f=fopen(self::path, "a+");
flock($f, LOCK_EX);
fwrite($f, $this->date.":|:".$this->name.":|:".$this->email.":|:".$this->message."\r\n");
flock($f, LOCK_UN);
fclose($f);
header("location: index.php");
}
public function delMessage(){
$i=$_GET['del_mess'];
$i--;
$messages = file(self::path);
krsort($messages);
$messages=array_values($messages);
unset($messages[$i]);
krsort($messages);
$messages=array_values($messages);
$f=fopen(self::path, "w+");
flock($f, LOCK_EX);
fwrite($f, implode("", $messages));
fflush($f);
flock($f, LOCK_UN);
fclose($f);
header("location: index.php");
}
public function showMessages(){
$messages = file(self::path);
$count = count($messages);
krsort($messages);//сортировка массива по ключам в обратном порядке
$messages=array_values($messages);//переиндексация массива
if ($count!=0){
if (isset($_GET['n'])){
$i = $_GET['n'];
}else{
$i = 0;
}
$limit = $i+10;
$back = $i-10;
$k=$i+1;
while($i<$limit){
if ($i%2==0){
$elclass="a1";
}else{
$elclass="a2";
}
$element=explode(":|:", $messages[$i]);
if ($i==$count){
break;
}
echo "<div class=\"message\"><div class=\"$elclass\">Сообщение #".$i."<br />".$element[0]."<br />".$element[1]."<br />".$element[2]."</div>".$element[3];
if ($this->admin){
echo "\n<br />\n<a href=\"{$_SERVER['PHP_SELF']}?del_mess=$k\">Удалить сообщение</a>";
}
echo "</div>\n";
$i++;
$k++;
}
echo "<div>";
if ($back<0){
$back = 0;
}
echo "<a href=\"{$_SERVER['PHP_SELF']}?n=$back\">«Назад</a>";
if ($i!=$count){
echo "|<a href=\"{$_SERVER['PHP_SELF']}?n=$i\">Далее»</a></div>\n";
}
}else{
echo "Здесь нет пока сообщений.\n";
}
}
}//class
/*Конец*/
?> | |
|
|
|
|
автор: 34534 (24.06.2009 в 21:57) |
|
|
для: Skinhead1
(24.06.2009 в 21:40)
| | особенно гениально "резать" строку с помощью substr после htmlspecialchars'а... | |
|
|
|