Этот урок связан с проектом Создание регистрации на сайте на PHP + MySQL

Создание регистрации на сайте на PHP + MySQL. Часть III

Здравствуйте! Это уже 3-я часть статьи, а вот первая и вторая.

sourse

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

Начнем с графической защиты от автоматической регистрации. Написана она по статье с сайта wm-help.net.

Разархивируйте папку code в тот же каталог, где и все файлы Code.rar. Можете изменить там несколько строчек кода, сменить фон, шрифты. Комментарии внутри.
Далее нам необходимо вывести ее при регистрации. Для этого откроем файл reg.php и добавим следующий код перед кнопкой «зарегистрироваться».

 <!-- В переменную fupload отправится изображение, которое    выбрал пользователь. --> 
<p>Введите код с картинки *:<br>
<p><img src="code/my_codegen.php"></p>
<p><input type="text" name="code"></p>
<!-- В “code/my_codegen.php” генерируется код и рисуется изображение -->
<p>
<input type="submit" name="submit" value="Зарегистрироваться">

Затем необходимо проверить, правильно ли пользователь ввел этот код. Открываем save_user.php и заменяем код  с начала, и до обработки логина функцией stripslashes.

  <?php
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (isset($_POST['code'])) { $code = $_POST['code']; if ($code == '') { unset($code);} } //заносим введенный пользователем защитный код в переменную $code, если он пустой, то уничтожаем переменную
if (empty($login) or empty($password)or empty($code)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев
}
function generate_code() //запускаем функцию, генерирующую код. Можно даже вывести ее в отдельный файл.
{
    $hours = date("H"); // час      
    $minuts = substr(date("H"), 0 , 1);// минута
    $mouns = date("m");    // месяц            
    $year_day = date("z"); // день в году
    $str = $hours . $minuts . $mouns . $year_day; //создаем строку
    $str = md5(md5($str)); //дважды шифруем в md5
        $str = strrev($str);// реверс строки
        $str = substr($str, 3, 6); // извлекаем 6 символов, начиная с 3
        // Вам конечно же можно постваить другие значения, так как, если взломщики узнают, каким именно способом это все генерируется, то в защите не будет смысла.
    $array_mix = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
    srand ((float)microtime()*1000000);
    shuffle ($array_mix);
        //Тщательно перемешиваем, соль, сахар по вкусу!!!
    return implode("", $array_mix);
}
function chec_code($code) //проверяем код
{
    $code = trim($code);//удаляем пробелы
    $array_mix = preg_split ('//', generate_code(), -1, PREG_SPLIT_NO_EMPTY);
    $m_code = preg_split ('//', $code, -1, PREG_SPLIT_NO_EMPTY);
    $result = array_intersect ($array_mix, $m_code);
if (strlen(generate_code())!=strlen($code))
{ return FALSE;}
if (sizeof($result) == sizeof($array_mix))
{   return TRUE;}
else
{   return FALSE;}}
// после сравнения проверяем, пускать ли пользователя дальше или, он сделал ошибку, и остановить скрипт
if (!chec_code($_POST['code']))
{
exit ("Вы ввели неверно код с картинки"); //останавливаем выполнение сценариев
}
//если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);

Далее необходимо создать таблицу, в которой будут храниться личные сообщения, назовем ее “messages”. Какие поля нам нужны для этого? Конечно идентификатор id”, затем author”, ведь нам надо знать, кто отправил сообщение. “poluchatel – тот, кому послали сообщение. “date – дата отправки сообщения и, конечно же, сам текст сообщения “text”!!!

