Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическая работа_3_PHP.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
115.2 Кб
Скачать
  1. Последнее изменение страницы

<?php

print "последнее изменение: " . date ("d M Y, h:i a", getlastmod());

// дату и время вы можете изменить по своему усмотрению

?>

  1. Как сделать постраничный вывод фотографий, изображений, картинок. Php

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

Допустим у нас две папки на сервере photo/ и photo_mini/

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

Здесь же мы разрешим пользователю выбрать количество изображений на странице

Создаем файл index.php, пишем в него вот такой код:

<?php

$url="photo_mini/";

$url2="photo/";

// Количество на странице

$link="<a href='index.php?n=15&p=1'>15</a>";

$link2="<a href='index.php?n=20&p=1'>20</a>";

$link3="<a href='index.php?n=25&p=1'>25</a>";

// получаем кол-во изображений

if(isset($_GET["n"])){$n=$_GET["n"];}

else{$n="";}

// защита от ввода вручную кол-ва изображений

$temp_array=array("","15","20","25");

if(preg_match("/[%a-z_@.,^=:;а-я\"*()&$#№+\-!?<>\~`|[{}\]]/i", $n) or !in_array($n,$temp_array))

{die(header("Location:index.php"));}

if($n==""){$max="15"; $link="<b>15</b>"; $n="15";}

elseif(($n)=="15") {$max="15"; $link="<b>15</b>";}

elseif(($n)=="20"){$max="20"; $link2="<b>20</b>";}

elseif(($n)=="25"){$max="25"; $link3="<b>25</b>";}

$dir=opendir($url);

while(($file=readdir($dir))!==false)

{

if($file!="." && $file!="..")

{

$images[]=$file;

}

}

closedir($dir);

// количество изображений

$count=count(@$images);

/* делим общее кол-во изображений на максимальное

округляем в большую сторону и тем самым получаем

общее число страниц */

$pages=ceil($count/$max);

// вводим переменную, указывающую номер страницы

if(empty($_GET["p"])){$_GET["p"]="1";}

$p=$_GET["p"];

// защита от ввода вместо номера страницы какой-нибудь ерунды

if(preg_match("/[%a-z_@.,^=:;а-я\"*()&$#№+\-!?<>\~`|[{}\]]/i", $p))

{die(header("Location:index.php"));}

// если кто-то вводит номер страницы больше, чем всего у нас страниц

if($pages>0 && $p>$pages){die(header("Location:index.php"));}

$first=($p*$max)-$max ;

$last=($p*$max)-1;

print "Фотографий на страницу: $link | $link2 | $link3<br><br>";

for($i=$first;$i<=$last;$i++)

{

if(@$images[$i])

{

print "<a href='$url2$images[$i]' target='_blank'><img src=".$url.$images[$i]." style='padding-bottom:6px;'></a>\r\n";

}

}

print "<br><br>Страницы: ";

for($u=1;$u<=$pages;$u++)

{

if($p!=$u){print "<a href='index.php?n=$n&p=$u'>$u</a> ";}

elseif($p==$u){print "<b>$u</b> ";}

}

?>

Авторизация посетителей на php

Рассмотрим систему авторизации пользователей (регистрация, login/logout, доступ к закрытым страничкам, поддтвеждение по e-mail).

Нам понадобятся: вебсервер, PHP, MySQL. Предполагается, что вы с этим всем уже знакомы на определенном уровне.

Для начала создадим в базу данных, допустим, "authorize" и таблицу "users" в ней. Работать с БД MySQL очень удобно с помощью инструмента PhpMyAdmin, который можно скачать здесь.

Итак, таблица "users":

Поле

Тип

По умолчанию

Дополнительно

id

mediumint(9)

auto_increment

login

varchar(32)

index unique

pass

varchar(32)

email

varchar(64)

index unique

status

tinyint(2)

0

timestamp

int(10)

Теперь сделаем страничку регистрации и скрипт, заносящий данные о юзере в базу. Нам понадобится html-файл с такой формой (естественно, если хотите иметь больше информации о юзере, можно добавить соответствующие поля, изменить скрипт и таблицу в БД):

<form action="registration.php" method="post">

<table>

<tr>

<td>Логин* :</td>

<td><input type="text" name="rLogin" value="" size="25" maxlength="30" /></td>

</tr>

<tr>

<td>Пароль* :</td>

<td><input type="password" name="rPass" value="" size="25" maxlength="30" /></td>

</tr>

<tr>

<td>Повторите пароль* :</td>

<td><input type="password" name="rPass2" value="" size="25" maxlength="30" /></td>

</tr>

<tr>

<td>E-mail* :</td>

<td><input type="text" name="rEmail" value="" size="25" maxlength="30" /></td>

