Сайтостроительство (8)

PHP-кодинг (25)

Веб-дизайн (9)

DHTML/JavaScript (8)

Подкастинг (1)

Безопасность в PHP (3)

Секретный раздел

Карта блога

Регистрация пользователей на PHP+MySQL

Скрипт гостевой книги с красивым дизайном

Галерея на jQuery

Простая система регистрации пользователей на сессиях

Галерея на php+jquery

Форма обратной связи с защитой типа капча

Шаблоны запросов и placeholders

Быстрое перенаправление средствами php

Flash плеер для вашего сайта

Сортировка столбцов в таблице на php+mysql

Кэширование страничек на стороне сервера

Генераторы графики для Web 2.0

Flash плеер для вашего сайта

Вертикальное меню в виде закладок

Загрузка аватаров через систему регистрации

За весь период

За 2010-11

За 2009-06

За 2009-05

За 2009-04

За 2009-03

За 2009-02

За 2008-08

Бегун контекстная реклама

Ruseller видеоуроки

Letitbit файлообменник

Tak.Ru $$$ вебмастеру

WMmail почтовые рассылки

WMlink продажа трафика

Sape.Ru продажа ссылок

Главная » PHP-кодинг

Редактирование профиля юзера с опцией обновления аватарки

Для работы нам потребуется отредактировать существующий файл-скрипт member.php. В частности те куски кода, которые отвечают за отображение формы редактирования (do=editaccount) и сам обработчик редактирования(do= edit_account).

Скачать исходники этого урока вар.№1 | Скачать исходники этого урока вар.№2

Вначале рассмотрим форму для редактирования. Я решил её немного модифицировать, чтобы она выглядела более солидно и можно было также рассмотреть фильтрацию строковых переменных в обработчике. Добавил я 4 новых поля: ICQ, сайт, город и дату регистрации. Дата регистрации заноситься только при новой регистрации пользователя. В редактировании данных не учавствует. А также отображение текущего аватара. Внешний вид получившейся формы Вы можете наблюдать ниже.

Т.е., если вы хотите, чтобы ваша форма имела такие же поля, то добавьте их через утилиту phpMyAdmin. В ихходниках я приложил файл sql для обновленной таблицы "users". Обновления касались следующих полей:


  `icq` int(2) NOT NULL default '0',
  `site` varchar(50) NOT NULL default '',
  `city` varchar(150) character set cp1251 NOT NULL default '',
  `date` date NOT NULL default '0000-00-00',

Теперь рассмотрим какой код понадобился нам для внесений вышесказанных изменений:


if($_GET['do'] == "editaccount") 
{
	if($_SESSION["loged"] == "yes")
	{
		$sql_query = "SELECT * FROM users where username='{$_SESSION["username"]}'";
		$result = mysql_query($sql_query);
		$row = mysql_fetch_array($result);
		$email = $row["email"];
		$icq = $row["icq"];
		$site = $row["site"];
		$city = $row["city"];
		$av = $row["avatar"];
		$no_avt = "no_avatar.gif";
		if(!isset($_POST['edit']))
		{?>
<form action="member.php?do=edit_account" method="post" enctype="multipart/form-data"><br><table width="95%" align="center" cellpadding="4" cellspacing="0" border="0" class="gf"><tr><td colspan="2" align="center" class="nav_title">Редактирование профиля</td></tr><tr><td align="right">Ваше имя:</td><td><input type="text" disabled readonly name="username" value="<? echo $_SESSION["username"]; ?>" size="30"></td></tr><tr><td align="right">Ваш E-Mail:</td><td><input type="text" name="emaila" value="<?=$email?>" size="30"></td></tr><tr><td align="right">ICQ:</td><td><input type="text" name="icq" value="<? echo ''.($icq == 0?"":"$icq").''; ?>" size="30" maxlength="9"></td></tr><tr><td align="right">Сайт:</td><td><input type="text" name="site" value="<?=$site?>" size="30" maxlength="50"></td></tr><tr><td align="right">Город:</td><td><input type="text" name="city" value="<?=$city?>" size="30" maxlength="150"></td></tr><tr><td align="right">Текущий аватар:</td><td><? echo ''.($av == NULL?"<img src=\"img/avatars/".$no_avt."\">":"<img src=\"img/avatars/".$av."\">").''?></td></tr>
			<?if ($av != $no_avt){?>
			<tr><td> </td><td><a href="member.php?do=editaccount&del=1">Удалить текущий аватар</a></td></tr>
			<?}?>
<tr><td align="right">Загрузить новый аватар:</td><td><input type="checkbox" name="upload2"> Да</td></tr><tr><td align="right">Выберите новый аватар:</td><td><input type="file" name="userfile"></td></tr><tr><td>&nbsp;</td><td>Разрешается использовать картинки:<br>- разрешением не более 120 х 120<br>- расширением только gif,png,jpg,jpeg<br>- размером менее 30 Кб</td></tr><tr><td>&nbsp;</td><td><input type="submit" name="edit" value="Изменить данные"></td></tr></table></form>
		<?}
		if(isset($_GET['del']))
		{
			if($_GET['del']==1)
			{
				if($av != $no_avt){unlink('./img/avatars/'.$av.'');}
				mysql_query("UPDATE users SET avatar='".$no_avt."' WHERE username='$_SESSION[username]'",$db);
				echo "<html><head><meta http-equiv='Refresh' content='0; URL=member.php?do=editaccount'></head></html>";
			}
			else{exit("Неверный формат запроса");}
		}
	}
	else
	{
		echo "<p class='error'>Вы должны войти в свой аккаунт!</p>";
	}
}

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