CREATE TABLE `messages` (
  `id` int(9) NOT NULL auto_increment,
  `author` varchar(15) NOT NULL default '',
  `poluchatel` varchar(15) NOT NULL default '',
  `date` date NOT NULL default '0000-00-00',
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=8 ;

Создадим же наконец-то страничку для пользователя page.php! У каждого пользователя есть идентификатор id”, вот через него и будем указывать «хозяина» странички.  Она будет устроена так: в самом начале проверяем, запущена ли сессия у пользователя, затем на свою ли он страничку зашел. Если на свою, то предлагаем ему изменить личные данные и выводим сообщения, если на чужую, то выводим форму для отправки сообщений.

 
<?php
// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!!
session_start();
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
if (isset($_GET['id'])) {$id =$_GET['id']; } //id "хозяина" странички
else
{ exit("Вы зашли на страницу без параметра!");} //если не указали id, то выдаем ошибку
if (!preg_match("|^[\d]+$|", $id)) {
exit("<p>Неверный формат запроса! Проверьте URL</p>");//если id не число, то выдаем ошибку
}
if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
//если существует логин и пароль в сессиях, то проверяем, действительны ли они
$login = $_SESSION['login'];
$password = $_SESSION['password'];
$result2 = mysql_query("SELECT id FROM users WHERE login='$login' AND password='$password'",$db);
$myrow2 = mysql_fetch_array($result2);
if (empty($myrow2['id']))
   {
   //Если не действительны (может мы удалили этого пользователя из базы за плохое поведение)
    exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
   }
}
else {
//Проверяем, зарегистрирован ли вошедший
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!"); }
$result = mysql_query("SELECT * FROM users WHERE id='$id'",$db);
$myrow = mysql_fetch_array($result);//Извлекаем все данные пользователя с данным id
if (empty($myrow['login'])) { exit("Пользователя не существует! Возможно он был удален.");} //если такого не существует
?>
<html>
<head>
<title><?php echo $myrow['login']; ?></title>
</head>
<body>
<h2>Пользователь "<?php echo $myrow['login']; ?>"</h2>
 
<?php
print <<<HERE
|<a href='page.php?id=$myrow2[id]'>Моя страница</a>|<a href='index.php'>Главная страница</a>|<a href='all_users.php'>Список пользователей</a>|<a href='exit.php'>Выход</a><br><br>
HERE;
//выше вывели меню
if ($myrow['login'] == $login) {
//Если страничка принадлежит вошедшему, то предлагаем изменить данные и выводим личные сообщения
print <<<HERE
<form action='update_user.php' method='post'>
Ваш логин <strong>$myrow[login]</strong>. Изменить логин:<br>
<input name='login' type='text'>
<input type='submit' name='submit' value='изменить'>
</form>
<br>
<form action='update_user.php' method='post'>
Изменить пароль:<br>
<input name='password' type='password'>
<input type='submit' name='submit' value='изменить'>
</form>
<br>
<form action='update_user.php' method='post' enctype='multipart/form-data'>
Ваш аватар:<br>
<img alt='аватар' src='$myrow[avatar]'><br>
Изображение должно быть формата jpg, gif или png. Изменить аватар:<br>
<input type="FILE" name="fupload">
<input type='submit' name='submit' value='изменить'>
</form>
<br>
<h2>Личные сообщения:</h2>
HERE;
$tmp = mysql_query("SELECT * FROM messages WHERE poluchatel='$login' ORDER BY id DESC",$db);
$messages = mysql_fetch_array($tmp);//извлекаем сообщения пользователя, сортируем по идентификатору в обратном порядке, т.е. самые новые сообщения будут вверху
if (!empty($messages['id'])) {
do //выводим все сообщения в цикле
  {
$author = $messages['author'];
$result4 = mysql_query("SELECT avatar,id FROM users WHERE login='$author'",$db); //извлекаем аватар автора
$myrow4 = mysql_fetch_array($result4);
if (!empty($myrow4['avatar'])) {//если такового нет, то выводим стандартный (может этого пользователя уже давно удалили)
$avatar = $myrow4['avatar'];
}
else {$avatar = "avatars/net-avatara.jpg";}
  printf("
  <table>
  <tr>
  <td><a href='page.php?id=%s'><img alt='аватар' src='%s'></a></td>
 
  <td>Автор: <a href='page.php?id=%s'>%s</a><br>
      Дата: %s<br>
                  Сообщение:<br>
                 %s<br>
                 <a href='drop_post.php?id=%s'>Удалить</a>
 
  </td> 
  </tr>
  </table><br>
  ",$myrow4['id'],$avatar,$myrow4['id'],$author,$messages['date'],$messages['text'],$messages['id']);
  //выводим само сообщение
  }
  while($messages = mysql_fetch_array($tmp));
                    }
                                                                              else {
                                                                              //если сообщений не найдено
                                                                              echo "Сообщений нет";
                                                                              }
                                                                             
}
else
{
//если страничка чужая, то выводим только некторые данные и форму для отправки личных сообщений
print <<<HERE
<img alt='аватар' src='$myrow[avatar]'><br>
<form action='post.php' method='post'>
<br>
<h2>Отправить Ваше сообщение:</h2>
<textarea cols='43' rows='4' name='text'></textarea><br>
<input type='hidden' name='poluchatel' value='$myrow[login]'>
<input type='hidden' name='id' value='$myrow[id]'>
<input type='submit' name='submit' value='Отправить'>
</form>
HERE;
}
?>
</body>
</html>

Если пользователь желает изменить свои данные (логин, пароль, аватар), то делает это на странице page.php, затем уже измененные данные отправляются на страницу update_user.php, которая будет обновлять их в базе. Код update_user.php:

<?php
session_start();
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то измените путь
if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
//если существует логин и пароль в сессиях, то проверяем, действительны ли они
$login = $_SESSION['login'];
$password = $_SESSION['password'];
$result2 = mysql_query("SELECT id FROM users WHERE login='$login' AND password='$password'",$db);
$myrow2 = mysql_fetch_array($result2);
if (empty($myrow2['id']))
   {
   //Если не действительны, то закрываем доступ
    exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
   }
}
else {
//Проверяем, зарегистрирован ли вошедший
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!"); }
$old_login = $_SESSION['login']; //Старый логин нам пригодиться
$id = $_SESSION['id'];//идентификатор пользователя тоже нужен
$ava = "avatars/net-avatara.jpg";//стандартное изображение будет кстати
////////////////////////
////////ИЗМЕНЕНИЕ ЛОГИНА
////////////////////////
if (isset($_POST['login']))//Если существует логин
      {
$login = $_POST['login'];
$login = stripslashes($login); $login = htmlspecialchars($login); $login = trim($login);//удаляем все лишнее
if ($login == '') { exit("Вы не ввели логин");} //Если логин пустой, то останавливаем
if (strlen($login) < 3 or strlen($login) > 15) {//проверяем дину
exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
}
// проверка на существование пользователя с таким же логином
$result = mysql_query("SELECT id FROM users WHERE login='$login'",$db);
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) {
exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); //останавливаем выполнение сценариев
}
$result4 = mysql_query("UPDATE users SET login='$login' WHERE login='$old_login'",$db);//обновляем в базе логин пользователя
if ($result4=='TRUE') {//если выполнено верно, то обновляем все сообщения, которые отправлены ему
mysql_query("UPDATE messages SET author='$login' WHERE author='$old_login'",$db);
$_SESSION['login'] = $login;//Обновляем логин в сессии
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$_SESSION['id']."'></head><body>Ваш логин изменен! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$_SESSION['id']."'>нажмите сюда.</a></body></html>";}//отправляем пользователя назад
      }
////////////////////////
////////ИЗМЕНЕНИЕ ПАРОЛЯ
////////////////////////
else if (isset($_POST['password'])) //Если существует пароль
      {
$password = $_POST['password'];
$password = stripslashes($password);$password = htmlspecialchars($password);$password = trim($password);//удаляем все лишнее
if ($password == '') { exit("Вы не ввели пароль");} //если пароль не введен, то выдаем ошибку
if (strlen($password) < 3 or strlen($password) > 15) {//проверка на количество символов
exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
}
$password = md5($password);//шифруем пароль
$password = strrev($password);// для надежности добавим реверс
$password = $password."b3p6f";
//можно добавить несколько своих символов по вкусу, например, вписав "b3p6f". Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет. Но советую ставить другие символы, можно в начале строки или в середине.
//При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера.
 
$result4 = mysql_query("UPDATE users SET password='$password' WHERE login='$old_login'",$db);//обновляем пароль
if ($result4=='TRUE') {//если верно, то обновляем его в сессии
$_SESSION['password'] = $password;
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$_SESSION['id']."'></head><body>Ваш пароль изменен! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$_SESSION['id']."'>нажмите сюда.</a></body></html>";}//отправляем обратно на его страницу
     }
////////////////////////
////////ИЗМЕНЕНИЕ АВАТАРЫ
////////////////////////
else if (isset($_FILES['fupload']['name'])) //отправлялась ли переменная
      {
if (empty($_FILES['fupload']['name']))
{
//если переменная пустая (пользователь не отправил изображение),то присваиваем ему заранее приготовленную картинку с надписью "нет аватара"
$avatar = "avatars/net-avatara.jpg"; //можете нарисовать net-avatara.jpg или взять в исходниках
$result7 = mysql_query("SELECT avatar FROM users WHERE login='$old_login'",$db);//извлекаем текущий аватар
$myrow7 = mysql_fetch_array($result7);
if ($myrow7['avatar'] == $ava) {//если аватар был стандартный, то не удаляем его, ведь у на одна картинка на всех.
$ava = 1;
}
else {unlink ($myrow7['avatar']);}//если аватар был свой, то удаляем его, затем поставим стандарт
}
else
{
//иначе - загружаем изображение пользователя для обновления
$path_to_90_directory = 'avatars/';//папка, куда будет загружаться начальная картинка и ее сжатая копия
               
if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['fupload']['name']))//проверка формата исходного изображения
                 {            
                                               
                               $filename = $_FILES['fupload']['name'];
                               $source = $_FILES['fupload']['tmp_name'];       
                               $target = $path_to_90_directory . $filename;
                               move_uploaded_file($source, $target);//загрузка оригинала в папку $path_to_90_directory
                if(preg_match('/[.](GIF)|(gif)$/', $filename)) {
                $im = imagecreatefromgif($path_to_90_directory.$filename) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
                }
                if(preg_match('/[.](PNG)|(png)$/', $filename)) {
                $im = imagecreatefrompng($path_to_90_directory.$filename) ;//если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
                }
               
                if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
                               $im = imagecreatefromjpeg($path_to_90_directory.$filename); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
                }
               
//СОЗДАНИЕ КВАДРАТНОГО ИЗОБРАЖЕНИЯ И ЕГО ПОСЛЕДУЮЩЕЕ СЖАТИЕ ВЗЯТО С САЙТА www.codenet.ru
// Создание квадрата 90x90
// dest - результирующее изображение
// w - ширина изображения
// ratio - коэффициент пропорциональности
$w = 90;  // квадратная 90x90. Можно поставить и другой размер.
// создаём исходное изображение на основе
// исходного файла и определяем его размеры
$w_src = imagesx($im); //вычисляем ширину
$h_src = imagesy($im); //вычисляем высоту изображения
         // создаём пустую квадратную картинку
         // важно именно truecolor!, иначе будем иметь 8-битный результат
         $dest = imagecreatetruecolor($w,$w);
nbsp;        // вырезаем квадратную серединку по x, если фото горизонтальное
         if ($w_src>$h_src)
         imagecopyresampled($dest, $im, 0, 0,
                          round((max($w_src,$h_src)-min($w_src,$h_src))/2),
                          0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
         // вырезаем квадратную верхушку по y,
         // если фото вертикальное (хотя можно тоже серединку)
         if ($w_src<$h_src)
         imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
                          min($w_src,$h_src), min($w_src,$h_src));
         // квадратная картинка масштабируется без вырезок
         if ($w_src==$h_src)
         imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
                                
$date=time(); //вычисляем время в настоящий момент.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");//сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у аватаров не было одинаковых имен.
//почему именно jpg? Он занимает очень мало места + уничтожается анимирование gif изображения, которое отвлекает пользователя. Не очень приятно читать его комментарий, когда краем глаза замечаешь какое-то движение.
$avatar = $path_to_90_directory.$date.".jpg";//заносим в переменную путь до аватара.
$delfull = $path_to_90_directory.$filename;
unlink ($delfull);//удаляем оригинал загруженного изображения, он нам больше не нужен. Задачей было - получить миниатюру.
$result7 = mysql_query("SELECT avatar FROM users WHERE login='$old_login'",$db);//извлекаем текущий аватар пользователя
$myrow7 = mysql_fetch_array($result7);
if ($myrow7['avatar'] == $ava) {//если он стандартный, то не удаляем его, ведь у нас одна картинка на всех.
$ava = 1;
}
else {unlink ($myrow7['avatar']);}//если аватар был свой, то удаляем его
 
}
else
        {
                               //в случае несоответствия формата, выдаем соответствующее сообщение
        exit ("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>");
                               }
}
$result4 = mysql_query("UPDATE users SET avatar='$avatar' WHERE login='$old_login'",$db);//обновляем аватар в базе
if ($result4=='TRUE') {//если верно, то отправляем на личную страничку
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$_SESSION['id']."'></head><body>Ваша аватарка изменена! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$_SESSION['id']."'>нажмите сюда.</a></body></html>";}
      }