</tr>

<tr>

<td></td>

<td><input type="reset" name="reset" value="Очистить" />

<input type="submit" name="ok" value="Готово" /></td>

</tr>

</table>

</form>

Теперь создадим скрипт "registration.php", который и будет обрабатывать форму регистрации:

<?

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

$rLogin = trim($_POST['rLogin']);

$rPass = trim($_POST['rPass']);

$rPass2 = trim($_POST['rPass2']);

$rEmail = trim($_POST['rEmail']);

if ($rLogin == '') {

die("Поле 'Логин' не заполнено<br />\n");

// Логин может состоять из букв, цифр и подчеркивания

}elseif (!preg_match("/^\w{3,}$/", $rLogin)) {

die("В поле 'Логин' введены недопустимые символы<br />\n");

}

if ($rEmail == '') {

die("Поле 'E-mail' не заполнено<br />\n");

// Проверяем e-mail на корректность

}elseif (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) {

die("Указанный 'E-mail' имеет недопустимый формат<br />\n");

}

if ($rPass == '' || $rPass2 == '') {

die("Поле 'Пароль' не заполнено<br />\n");

}elseif($rPass !== $rPass2) {

die("Поля 'Пароль' и 'Повтор пароля' не совпадают<br />\n");

// Пароль может состоять из букв, цифр и подчеркивания

}elseif(!preg_match("/^\w{3,}$/", $rPass)) {

die("В поле 'Пароль' введены недопустимые символы<br />\n");

}

// В базе данных у нас будет храниться md5-хеш пароля

$mdPassword = md5($rPass);

// А также временная метка (зачем - позже)

$time = time();

// Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)

$link = mysql_connect('localhost', $dbuser, $dbpass);

if (!$link) {

die("Не могу соединиться с базой данных");

}else {

// Выбираем базу данных

mysql_select_db('authorize', $link);

// Записываем в базу (не используем addslashes - экранировать нечего)

mysql_query("INSERT INTO users (login, pass, email, timestamp)

VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);

if (mysql_error($link) != "") {

die("Пользователь с таким логином уже существует, выберите другой<br />\n");

}

// Получаем Id, под которым юзер добавился в базу

$id = mysql_result(mysql_query("SELECT LAST_INSERT_ID()", $link), 0);

// Составляем "keystring" для активации

$key = md5(substr($rEmail, 0 ,2).$id.substr($rLogin, 0 ,2));

$date = date("d.m.Y",$time);

// Компонуем письмо

$title = 'Потвеждение регистрации на сайте Somwhere.net';

$headers = "Content-type: text/plain; charset=windows-1251\r\n";

$headers .= "From: Администрация Somwhere.net \r\n";

$subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($title, "w","k")).'?=';

$letter = <<< LTR

Здравствуйте!

Что-то там .....

Ваши регистрационные данные:

логин: $rLogin

пароль: $rPass

Для активации аккаунта вам следует пройти по ссылке:

http://somewhere.net/activation.php?login=$rLogin&key=$key

Данная ссылка будет доступна в течении 5 дней.

$date

LTR;

// Отправляем письмо

if (!mail($rEmail, $subject, $letter, $headers)) {

// Если письмо не отправилось, удаляем юзера из базы

mysql_query("DELETE FROM users WHERE login='".$login."' LIMIT 1", $link);

echo 'Произошла ошибка при отправке письма. Попробуйте зарегистрироваться еще раз.';

}else {

echo 'Вы успешно зарегистрировались в системе. На указанный вами

e-mail было отправлено письмо со ссылкой для активации аккаунта.

У вас 5 дней!';

}

mysql_close($link);

}

}

?>

Теперь у нас в таблице "users" должна быть строка вида:

1 login 76d80224611fc919a5d54f0ff9fba446 eqw@asd.ru 0 1197730343

Теперь создадим скрипт, активирующий пользователей. Система его будет такова:

  • • Пользователь приходит по ссылке с GET-данными "login" и "key"

  • • Берем из базы id, login, e-mail, status и timestamp юзера (если юзер есть). Проверяем статус (активирован уже или нет). Проверяем разницу текущей временной метки и метки из базы, если больше 5*24*60*60 - до свидания

  • • Составляем новую "keystring" по тем же правилам, что и старую. Сравниваем. Не равны - до свидания

  • • Если ключевые строки равны - апдейтим статус до 1.

А код таков:

<?

