-
Урок 14. Регистрация и авторизация пользователей. Часть первая. Скрываем контент.
Август 31st, 2008 189 КомментариевОбычно при создании сайта у многих программистов возникает вопрос: «Как осуществить регистрацию пользователей?». Регистрация позволяет получить достаточно большую аудиторию, которая периодически будет заходить на ваш ресурс. Но как же заставить человека заполнить несколько полей? Это первая задача, для решения которой многие владельцы сайтов или порталов закрывают свой контент от незарегистрированных пользователей. Чаще всего это варез, музыка, и прочие файлы, которые заставляют человека зарегистрироваться и получить доступ к необходимому контенту.
В зависимости от направленности вашего ресурса, будь то портал или небольшой сайт, необходимо понять какого типа будет регистрация. Также обязательно должна присуствовать авторизация пользователей. В этом уроке мы рассмотрим решение данной задачи.Детали
Чтобы в дальнейшем было понятно, набросаем небольшой план того, с чем нам придется ознакомиться в этом уроке:
- Создание таблицы пользователей в БД MySQL.
- Создание формы и скрипта регистрации. Проверка вводимых данных на корректность. Защита от ботов (капча) . Отправка на почту заявки на подтверждение регистрации.
- Авторизация пользователей. Проверка на присутствие в системе. Использование механизма сессий.
Регистрация пользователя
Перед тем как начинать писать первые строки кода, необходимо создать таблицу , в которой мы будем хранить данные о пользователях. На этом этапе необходимо определиться с тем, какого формата будет наш аккаунт. Если это будет простой профиль без всяких аватаров, описаний, и тд, используем следующую структуру:
- id – идентификатор пользователя в таблице.Используем атрибут auto_increment , который позволит при регистрации нового пользователя увеличивать идентификатор на одну единицу.Тип данных INT.
- nick – ник вводимый пользователем при регистрации. Тип данных VARCHAR
- password – пароль пользователя а шифрованном виде. Тип данных VARCHAR.
- email – адрес электронной почты. Тип данных VARCHAR
- uniq_id – уникальный id пользователя. Формируется на момент регистрации и высылается по почте для подтверждения статуса. Тип данных VARCHAR
- status – статус пользователя. Имеет значение 0 или 1. Единицу получает после подтверждения регистрации.Тип данных INT
- date – дата регистрации. Тип данных INT
- last_date -дата последнего визита. Тип данных INT
Если же профиль пользователя будет более продвинутый, то необходимо добавить несколько полей:
- id – идентификатор пользователя в таблице.Используем атрибут auto_increment , который позволит при регистрации нового пользователя увеличивать идентификатор на одну единицу.Тип данных int.
- nick – Ник вводимый пользователем при регистрации. Тип данных VARCHAR
- password – пароль пользователя а шифрованном виде. Тип данных VARCHAR.
- email – Электронный адрес. Тип данных VARCHAR
- *icq – Номер аськи. Тип данных INT
- *avatar – название изображения аватара.
- *description – характеристика/описание. Тип данных TEXT.
- *town – Город пользователя.
- *site – Сайт если есть.Тип данных VARCHAR;
- uniq_id – уникальный id пользователя. Формируется на момент регистрации и высылается по почте для подверждения статуса. Тип данных VARCHAR;
- status – Статус пользователя. Имеет значение 0 или 1. Единицу получает после подтверждения регистрации.Тип данных INT.
- date – Дата регистрации. Тип данных INT
- last_date -Дата последнего визита. Тип данных INT.
В своем примере можете увеличить количество полей по необходимости. Я лишь привел наглядный пример того, что может содержать расширенный профиль.
Теперь для того чтобы создать создать таблицу users, необходимо открыть PhpMyAdmin. И в соответствии с требованием к профилю выполните запрос 1 или 2.
SQL-запрос для первого варианта:
CREATE TABLE `users` (
`id` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nick` VARCHAR( 30 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL,
`email` VARCHAR( 50 ) NOT NULL ,
`uniq_id` VARCHAR( 50 ) NOT NULL ,
`status` INT( 1 ) NOT NULL ,
`last_date` INT( 8 ) NOT NULL ,
`date` INT( 8 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAMSQL-запрос для второго варианта:
CREATE TABLE `users` (
`id` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nick` VARCHAR( 30 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL,
`email` VARCHAR( 50 ) NOT NULL ,
`icq` VARCHAR( 10 ) NOT NULL ,
`avatar` VARCHAR( 50 ) NOT NULL ,
`description` TEXT NOT NULL ,
`town` VARCHAR( 20 ) NOT NULL ,
`site` VARCHAR( 50 ) NOT NULL ,
`uniq_id` VARCHAR( 50 ) NOT NULL ,
`status` INT( 1 ) NOT NULL ,
`last_date` INT( 8 ) NOT NULL ,
`date` INT( 8 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAMНапоминаю что таблицу необходимо создать внутри базы данных. Не путайте базу и таблицу. Специально приведу скриншоты для полной ясности.
В моем случае была использована база данных test. Когда вы перешли в базу данных, необходимо выбрать вкладку SQL. И вставить соответствующий запрос. Если все выполнено правильно, то браузер отобразит следующее:
Теперь когда создана таблица мы можем приступать к программированию пользовательской части.
Форма регистрации
Наверняка каждый из вас не раз проходил регистрацию и знает как неохота заполнять большое количество полей. Я предлагаю пойти на встречу пользователям и использовать только те данные, которые необходимы для осуществления регистрации: Ник пользователя, адрес электронной почты и пароль. Все остальное (если профиль будет расширенным) мы сможем изменить в личном кабинете.
registration.php
По умолчанию форма регистрации состоит из нескольких полей и изображения кода потверждения. Скрипт простой капчи мы рассматривали недавно, это был урок по отправке почты. Я целиком продублирую фрагмент кода, отвечающего за построение капчи и буду использовать в этом примере.1
2
3
4
5
6
7
8
9
10session_start();
@include("config.inc.php");
@include("functions.inc.php");
//Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');Стандартно начинаем наш скрипт с подключения необходимых функций и конфигов, а также старта сессии.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31if(!$_POST['do'] OR $_POST['do'] =='') {
//Генерируем шестизначный ключ для капчи
if($_SESSION['uid'] =='') { $_SESSION['uid'] = mt_rand(100000,999999); }
//Выводим форму
echo '';
echo'
<form method="POST">';
echo 'Желаемый ник:
<input name="nick" type="text" />
';
echo 'Пароль:
<input name="pass" type="password" />
';
echo 'Ещё раз пароль:
<input name="rpass" type="password" />
';
echo 'Эл.адрес
<input name="mail" type="text" />
';
echo '<img src="img/capcha.php?sid='.$_SESSION['uid'].'" alt="" />
<input name="sid" type="text" />
';
echo '
<input name="do" type="submit" value="зарегистрировать" />';
echo '</form>';
}В этом фрагменте используем стандартное условие, которое определяет была ли нажата кнопка. Внутри проверяем наличие сессии с именем $_SESSION['uid'] . Если его не существует, генерируем значение функцией mt_rand() в диапазоне от 100000 до 999999. Далее отображаем форму ввода данных и картинку с кодом подтверждения.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70//Если данные отправлены
if($_POST['do'] !='') {
//Начинаем проверять входящие данные
if($_POST['sid'] == $_SESSION['uid']) {
//Создаем запрос к базе для проверки существования Пользователя
$nick = $_POST['nick'];
@mysql_query("SELECT * FROM users WHERE nick='".strtolower($nick)."'");
//Проверка результата запроса
if(mysql_affected_rows()==0) {
//Проверка ввведенных паролей
if($_POST['pass'] !='' AND $_POST['rpass'] !='' AND $_POST['pass'] === $_POST['rpass']){
//Проверяем на валидность электронный адрес
if(checkmail($_POST['mail']) !== -1) {
//Осуществляем регистарацию
//Генерируем uniq_id
$uniq_id = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].mktime());
$pass = $_POST['pass'];
$email = $_POST['mail'];
//Создаем запрос для записи данных в БД
$r = @mysql_query("INSERT INTO users VALUES(NULL,'".strtolower($nick)."','".md5($pass)."','".$email."','".$uniq_id."',0,'".date("dmY")."','".date("dmY")."')");
//После запроса отправляем письмо юзеру, для активации аккаунта
if($r) {
// Для отправки e-mail в виде HTML устанавливаем необходимый mime-тип и кодировку
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";
// Откуда пришло
$headers .= 'From:Сайт %sitename%' . "\r\n";
//Здесь укажите электронный адрес, куда будут уходить сообщения
$mailto = $email;
$subject = "Подтверждение регистарции на сайте";
$message = 'Для активации аккаунта пройдите по следующей ссылке <a href="http://АДРЕС_САЙТА/registration.php?</p> <p>activation='.$uniq_id.'" target="_blank">http://АДРЕС_САЙТА/registration.php?activation='.$uniq_id.'</a>';
$message .= 'или скопируйте ссылку в окно ввода адреса браузера и нажмите enter.';
//Отправляем сообщение
if(sendmail($mailto,$subject,$message,$headers) !== FALSE) {
echo 'Регистрация завершена, на введеный Вами e-mail было отправлено сообщение для активации аккаунта';
}
else {echo 'Регистрация невозможна: Повторите запрос позднее';}
}
else {echo 'Регистрация невозможна: Повторите запрос позднее';}
}
else {echo 'Регистрация невозможна: Электронный адрес должен соответствовать шаблону <strong>name@domen.com</strong>
<a></a>
<a> </a>
<a>href="registration.php"/>назад</a>';}
}
else {echo 'Регистрация невозможна: Введенные пароли не совпадают
<a href="registration.php"></a>назад';}
}
else { echo 'Регистрация невозможна: Пользователь с таким именем уже существует
<a href="registration.php"></a>назад';}
session_destroy();
}
else { echo 'Регистрация невозможна: код подтверждения введен не верно
<a href="registration.php"></a>назад';}
}Это наш главный блок, который производит проверку введенных данных. Помимо проверки электронного адреса на валидность и кода подтверждения, создается запрос , проверяющий наличие ник-нейма в базе. В случае совпадения выводим сообщение о том, что юзер с таким именем существует.Здесь я немного сократил запрос, а точнее записал в компактной форме, т.е.:
@mysql_query(«SELECT nick FROM users WHERE nick=’».$nick.»‘»);
ЗАПРОС(«ВЫБРАТЬ nick ИЗ users ГДЕ nick = $nick»);После выполнения запроса функцией mysql_affected_rows() узнаем количество затронутых рядов. Если в таблице уже есть юзер с таким ником, то мы просто выводим соответсвующее сообщение. Если же совпадения не найдены, переходим к проверке паролей. Ни одно заполняемое поле не должно быть пустым, особенно пароли.
Далее проверяем электронный адрес на валидность. Если условие возвращает TRUE, то переходим непосредственно к регистрации пользователя.
Так как мы используем регистрацию с активацией профиля, нам необходимо сгенерировать уникальный идентификатор пользователя. Он будет состоять из его IP-адреса, типа браузера и значения возвращаемые функцией mk_time(). Склеяв данные в одну строку мы закодируем её функцией md5().Создаем запрос для записи значений в БД.
Так как простые манипуляции с БД MySQL мы разобрали в 6 уроке , этот фрагмент не вызовет у вас проблем. Единственное стоит обратить на то какие данные вносятся в БД. Здесь status обязательно равен 0. Далее создаем условие, котрое проверяет результат этого запроса. Если запрос был обработан, необходимо составить сообщение и отправить на введенный электронный адрес ссылку с активацией.
Функцию по отправке почты советую взять из недавнего урока. Сообщение компонуем из $subject – темы письма, $message – самого сообщения и заголовков $headers.
$message содержит ссылку, которая ведет на registration.php и передает GET-параметром уникальный идентификатор сгенерированный выше. Что произойдет когда пользователь перейдет по ссылке мы рассмотрим ниже.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18</p>
//Модуль отвечающий за активацию аккаунта
if($_GET['activation'] AND $_GET['activation']!='') {
$uniq_id = $_GET['activation'];
//Создаем запрос
$r=@mysql_query("UPDATE users SET status=1 WHERE uniq_id='".$uniq_id."' AND status=0");
if($r) {echo '
<h2>Ваша учетная запись активирована.</h2>
Теперь вы можете <a href="index.php">войти на сайт</a> используя данные
указанные при регистрации';}
else {echo 'Активация невозможна: профиль уже активирован';}
}
?>Хочу обратить внимание на то что при отправке письма мы не передавали не имя пользователя , ни пароля. Это дополнительная безопасность, которая исключит похищение данных от аккаунта в случае взлома почты или других непредвиденных ситуаций. Поэтому мы будем полностью опираться на уникальный идентификатор пользователя.
Создавая запрос мы устанавливаем status равный единице, пользователю у которого соответствующий uniq_id и статус равный нулю. Если запрос был выполнен, выводим сообщение об успешной активации. Теперь юзер может использовать свои данные для авторизацииАвторизация пользователя.
Так как многие от авторизации преследует одну цель, то мы разберем вариант, когда не авторизованный пользователь не имеет доступа к странице.
Сам принцип авторизации достаточно простой и применим к небольшим проектам. Главная особенность – это работа с сессиями, проверка их существования и сверка с данными из БД.
По умолчанию я буду использовать страницу index.php, на которой будет что-либо скрыто.index.php
1
2
3
4
5
6
7
8
9session_start();
//Поключаем конфиг
include("config.inc.php");
//Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');Вначале инициализируем сессию, подключаем файл конфигурации и подключаемся к БД MySQL.
1
2
3
4
5
6
7
8
9
10
11
12//Если нет сессий
if(md5(crypt($_SESSION['user'],$_SESSION['password'])) != $_SESSION['SID']) {
//Если кнопка не нажата, отображаем форму
if(!$_POST['do']){
echo '
<form method="post"> <input name="login" type="text" />
<input name="password" type="password" />
<input name="do" type="submit" value="Войти" /> </form>';
}Этот фрагмент содержит условие, которое особым принципом сверяет сессии содержащие имя пользователя $_SESSION['user'] и пароль $_SESSION['password'] с идентификатором сессии $_SESSION['SID']. Если они не равны переходим к стандартному условию, проверющее действие пользователя, а точнее отправку данных. Если кнопка не была нажата – отображаем форму ввода логина и пароля.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25//Если кнопка нажата
if($_POST['do']) {
//Проверяем данные
$login = $_POST['login'];
$upass = $_POST['password'];
if($login !='' AND $upass !='') {
//Создаем запрос
$q1=mysql_query("SELECT * FROM users WHERE nick='".$login."' AND password='".md5($upass)."' AND status=1");
//Проверяем существует ли хоть одна запись
if(mysql_num_rows($q1)===1) {
//Если есть, то создаем сессии и перенаправляем на эту страницу
$r=mysql_fetch_array($q1);
$_SESSION['user'] = $r['nick'];
$_SESSION['password'] = $r['password'];
$_SESSION['SID'] = md5(crypt($r['nick'],$r['password']));
@Header("Location: index.php");
}
else {echo 'Неверный логин/пароль; Возможно Ваш аккаунт не активирован';}
}
}
else {echo 'Введите данные';}
}Как видите следующий фрагмент производит проверку введенных данных. Далее мы создаем запрос, в котором выбираем все значения где nick= $login и password=$upass и статус РАВНЫЙ 1. Если функция mysql_num_rows вернула значение равное еденице, то это означает что пользователь с такой связкой логин+пароль существует, поэтому мы задаем имя сессий и присваиваем им соответсвующие значения.Далее при помощи функции crypt() задаем $_SESSION['SID']. После этого, уже с ЗАДАННЫМИ сессиями делаем редирект на главную страницу при помощи функции header().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22else {
$q2 = @mysql_query("SELECT * FROM users WHERE nick='".$_SESSION['user']."' AND password='".$_SESSION['password']."' AND status=1");
if(@mysql_num_rows($q2)==1){
$r2 = @mysql_fetch_array($q2);
echo 'Вы: '.ucfirst($r2['nick']).'
';
echo '<a href="index.php">главная</a> ';
echo '<a href="index.php?page=downloads">загрузки</a>
';
if($_GET['page'] !='') {
@include("tpl/".$_GET['page'].".php");
}
else { @include("tpl/default.php");}
echo '
<a href="index.php?exit=1">выход</a>';
}
}Этот фрагмент кода срабатывает после редиректа, когда
md5(crypt($_SESSION['user'],$_SESSION['password'])) == $_SESSION['SID'].
Вначале обязательно проверяем данные переданные в сессиях с данными в базе. Если пользователь произвел активацию, то выводим данные о нем и далее любой произвольный код. Пусть для примера в этом фрагменте будут инклудироваться шаблоны. Чтобы это сделать, создаем условие проверяющее $_GET['page']. Например можно создать ссылку index.php?page=downloads, нажав на которую мы получим в $_GET['page'] значение downloads, следовательно подгружаем шаблон из папки tpl с именем downloads.phpТолько в таком варианте строго запрещается инклудировать GET данные напрямую. Создайте дополнительную проверку $_GET['page'].
1
2if($_GET['exit']) {@session_destroy(); unset($_GET['exit']); mysql_close($link); @Header("Location: index.php");}
?>Если вы заметили, то в предыдущем фрагменте есть ссылочка index.php?exit=1. Если $_GET['exit'] существует, то мы уничтожаем сессию , стираем $_GET['exit'], закрываем соеденение с БД и делаем редирект на главную. Это позволит качественно «отлогиниться».
Шаблоны.
Файлы шаблонов будут лежать в папке tpl на сервере, поэтому не забудьте её создать и поместить в неё шаблон, который грузиться по умолчанию.
default.php1
2
3
4echo 'Этот текст будет отображаться по умолчанию.
В шаблоне можно использовать любой код. Все шаблоны должны иметь расширение php';
?>Файл конфигурации.
Файл конфигурации содержит в себе необходимые данные для подключения к БД.
config.inc.php1
2
3
4
5
6
7
8
9
10</p>
//Сервер, в большинстве случаев менять не требуется
$DBSERVER = "localhost";
//Пользователь и пароль
$DBUSER = "root";
$DBPASS = "12345678";//Ваш пароль
//База данных
$DB = "test";
?>Файл функций
Файл содержит 2 функции. Первая для проверки e-mail’а на корректность, а вторая для отправки почты. Как они работают описано в этом уроке.
functions.inc.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20function checkmail($mail) {
// режем левые символы и крайние пробелы
$mail=trim($mail); // функцию pregtrim() возьмите выше в примере
// если пусто - выход
if (strlen($mail)==0) return -1;
if (!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,2}+([a-z0-9_-]){0,5}@(([a-z0-9-]+\.)+(com|net|org|mil|".
"edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
"9]{1,3}\.[0-9]{1,3})$/is",$mail))
return -1;
return $mail;
}
function sendmail($mail,$subject,$message,$headers) {
if(mail($mail,$subject,$message,$headers)) { return TRUE;}
else {return FALSE;}
}
?>Скрипт регистрации и авторизации на сайте.
Готовый вариант того что в итоге получилось, можно посмотреть ЗДЕСЬ.
regandauth.zip – исходники для изучения и тестирования.
Заключение
Вот такой простой алгоритм позволит создать простенькую защиту ваших страниц от неавторизованных юзеров. Страницей по умолчанию как раз может быть профиль юзера, позволяющий сменить настройки и тд. В этом уроке я не стал использовать фильтрацию входящих данных , я хочу чтобы вы сделали это самостоятельно (можете обратиться к этому уроку), могу лишь дать несколько советов:
- Переменные, которые учавствуют в запросе ЗАПРЕЩАЕТСЯ ПЕРЕДАВАТЬ
напрямую без фильтрации, поэтому если будете использовать этот вариант
как основу, советую хорошенько поработать над ним, чтобы в итоге
избежать sql-иньекций. - Переменную $_GET['page'] , которая отвечает за имя шаблона ЗАПРЕЩАЕТСЯ
ПЕРЕДАВАТЬ напрямую функции include(). Поэтому либо используйте функцию
ctype_alpha, либо создайте массив $pages[], в котором будут описаны
имена всех ваших шаблонов.
В следующей части рассмотрим вариант с расширенным профилем.
Что бы Ктулху не воскрес, подпишись на RSS!189 Responses to “Урок 14. Регистрация и авторизация пользователей. Часть первая. Скрываем контент.”
Страниц: [19] 18 17 16 15 14 13 12 11 10 9 … 1 » Show All
Страниц: [19] 18 17 16 15 14 13 12 11 10 9 … 1 » Show All
Leave a Reply



Февраль 5th, 2010 at 02:07
Зравствуйте Александр.
Помогите чайнику в браузере пишет:
Warning: mysql_connect(): Unknown MySQL Server Host ‘localhost03′ (11004) in c:\apache_swissknife\сайты\localhost03\galaxy-s\registration\index.php on line 6
Не могу подключиться
У меня получается вот эта строка шестой.
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
как исправить что делать?
Февраль 3rd, 2010 at 10:40
Проблему решил.
Оказывается необходимо указать полный путь в файле capcha.php к файлу со шрифтом:
ImageTtfText($im, 23, mt_rand(-5,5), 3, 30, $color, «/home/user/www/img/addict.ttf», $_SESSION['uid']);
тогда все работает.
Февраль 2nd, 2010 at 17:45
Доброго времени суток!
очень хорошая статья, я как то пользовался этим примером и была у меня таже самая проблема что и сейчас не выводится капча – нет картинки. поддержка GD2 включена.
Январь 27th, 2010 at 21:13
требуется много времени до того как появится ответная страница после регистрации
«Регистрация завершена, на введеный Вами e-mail было отправлено сообщение для активации аккаунта»
Ума не приложу, в чем может быть проблема, может быть с sendmail МТА ??
Январь 27th, 2010 at 21:04
Здравствуйте Александр ! Отличный урок ! Я не сильно хорошо разбираюсь во всем этом, У меня не отправляется на емайл .
У меня на сервере стоит приложение Аsterisk, при работе голосовой почты как напоминание отправляется письмо , и все работает. Почему в Случае этого урока не отправляется письмо ??
у меня ubuntu 8 apache2 mysql5 php5 может дело в версиях или … ?
Январь 17th, 2010 at 03:26
Здравствуйте! Хорошая статья, все доступно изложено. Но я заметил одну проблему: после авторизации и входа на сайт, приходится нажимать два раза кнопку Выход чтобы выйти. В комментах этот вопрос был, но ответа не нашел. В чем может быть проблема? Пробовал переделать, но ни к чему не привело. Если не трудно, скиньте пожалуйста вариант работающий на http://freshcoder.ru/example/14/ Спасибо!
Январь 16th, 2010 at 19:42
Люди добрые помогите ! SOS !
капча не работает , в окне регистрации нету рисунка , если на нее нажать то сообщение :
Fatal error: Call to undefined function ImageCreateFromJpeg() in /var/www/img/capcha.php on line 5
Заранее благодарен
Январь 15th, 2010 at 22:31
Здравствуйте Александр!!!У меня есть вопрос вот я установил скрипт казино я начинаю регестрироваться мне на емайл пришла сылка для активации акаунта я по ней перехажу а мне пишет «»Неверный код, или аккаунт уже был активирован!»",подскажите пожайлуста в чем проблема как изменить ее.Зарание большое спасибо! Если что вот моя ICQ 599-719-538
Январь 9th, 2010 at 13:45
@Регистрация невозможна: Повторите запрос позднее@ КТОНИТЬ МОЖЕТ ВНЯТНО ОБЬЯСНИТЬ В ЧЕМ ПРОБЛЕМА?