?>

Если пользователь не собирается менять свои данные, а зашел почитать сообщения, то, скорее всего, захочет удалить лишние. Для этого у нас есть файл drop_post.php, который удаляет из базы сообщение с нужным id.

<?php
session_start();//запускаем сессии
include ("bd.php");//подключаемся к базе
if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
//если существует логин и пароль в сессиях, то проверяем, действительны ли они
$login = $_SESSION['login'];
$password = $_SESSION['password'];
$result2 = mysql_query("SELECT id FROM users WHERE login='$login' AND password='$password'",$db);
$myrow2 = mysql_fetch_array($result2);
if (empty($myrow2['id']))
   {
   //данные пользователя неверны.
    exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
   }
}
else {
//Проверяем, зарегистрирован ли вошедший
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!"); }
$id2 = $_SESSION['id']; //получаем идентификатор своей страницы
 
if (isset($_GET['id'])) { $id = $_GET['id'];}//получаем через GET запрос идентификатор сообщения, которое нужно удалить
$result = mysql_query("SELECT poluchatel FROM messages WHERE id='$id'",$db);
$myrow = mysql_fetch_array($result); //нужно уточнить, кому сообщение отправлено
//ведь через GET запрос пользователь может ввести любой идентификатор и как следствие удалить сообщения, которые отправляли не ему.
if ($login == $myrow['poluchatel']) {//если сообщение отправляли данному пользователю, то разрешаем его удалить
$result = mysql_query ("DELETE FROM messages WHERE id = '$id' LIMIT 1");//удаляем сообщение
if ($result == 'true') {//если удалено - перенаправляем на страничку пользователя
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$id2."'></head><body>Ваше сообщение удалено! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$id2."'>нажмите сюда.</a></body></html>";
}
else {//если не удалено, то перенаправляем, но выдаем сообщение о неудаче
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$id2."'></head><body>Ошибка! Ваше сообщение не удалено. Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$id2."'>нажмите сюда.</a></body></html>"; }
}
else {exit("Вы пытаетесь удалить сообщение, отправленное не вам!");} //если сообщение отправлено не этому пользователю. Значит, он попытался удалить его, введя в адресной строке какой-то другой идентификатор
?>

Если же пользователь вошел не на свою страничку, следовательно, изменять ничего не сможет, но у него есть возможность отправить сообщение. Файл post.php добавляет в базу сообщения:

<?php
session_start(); //запускаем сессию. Обязательно в начале страницы
include ("bd.php"); // соединяемся с базой, укажите свой путь, если у вас уже есть соединение
if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
//если существует логин и пароль в сессиях, то проверяем, действительны ли они
$login = $_SESSION['login'];
$password = $_SESSION['password'];
$result2 = mysql_query("SELECT id FROM users WHERE login='$login' AND password='$password'",$db);
$myrow2 = mysql_fetch_array($result2);
if (empty($myrow2['id']))
   {
   //если логин или пароль не действителен
    exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
   }
}
else {
//Проверяем, зарегистрирован ли вошедший
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!"); }
if (isset($_POST['id'])) { $id = $_POST['id'];}//получаем идентификатор страницы получателя
if (isset($_POST['text'])) { $text = $_POST['text'];}//получаем текст сообщения
if (isset($_POST['poluchatel'])) { $poluchatel = $_POST['poluchatel'];}//логин получателя
$author = $_SESSION['login'];//логин автора
$date = date("Y-m-d");//дата добавления
if (empty($author) or empty($text) or empty($poluchatel) or empty($date)) {//есть ли все необходимые данные? Если нет, то останавливаем
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля");}
$text = stripslashes($text);//удаляем обратные слеши
$text = htmlspecialchars($text);//преобразование спецсимволов в их HTML эквиваленты
$result2 = mysql_query("INSERT INTO messages (author, poluchatel, date, text) VALUES ('$author','$poluchatel','$date','$text')",$db);//заносим в базу сообщение
echo "<html><head><meta http-equiv='Refresh' content='5; URL=page.php?id=".$id."'></head><body>Ваше сообщение передано! Вы будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$id."'>нажмите сюда.</a></body></html>";//перенаправляем пользователя
?>

Страничка со списком всех пользователей сделает сайт намного удобней. all_users.php:

<?php
// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!!
session_start();
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
if (!empty($_SESSION['login']) and !empty($_SESSION['password']))
{
//если существует логин и пароль в сессиях, то проверяем, действительны ли они
$login = $_SESSION['login'];
$password = $_SESSION['password'];
$result2 = mysql_query("SELECT id FROM users WHERE login='$login' AND password='$password'",$db);
$myrow2 = mysql_fetch_array($result2);
if (empty($myrow2['id']))
   {
   //если данные пользователя не верны
    exit("Вход на эту страницу разрешен только зарегистрированным пользователям!");
   }
}
else {
//Проверяем, зарегистрирован ли вошедший
exit("Вход на эту страницу разрешен только зарегистрированным пользователям!"); }
?>
<html>
<head>
<title>Список пользователей</title>
</head>
<body>
<h2>Список пользователей</h2>
 
<?php
//выводим меню
print <<<HERE
|<a href='page.php?id=$_SESSION[id]'>Моя страница</a>|<a href='index.php'>Главная страница</a>|<a href='all_users.php'>Список пользователей</a>|<a href='exit.php'>Выход</a><br><br>
HERE;
$result = mysql_query("SELECT login,id FROM users ORDER BY login",$db); //извлекаем логин и идентификатор пользователей
$myrow = mysql_fetch_array($result);
do
{
//выводим их в цикле
printf("<a href='page.php?id=%s'>%s</a><br>",$myrow['id'],$myrow['login']);
}
while($myrow = mysql_fetch_array($result));
?>
</body>
</html>

Добавить навигацию на страничке index.php было бы замечательно. Допишем ее после «print <<<HERE» между звездочками.

//при    удачном входе пользователю выдается все, что расположено ниже между    звездочками.
//************************************************************************************
 
print <<<HERE
|<a href='page.php?id=$_SESSION[id]'>Моя страница</a>|<a href='index.php'>Главная страница</a>|<a href='all_users.php'>Список пользователей</a>|<a href='exit.php'>Выход</a><br><br>

А теперь давайте поговорим с вами о том, для чего вообще лучше использовать регистрацию. Ведь ее использование может привести к уменьшению вашей аудитории и новых пользователей. Мы все ценим свое время, как и посетители наших сайтов, которым не доставляет никакого удовольствия заполнять поля. Поэтому не стоит бессмысленно закрывать ссылки и материалы только для того, чтобы пользователь зарегистрировался. Если я встречаю сайт, где есть такая ссылка, то сразу покидаю его, так как знаю, что найду другой сайт с тем же материалом, где ссылка открыта, причем это займет меньше времени. А если и не меньше, то просто задумайтесь, зачем администрация сайта хочет, чтобы пользователи регистрировались? В голову приходит только две мысли: чтобы хвалиться количеством пользователей или, чтобы узнать ваши пароли. Тем более, многие всегда используют одинаковые пароли на всех сайтах.

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

Автор: Стороженко Евгений (отредактировал и опубликовал Максим Шкурупий)

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.ruseller.com
Автор: Максим Шкурупий
Урок создан: 3 Августа 2009
Просмотров: 463395
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

^ Наверх ^