if (isset($_GET['login']) && isset($_GET['key'])) {

$login = $_GET['login'];

$key = $_GET['key'];

// Делаем проверку login на нехорошие символы

if (!preg_match("/^\w{3,}$/", $login)) {

die('Неправильная ссылка!');

}

$time = time();

$link = mysql_connect('localhost',$dbuser,$dbpass);

if (!$link) {

die('Не удалось соединиться с БД');

}else{

mysql_select_db('authorize', $link);

$res = mysql_query("SELECT id, email, status, timestamp

FROM users WHERE login='$login' LIMIT 1", $link);

// Есть ли пользователь с таким логином?

if (mysql_num_rows($res) != 1) {

mysql_close($link);

die('Такого пользователя нет!');

}

$user = mysql_fetch_row($res);

// Может он уже активен?

if ($user[2] == 1) {

mysql_close($link);

die('Данный логин уже подтвержден!');

}

// Успел ли юзер активировать логин? (если нет - удаляем из базы)

if ($user[3] - $time > 5*24*60*60) {

mysql_query("DELETE FROM users WHERE login='$login' LIMIT 1", $link);

mysql_close($link);

die('Срок активации истёк! Регистрируйтесь заново.');

}

$key1 = md5(substr($user[1], 0 ,2).$user[0].substr($login, 0 ,2));

// Поверяем "keystring"

if ($key1 != $key) {

mysql_close($link);

die('Неправильная контрольная сумма!');

}

// Если все проверки пройдены - активируем логин!

mysql_query("UPDATE users SET status = 1 WHERE login='$login'", $link);

mysql_close($link);

}

}

?>

Так, с регистрацией мы покончили, теперь сделаем форму для авторизации, например, такую:

<form method="post" action="login.php">

<table>

<tr>

<td>Логин</td>

<td><input type="text" name="login"></td>

</tr>

<tr>

<td>Пароль</td>

<td><input type="password" name="password"></td>

</tr>

<tr>

<td colspan="2"><input type="submit" value="Войти"></td>

</tr>

</table>

</form>

Вставляйте эту форму в любое место страницы, как того требует дизайн. Обработчиком формы будет у нас файл "login.php" такого вида:

<?

if (isset($_POST['login'])) {

$passwordHash = md5($_POST['password']);

$login = $_POST['login'];

// Проверка логина на плохие смиволы

if (!preg_match("/^\w{3,}$/", $login)) {

die('Неправильный логин!');

}

$link = mysql_connect('localhost',$dbuser,$dbpass);

if (!$link) {

die('Не удалось соединиться с БД');

}else{

mysql_select_db('authorize', $link);

$res = mysql_query("SELECT status FROM users WHERE login='$login'", $link);

// Есть ли пользователь с таким логином?

if (mysql_num_rows($res) < 1) {

mysql_close($link);

die('Такого пользователя нет!');

}

// Какой статус у пользователя?

if (mysql_result($res, 0) != 1) {

mysql_close($link);

die('Логин не активирован!');

}

// Стартуем сессию и записываем логин в суперглобальный массив $_SESSION

session_start();

$_SESSION['user'] = $login;

mysql_close($link);

// Если определена страница с которой мы пришли,

// на нее и переадресуем, либо на главную

if (isset($_SERVER['HTTP_REFERER'])) {

header ("location: ".$_SERVER['HTTP_REFERER']);

}else {

header ("location: index.php");

}

}

}

?>

Напишем сразу скрипт "logout.php", работающий как "выход из системы":

<?

session_start();

if (isset($_SESSION['user'])) {

// удаляем элемент "user"

unset($_SESSION['user']);

}

if (isset($_SERVER['HTTP_REFERER'])) {

header ("location: ".$_SERVER['HTTP_REFERER']);

}else {

header ("location: index.php");

}

?>

Ну вот, юзер авторизован. Осталась малость:

• В начале каждого документа стартовать сессию функцией session_start()

• Проводить проверку на присутствие в массиве $_SESSION элемента user. На основе нее выдавать "секретный" документ или общий.

• Вместо формы для авторизации распечатывать приветствие и ссылку на "logout.php"

Вот простейший пример документа:

<?

session_start();

if (isset($_SESSION['user'])) {

$auth = "Привет ".$_SESSION['user']."!<br />\n";

$auth .= "<a href='logout.php'>Выйти</a>";

$docum = "Эта информация только для зарегистрированных";

}else {

$auth = <<< AUTH

<form method="post" action="login.php">

<table>

<tr>

<td>Логин</td>

<td><input type="text" name="login"></td>

</tr>

<tr>

<td>Пароль</td>

<td><input type="password" name="password"></td>

</tr>

<tr>

<td colspan="2"><input type="submit" value="Войти"></td>

</tr>

</table>

</form>

AUTH;

$docum = "Эта общая информация";

}

?>

<html>

<head>

</head>

<body>

<? echo $auth; ?>

<hr />

<? echo $docum; ?>

</body>

</html>

12