Теперь рассмотрим обработчик этой формы. Приведу сразу весь исходный код, а чуть ниже рассмотрим его описание и принцип действия.


if($_GET['do'] == "edit_account")
{
	$emaila = trim($_POST["emaila"]);
	$icq = trim($_POST["icq"]);
	$site = trim($_POST["site"]);
	$city = trim($_POST["city"]);
	if ($emaila == '')
	{
		exit("<p class='error'>Поле 'E-mail' не заполнено! Оно является обязательным!</p>"); 
	}
	elseif (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $emaila))
	{
		exit("<p class='error'>Указанный 'E-mail' имеет недопустимый формат</p>");
	}
	if(!empty($icq))
	{
		if (!preg_match("/^\d{8,9}$/", $icq)) 
		{ 
			exit("<p class='error'>Указанный 'ICQ-номер' имеет недопустимый формат<br>Применяемый формат это от 8 или 9 цифр идущих подряд без пробелов</p>");
			if($icq == '0'){unset($icq);}
		} 
	}
	if ($site == ''){unset($site);}
	if(!empty($site))
	{
		if(!preg_match("/^(http:\/\/)?([^\/]+)/i", $site) || (!(eregi("http:\/\/", $site))))
		{
			exit ("<p class='error'>Неверно введен URL-адрес в поле Сайт!</p>");
			if($site == 'http://'){unset($site);}
		} 
	}
	if(!empty($city))
	{
		if(!preg_match("/([а-яА-Я0-9_\-])/i", $city))
		{
			exit("<p class='error'>Указанный 'Город' имеет недопустимый формат!<br>В названии города разрешено использовать только кириллицу.</p>");
		}
	}else{unset($city);}
	if($_SESSION["loged"] != "yes")
	{
		echo "<p class='error'>Вы должны войти в аккаунт!</p>";
	}
	else
	{
		if(isset($_POST['edit']))
		{
			if(isset($_POST['upload2']))
			{
				$userfile= $_FILES['userfile']['name'];
				$file_size = $_FILES['userfile']['size'];
				$file_temp = $_FILES['userfile']['tmp_name'];
				$file_err = $_FILES['userfile']['error'];
                                if(($userfile)==NULL){exit("Поле выбора изображения пустое!<br>Если не собираетесь загрузить аватар, то уберите галочку напротив 'Да'");}
				$path = 'img/avatars/';
				$randomizer = rand(0000, 9999);
				$file_name = $randomizer.$userfile;
				$file_type = $userfile;
				$file_type_length = strlen($file_type) - 3;
				$file_type = substr($file_type, $file_type_length);
				$file_type = strtolower($file_type);
				$files = array();
				$files[] = 'jpeg';
				$files[] = 'jpg';
				$files[] = 'gif';
				$files[] = 'png';
				$key = array_search($file_type, $files);
				if(!$key)
				{
					echo '<p class="error">Данный тип файла не поддерживается или вы не выбрали изображение!<br>Проверьте, чтобы не стояла галочка напротив "Загрузить новый аватар"</p>';
					exit();
				}
				$max_file_size="30720";
				$fotoksize=round($file_size/10.24)/100;
				$fotomax=round($max_file_size/10.24)/100;
				if ($fotoksize>$fotomax) {exit("<p>Вы превысили допустимый размер аватара!<BR><B>Максимально допустимый</B> размер аватара: <B>$fotomax </B>Кб.<BR> <B>Вы пытаетесь</B> загрузить изображение: <B>$fotoksize</B> Кб!</p>");}
				$size=getimagesize($_FILES['userfile']['tmp_name']);if ($size[0]>120 or $size[1]>120) {exit("<p>Не допустимые габариты аватара. Допустимо лишь 120 х 120 px!</p>");}if(!isset($userfile)){ echo ("<p class='error'>Вы не выбрали изображение!</p>"); }$error_count = count($file_error);
				if($error_count > 0) 
				{
					for($i = 0; $i <= $error_count; ++$i)
					{		
						echo $_FILES['userfile']['error'][$i]; 
					}
				} 
				else
				{
					if(!empty($userfile))
					{  
						if($file_size>"0" and $file_size<$max_file_size)
						{
							if (file_exists("$path/$userfile")) {exit("<p class='error'>Файл с таким именем уже существует на сервере! Измените имя на другое!<p>");}
							if (!preg_match("/^[a-z0-9\.\-_]+\.(jpg|gif|png|jpeg)+$/is",$userfile)) {exit("<p class='error'>Запрещено использовать РУССКИЕ буквы и пробелы в имени файла изображения!</p>");}
							$findtchka=substr_count($userfile, "."); if ($findtchka>1) {exit("<p class='error'>ТОЧКА встречается в имени файла $findtchka раз(а). Это ЗАПРЕЩЕНО!</p>");
							}
							else
							{
								if(move_uploaded_file($file_temp, ''.$path.'' .$file_name.''))
								{
									$result = mysql_query("SELECT avatar FROM users where username='$username'", $db);                              $row = mysql_fetch_array($result);
                                   if($row['avatar'] != 'no_avatar.gif') {unlink('./img/avatars/'.$row['avatar'].'');}
									mysql_query("UPDATE users SET email='".$emaila."', icq='".$icq."', site='".$site."', city='".$city."', avatar='".$file_name."' WHERE username='$_SESSION[username]'",$db);
									echo "<p>Информация в профиле успешно изменена!<br>Ваша старая аватарка удалена!</p>";
echo '<p>Загрузка новой аватарки успешно завершена!</p>'; echo '<p><b>Информация о загруженном аватаре:</b></p><ul><li>Имя загруженного файла: '.$userfile.'</li><li>Новое имя файла: '.$file_name.'</li><li>Тип файла: '.$file_type.'</li><li>Размер файла: '.$file_size.'</li><li>Путь к временному файлу: '.$file_temp.'</li><li>Ошибок в файле: '.$file_err.'</li></ul>'; echo "<html><head><meta http-equiv='Refresh' content='5; URL=member.php?do=editaccount'></head></html>"; } else{ echo '<h3>Ошибка загрузки!</h3>'; } } } else{exit("Неправильный размер изображения в байтах");} } } } else { mysql_query("UPDATE users SET email='$emaila', icq='$icq', site='$site', city='$city' WHERE username='{$_SESSION["username"]}'"); echo "<p class='error'>Информация изменена!</p>"; echo "<html><head><meta http-equiv='Refresh' content='0; URL=member.php?do=editaccount'></head></html>"; } } } }

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

