
- •Дата и время в php Пример 1
- •Пример 2
- •Пример 3
- •Динамическая работа с таблицами
- •Форматированный вывод строк в php
- •Проверка введенных данных на php, отправка заполненной формы на почту
- •Последнее изменение страницы
- •Как сделать постраничный вывод фотографий, изображений, картинок. Php
- •Авторизация посетителей на php
Последнее изменение страницы
<?php
print "последнее изменение: " . date ("d M Y, h:i a", getlastmod());
// дату и время вы можете изменить по своему усмотрению
?>
Как сделать постраничный вывод фотографий, изображений, картинок. 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) |
|
|
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>