В связи с этим меня траблы ) с проверкой на присутствие пользователя в сети. Я создал в базе пользователей поле active = 0 / 1. Но когда пользователь онлайн, второго пропускает без проблем, пишет, что active = 0, хотя в базе я проверял стоит 1. Если очищаем куки и историю в браузере он не пропускает, видя, что пользователь онлайн, а второй вход без проблем пропускает! Как быть?
$check_exists = mysql_query("SELECT * FROM users WHERE login='$login'");
$myrow2=mysql_fetch_assoc($check_exists);
if ($myrow2['active']=='1'){
unset($_SESSION['login']);
unset($_SESSION['password']);
unset($_SESSION['id']);
setcookie("auto", "", time()+9999999);//очищаем автоматический вход
//already logged in elsewhere
exit("Данный логин не может использоваться на 2-х или более компьютерах!");
}
Спустя 10 минут, 15 секунд (25.04.2011 - 07:41) make.kz написал(а):
Что-то тихо!
Спустя 6 минут, 44 секунды (25.04.2011 - 07:47) Семён написал(а):
Не выйдет, гиблая затея.
Спустя 3 минуты, 6 секунд (25.04.2011 - 07:50) Trianon написал(а):
Диагностику ошибок следует включить.
$login - определить.
Ошибки исполнения SQL-запросов - проверять.
Прекратитить записывать пароль куда не надо. Это я о $_SESSION['password'].
Тела строк, перед помещением иx в запросы прямым склеиванием - экранировать mysql_real_escape_string()
Это то что видно сразу.
$login - определить.
Ошибки исполнения SQL-запросов - проверять.
Прекратитить записывать пароль куда не надо. Это я о $_SESSION['password'].
Тела строк, перед помещением иx в запросы прямым склеиванием - экранировать mysql_real_escape_string()
Это то что видно сразу.
Спустя 2 минуты, 58 секунд (25.04.2011 - 07:53) DySprozin написал(а):
make.kz
временно убери _все_ обнуления active в коде и посмотри, что будет (;
временно убери _все_ обнуления active в коде и посмотри, что будет (;
Спустя 4 минуты, 11 секунд (25.04.2011 - 07:58) make.kz написал(а):
Цитата (DySprozin @ 25.04.2011 - 04:53) |
make.kz временно убери _все_ обнуления active в коде и посмотри, что будет (; |
Убрал все обнуления, очистил куки и хэш, все работает, но только на первый вход! )) Далее тоже самое, пропускает и все!
Спустя 19 минут, 47 секунд (25.04.2011 - 08:17) make.kz написал(а):
Странно, получается он при первом входе видит 0, закидывает его в куки или хэш и постоянно этот 0 выводит . Может можно его обнулить из куки или хэша, при каждом входе?
Спустя 20 минут, 21 секунда (25.04.2011 - 08:38) Trianon написал(а):
Наверняка у Вас с этим SQL-запросом банальным образом не находится текущий логин. А Вы решили, что дело в поле active.
Включите диагностику ошибок!
Включите диагностику ошибок!
Спустя 11 минут, 14 секунд (25.04.2011 - 08:49) make.kz написал(а):
Цитата (Trianon @ 25.04.2011 - 05:38) |
Наверняка у Вас с этим SQL-запросом банальным образом не находится текущий логин. А Вы решили, что дело в поле active. Включите диагностику ошибок! |
Я проверил, логин находит!
$check_exists = mysql_query("SELECT * FROM users WHERE login='$login'");
$myrow2=mysql_fetch_assoc($check_exists);
echo $myrow2['login']."\n";
echo $myrow2['active']."\n";
if ($myrow2['active']=='1'){
unset($_SESSION['login']);
unset($_SESSION['password']);
unset($_SESSION['id']);
setcookie("auto", "", time()+9999999);//очищаем автоматический вход
//already logged in elsewhere
exit("Данный логин не может использоваться на 2-х или более компьютерах!");
}
Выводит следующее: логин - make.kz, active - 0, хотя в базе стоит 1
Спустя 14 минут, 9 секунд (25.04.2011 - 09:03) make.kz написал(а):
Цитата (Trianon @ 25.04.2011 - 05:38) |
Наверняка у Вас с этим SQL-запросом банальным образом не находится текущий логин. А Вы решили, что дело в поле active. Включите диагностику ошибок! |
Я проверил, логин находит!
$check_exists = mysql_query("SELECT * FROM users WHERE login='$login'");
$myrow2=mysql_fetch_assoc($check_exists);
echo $myrow2['login']."\n";
echo $myrow2['active']."\n";
if ($myrow2['active']=='1'){
unset($_SESSION['login']);
unset($_SESSION['password']);
unset($_SESSION['id']);
setcookie("auto", "", time()+9999999);//очищаем автоматический вход
//already logged in elsewhere
exit("Данный логин не может использоваться на 2-х или более компьютерах!");
}
Выводит следующее: логин - make.kz, active - 0, хотя в базе стоит 1
Спустя 7 минут, 51 секунда (25.04.2011 - 09:11) Trianon написал(а):
Цитата |
Выводит следующее: логин - make.kz, active - 0, хотя в базе стоит 1 |
А вот это уже чушь.
Если трассировка показывает значения из одной и той же строки таблицы - следовательно в базе стоит 0.
Спустя 2 минуты, 58 секунд (25.04.2011 - 09:14) make.kz написал(а):
Цитата (Trianon @ 25.04.2011 - 06:11) | ||
А вот это уже чушь. Если трассировка показыват значения из одной и той же строки таблицы - следовательно в базе стоит 0. |
Я параллельно открыл базу )))) И после входа с одного компа проверил там стоит 1, потом в эту базу зашел с другого ПК, тоже стоит один, но когда ввожу логин и пароль мне выводит 0 ))))) Сам в шоке! ))
Спустя 1 минута, 29 секунд (25.04.2011 - 09:15) Trianon написал(а):
Вам уже предложили убрать все обнуления.
Значит убрали не все.
Значит убрали не все.
Спустя 2 минуты, 6 секунд (25.04.2011 - 09:18) make.kz написал(а):
Да нет там обнулений ))) вы о чем господа. При проверке на логин, он же должен видеть 1 в выбранной строке из MySQL базы
Спустя 5 минут (25.04.2011 - 09:23) make.kz написал(а):
Вот он полный код! Проверка работает после очистки куки и хэша! а после первого вывода результата пропускает
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 (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); //останавливаем выполнение сценариев
}
//если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);
// дописываем новое********************************************
// подключаемся к базе
// минипроверка на подбор паролей
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//удаляем ip-адреса ошибавшихся при входе пользователей через 15 минут.
$result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'");// извлекаем из базы колличество неудачных попыток входа за последние 15 минут у пользователя с данным ip
$myrow = mysql_fetch_array($result);
if ($myrow['col'] > 2) {
exit ("Вы набрали логин или пароль неверно 3 раза. Подождите 15 минут до следующей попытки."); //останавливаем выполнение сценариев
}
$password = md5($password);//шифруем пароль
$password = strrev($password);// для надежности добавим реверс
$password = $password."b3p6ftnemusorp";
//можно добавить несколько своих символов по вкусу, например, вписав "b3p6f". Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет. Но советую ставить другие символы, можно в начале строки или в середине.
//При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера.
$result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='$password'"); //извлекаем из базы все данные о пользователе с введенным логином
//мы дописали «AND activation='1'», то есть пользователь будет искаться только среди активированных. Желательно добавить это условие к другим подобным проверкам данных пользователя
$myrow = mysql_fetch_array($result);
if (empty($myrow['id']))
{
//если пользователя с введенным логином и паролем не существует,то записываем ip пользователя и с датой ошибки
$select = mysql_query ("SELECT ip FROM oshibka WHERE ip='$ip'");
$tmp = mysql_fetch_row ($select);
if ($ip == $tmp[0]) {
//проверяем, есть ли пользователь в таблице "oshibka"
$result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'");
$myrow52 = mysql_fetch_array($result52);
$col = $myrow52[0] + 1;//Если есть,то приплюсовываем количесво
mysql_query ("UPDATE oshibka SET col=$col,date=NOW() WHERE ip='$ip'");
}
else {
//если за последние 15 минут ошибок не было, то вставляем новую запись в таблицу "oshibka"
mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'1')");
}
exit ("Извините, введённый вами логин или пароль неверный."); //останавливаем выполнение сценариев
}
else {
//если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел!
$_SESSION['password']=$myrow['password'];
$_SESSION['login']=$myrow['login'];
$_SESSION['id']=$myrow['id'];
//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь
//Далее мы запоминаем данные в куки, для последующего входа.
//ВНИМАНИЕ!!! ДЕЛАЙТЕ ЭТО НА ВАШЕ УСМОТРЕНИЕ, ТАК КАК ДАННЫЕ ХРАНЯТСЯ В КУКАХ БЕЗ ШИФРОВКИ
//Если пользователь хочет, чтобы его данные сохранились для последующего входа, то сохраняем в куках его браузера
setcookie("login", $_POST["login"]);
//setcookie("password", $_POST["password"]);
setcookie("id", $myrow['id']);
if (isset($_POST['autovhod'])){
//Если пользователь хочет входить на сайт автоматически
setcookie("auto", "yes");
setcookie("login", $_POST["login"]);
//setcookie("password", $_POST["password"]);
setcookie("id", $myrow['id']);}
}
$check_exists = mysql_query("SELECT * FROM users WHERE login='$login'");
$myrow2=mysql_fetch_assoc($check_exists);
if ($myrow2['active']=='1'){
unset($_SESSION['login']);
unset($_SESSION['password']);
unset($_SESSION['id']);
setcookie("auto", "", time()+9999999);//очищаем автоматический вход
//already logged in elsewhere
exit("Данный логин не может использоваться на 2-х или более компьютерах!");
}
$active = mysql_query("UPDATE users SET active='1' WHERE login='$_SESSION[login]'");
if($active ==FALSE){
exit(mysql_error());
}
echo "<html><head><meta http-equiv='Refresh' content='0; URL=cabinet.php?id=$_SESSION[id]'></head></html>";
//перенаправляем пользователя на главную страничку, там ему и сообщим об удачном входе