Затем идет множество проверок для введенных при редактировании данных. Формат номера ICQ задается целыми цифрами в количестве от 8-ми до 9-ти. В названии города нельзя использовать латинские буквы, только Кирилица! Поля icq, сайт и город необязательны для заполнения.

Основной обработчик срабатывает только при ложном условии: $_SESSION["loged"] != "yes". В нем в самом начале проверяется два условия. Реализовано в виде вложенного цикла if. Если кнопка с именем edit нажата(т.е. переменная пришла в обработчик), то проверяем наличие флажка upload2. Внутри этого цикла производиться обработка для загрузки файла: инициаализация глобального массива $_FILES и его переменных, проверка типа файла, его габаритов, размера в байтах, ошибок в нем. Если их нет и непустое значение $userfile, то дополнительно проверяем наличие одноименного файла, хотя поидее его недолжно быть поскольку каждый раз генериркется уникальное число, формирующее новое имя. Также внутри цикла я добавил проверку в имени русских букв и запрет на использовании точек в имени файла. Если все отлично, то загружаем файл функцией move_uploaded_file() и выводим радостное сообщение. После чего делаем необходимый запрос с извлечением имени текущей(старой) аватарки пользователя и удаляем её. И только затем производим обновление в таблице users всех данных, изменения в которых были произведены. После чего перенаправляем пользователя на обновленную страницу редактирования профиля.

В случае отсутствия пришедшей из формы переменной upload2 мы просто обновляем все поля в таблице users без процедуры обновления аватарки


mysql_query("UPDATE users SET email='$emaila', icq='$icq', site='$site', city='$city' WHERE username='{$_SESSION["username"]}'");

Да, и не забудьте обновить данные в таблице users.

Вот и всё. Можете начинать делать. Если есть вопросы, пишите в комментарии.
Желаю удачи!

PS: Следующий урок посвящу форматному(красивому) выводу даты добавления комментария и регистрации пользователя. А также выводу его конфиденциальной информации(город и дата регистрации) в блок комментариев.

Комментировать

Автор: admin | Добавлена: 28.04.2009 | Просмотров: 8018
Рейтинг: 33 | Голосов: 7

Оцените заметку: 1 2 3 4 5

Последние обновления в категории: PHP-кодинг

Комментарии (0)

Комментариев пока нет!

Только авторизованные пользователи могут добавлять комментарии. Зарегистрироваться.

Логин:
Пароль:
 

Регистрация

: Тема:

Заметок в базе: 56
Комментариев: 0
Всего юзеров: 114
Сейчас онлайн: 1