Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гостевая книга с MySQL, Гостевая книга с MySQL 
:(
    Опции темы
Nigel
Дата 20.7.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



эх, жаль, что в php нет строгой типизации переменных
PM MAIL   Вверх
ZuLLeR
Дата 24.7.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Вот посмотрите и оцените, все ли с вашей точки зрения правильно, посоветуйте что еще сделать, и правильно ли оформлен код (если нет, то можно с примерами буду только благодарен). Вообщем прошу рецензию)))

БАЗА ДАННЫХ:
Код

CREATE TABLE `guestbook` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(40) NOT NULL default '',
  `email` varchar(30) NOT NULL default '',
  `message` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;


ФАЙЛ КОНФИГА:
Код

<?php
//ПРОВЕРКА НА НАЛИЧИЕ ОШИБОК
error_reporting(E_ALL);

//НАСТРОЙКИ БАЗЫ ДАННЫХ
$mysqlserver="localhost"; // Имя сервера базы данных
$mysqldatabase="guestbook"; // Имя базы данных
$mysqllogin="root"; // Имя пользователя базы данных
$mysqlpassword = ""; // Пароль ползователя базы данных

// ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ
$connection = mysql_connect($mysqlserver,$mysqllogin,$mysqlpassword);
$select = mysql_select_db($mysqldatabase,$connection);
if (!$connection){
die("Соединение не установлено");
}
if (!$select){
die("Соединение с таблицей невозможно");
}
?>


И САМА ГОСТЕВУХА:
Код


<!--СОЗДАНИЕ ФОРМЫ-->
<html>
<head>
    <title>Гостевая</title>
</head>
<body>
<form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
     Ваше Имя:<br>
        <input type="text" name="name"><br><br>
        Ваш E-mail:<br>
        <input type="text" name="email"><br><br>
        Ваше сообщение:<br>
        <textarea rows="5" cols="30" name="message"></textarea><br>
        <input type="submit" name="send" value="OK">
</form>
<br><br>

</body>
</html>

<?php
//СОЗДАНИЕ СООБЩЕНИЯ И ОТПРАВКА ИХ В БАЗУ ДАННЫХ
require_once('./config.php');
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST['message']);

$query = "INSERT INTO `guestbook` (name,email,message) VALUES ('$name','$email','$message')";

mysql_query($query, $connection) or trigger_error(mysql_error());
}

//ВЫВОД СООБЩЕНИЯ ИЗ БАЗЫ ДАННЫХ
$query = "SELECT * FROM  guestbook ORDER BY id DESC";
$res = mysql_query($query);
while ($table=mysql_fetch_array($res))

{
echo "<hr>";
echo "Сообщение №" .$table['id']."<br>";
echo "Имя: ".$table['name']."<br>";
echo "E-mail: ".$table['email']."<br>";
echo "Cообщение: ".$table['message']."<br>";
}
?>

PM MAIL   Вверх
dimcat
Дата 24.7.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 15.5.2007

Репутация: нет
Всего: нет



Ну, ещё в таких случаях принято время записывать smile А так навскидку вроде всё правильно...


Код

$query = "INSERT INTO `guestbook` (name,email,message,time) VALUES ('$name','$email','$message',NOW())";

PM MAIL   Вверх
ZuLLeR
Дата 24.7.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Ок, сделаю время еще)
PM MAIL   Вверх
MoLeX
Дата 24.7.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(Nigel @  20.7.2008,  23:11 Найти цитируемый пост)
эх, жаль, что в php нет строгой типизации переменных


наооборот хорошо. (лично мне)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Feldmarschall
Дата 24.7.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



ZuLLeR, прекрасно. просто прекрасно.
Сказать по правде, я счастлив видеть такой код. Независимо от того, написан ли он полностью самостоятельно, или заимствован кусками.
Главное, что код простой и понятный и в нем нет ничего лишнего. А это очень важно, чтобы не было лишнего. Разными деталями - капчами, антиматами, картинками и прочим можно обрасти потом. Но при первом написании важно, чтобы был понятен и четко виден основной принцип. Чтобы потом можно было легко превратить гостевую в форум, в ленту новостей и почти в любой другой тип приложения.

Не хватает буквально пары мелочей.
Во-первых, после получения формы методом POST, надо делать редирект методом GET. чтобы не добавляли записи повторно. 
После mysql_query надо дописать
Код

header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); 
exit;

Во-вторых, надо отдать должное Dima 2015, в его гостевой реализована защита от XSS инъекций. Не сказать, что для гостевой это так уж актуально, но тем не менее, позволять использовать хтмл теги посетителям, все же, не стоит.
Это можно сделать двумя путями: либо просто убрать все теги функцией strip_tags(), либо заменять теги на html-эквиваленты. Я предпочитаю второй способ. Соответственно, код вывода изменится на 

Код

echo "Сообщение №" .$table['id'])."<br>";
echo "Имя: ".htmlspecialchars($table['name'])."<br>";
echo "E-mail: ".htmlspecialchars($table['email'])."<br>";
echo "Cообщение: ".htmlspecialchars($table['message'])."<br>";


Вот и все. Теперь можно приступать к написанию админки.
Кстати, пока писал код, обнаружил неувязку. id в базе - это совсем не порядковый номер. Ведь ты же можешь удалять некоторые сообщения.
Чтобы пронумеровать сообщения, надо завести отдельную переменную, и увеличивать её при выводе на единицу.
Код

$res = mysql_query($query);
$i=1;
while ($table=mysql_fetch_array($res)) {
echo "<hr>";
echo "Сообщение №" .$i++."<br>";

PM   Вверх
ZuLLeR
Дата 25.7.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Обязательно все поправлю и доведу до ума)))
PM MAIL   Вверх
Gold Dragon
Дата 29.7.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ну и я добавлю пару замечаний smile 

после того, как пользователь нажал "Отправить"

- для начала вводим переменную ошибки
Код

$info['error'] = '';

- проверяем имя (нельзя доверять тому что приходит от пользователя
Код

$info['name'] = (isset($_POST['name'])) ? strip_tags(trim($_POST['name'])) : '';
if($info['name']==''){
    $info['error'] .= "<br>Вы не указали имя.";
}

ну если быть более требовательным и в имени оставить только буквы и цифры, то можно проверить ещё и на это
Код

/**
 * остаются только словарные символы
 */
function fValidWord($int){
    $id = preg_replace('#\W#','',$int);
    return $id;
}

- не думаю что в сообщении вообще должно быть что-то кроме текста, так что теги там не нужны. и удалять их нужно перед сохранением в базе. За одно не помешает удалить все пробелы до и после сообщения. И заодно поставить ограничение на количество символов в сообщении, а то некоторые попытаются загрузить "Войны и Мир". В итоге должно получиться примерно такое
Код

$info['message'] = (isset($_POST['message'])) ? substr(strip_tags(trim($_POST['message'])), 0, 1000) : '';
if($info['message']==''){
    $info['error'] .= "<br>Вы не написали сообщение.";
}

- не мешало бы проверить и правильность мыла smile
Код

$info['mail'] = (isset($_POST['mail'])) ? strip_tags(trim($_POST['mail'])) : '';
$info['mail'] = (preg_match('/[0-9A-Za-z._-]+@([0-9a-z_-]+\.)+[a-z]{2,4}/', $info['mail'])==0)? '' : $info['mail'] ;
// а так как mail не обязательный параметр, то если оно не верно. оставляем просто пустым


Добавлено через 6 минут и 14 секунд
- затем обрабатываем всё что у нас получилось
Код

if($info['error']!=''){
    /**
     * выводим сообщение об ошибках
     * я например выводу туже форму с уже введёнными данными и
     * в верху перечень ошибок
     */
}else{
    /**
     * сохраняем данные в базе и делаем переход на сообщения
     */
}

- ещё бы не помещало предусмотреть "фильтр мата"

- ну и обязательно добавить проверочный код. Если не сделать, то роботы завалят спамом


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ZuLLeR
Дата 30.7.2008, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Супер спасибо всем) я и сам мог бы все это написать, но все равно огромное спасиб smile о)
PM MAIL   Вверх
Gold Dragon
Дата 30.7.2008, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



и про постраничный вывод не забудь

Добавлено через 3 минуты и 5 секунд
кстати, зачем нужна нумерация сообщений? Не достаточно просто использовать ID? При таком условии каждое сообщение будит иметь индивидуальный номер на который можно ссылаться


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ZuLLeR
Дата 30.7.2008, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Про страничный вывод я помню))) и про нумерацию тоже уже сделал, но все равно спасибо за советы) Как все доработаю выложу, пока времени нет нужно логотип, дизайн сайта и наружку сделать, вообщем дел попа) Кстати ты не знаешь смотри есть форма для отправки сообщений с сайта, как сделать что бы помимо самого сообщения отправляемого мне на мыло, отправлялось тому кто пишет стандартное для всех сообщение типа: "спасибо, но на данный момент все заняты" что то в этом роде. Часть кода формы выглядит так:
Код

// создаем наше сообщение
        $mess = '
ФИО:'.$_POST['fio'].'
Город:'.$_POST['city'].'
Контактное лицо:'.$_POST['cont'].'
Контактный email:'.$_POST['email'].'
Написал Вам:'.$_POST['testimonials'];

        // $to - кому отправляем
        $to = '[email protected]';
        // $from - от кого
        $from='сдесь типа мыло от кого';
        mail($to, $_POST['cont'], $mess, "From:".$from);

    echo '<br><br><br><p align="center"><strong><h1>Спасибо! Ваше письмо отправлено.</h1></strong></p>';
        echo ('<html><head>
<meta http-equiv="refresh" content="3; url=http://www.123.com">
</head></html>');
}

Извиняюсь что не в тему, если знаете ответ, можно с примером кода))) а после плз удали сообщение из темы, если можешь) Спс smile 
PM MAIL   Вверх
Gold Dragon
Дата 30.7.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



есть готовые классы, но пользуюсь этим (может конечно это и не правильно, пусть тогда подправят)
Код

$to  = "=?windows-1251?b?".base64_encode('Имя')."?= <мыло_куда>" ;
$subject = "=?windows-1251?b?".base64_encode('Сообщение с сайта о чём-то')."?=";
$message = "само_сообщение";
$headers  = "Content-type: text/html; charset=windows-1251 \r\n";
$headers .= "From: =?windows-1251?b?".base64_encode('От куда')."?= <мыло_от_куда>\r\n";
mail($to, $subject, $message, $headers);




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0937 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.