Код (Text): <?php if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } $n = "3"; //заносим введенный пользователем пароль в переменную $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); require ("config/bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь // минипроверка на подбор паролей $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) > 600");//удаляем ip-адреса ошибавшихся при входе пользователей через 15 минут. $result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);// извлекаем из базы колличество неудачных попыток входа за последние 15 минут у пользователя с данным ip $myrow = mysql_fetch_array($result); if ($myrow['col'] > 4) { //если таковых попыток больше трех, то выдаем сообщение. exit("<br><h2><big><center>Вы набрали логин или пароль неверно 5 раз. Подождите 10 минут до следующей попытки.</center><big><h2>"); } $password =base64_encode(hash('whirlpool', $password, true) ); //можно добавить несколько своих символов по вкусу, например, вписав "b3p6f". Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет. Но советую ставить другие символы, можно в начале строки или в середине. //При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера. $result = mysql_query("SELECT * FROM accounts WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином $myrow = mysql_fetch_array($result); if (empty($myrow['password'])) { //если пользователя с введенным логином и паролем не существует,то записываем 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'",$db); $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 ("<br><h2><big><center>Извините, введённый вами логин или пароль неверный. Доступно всего 5 попытки.<br> Количество неудачных попыток: <big>$col</big><br><br><a href='/index.php'> Назад</a> <p> <br> <a href='reg.php'>Зарегистрироваться</a> <br> <a href='send_pass.html'>Забыли пароль?</a> </p></form> </center><big></h2>"); } else { //если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел! $_SESSION['password']=$myrow['password']; $_SESSION['login']=$myrow['login']; $_SESSION['id']=$myrow['id'];//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь //Далее мы запоминаем данные в куки, для последующего входа. //ВНИМАНИЕ!!! ДЕЛАЙТЕ ЭТО НА ВАШЕ УСМОТРЕНИЕ, ТАК КАК ДАННЫЕ ХРАНЯТСЯ В КУКАХ БЕЗ ШИФРОВКИ if (isset($_POST['save'])){ //Если пользователь хочет, чтобы его данные сохранились для последующего входа, то сохраняем в куках его браузера setcookie("login", $_POST["login"], time()+9999999); setcookie("password", $_POST["password"], time()+9999999);} } echo "<center><big><h2><big>ЛИЧНЫЙ КАБИНЕТ<br><br><br>Добро пожаловать, ".$_SESSION['login']."<br><br> ?> Каждый раз создаются новые записи вместо добавления к уже существующей: Код (Text): 213.138.80.2 1.2.2015 21:15:16 1 213.138.80.2 1.2.2015 21:15:11 1 213.138.80.2 1.2.2015 21:12:52 1 213.138.80.2 1.2.2015 21:12:53 1 213.138.80.2 1.2.2015 21:15:22 1 213.138.80.2 1.2.2015 21:15:23 1 Что может быть?
На 86 строчке нет такой переменной, что-то не совпадает. Notice это не ошибка, а уведомление что переменная не объявлена, но её используют. По отладке всё понятно? phpfaq.ru/debug
Проверьте, почему у вас не выполняется условие на строке 54 Код (Text): if ($ip == $tmp[0]) { Как выясните, думаю всё получится И бросьте учитить PHP по этому гавнокоду десятилетней давности. Учите сразу Yii или Laravel
Переменная не была объявлена на 71 строке, поправил. Но это к делу не относится. В базе вместо UPDATE уже существующей записи, добавляется новая.
Начиная с Yii или Laravel как он сможет читать их исходники, если даже свои ещё осваивает. R2ndom, сколько ещё будешь игнорировать, умеешь делать отладку кода?
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/c/cg42771/public_html/app/lc.php on line 34 Добавлено спустя 40 секунд: не умею но рекомендации тут http://phpfaq.ru/debug толковые. Добавлено спустя 5 минут 51 секунду: и на 54 тоже самое
Попробуй переписать этот код с нуля, но проверяя каждое действие и смотри результат. Советую прочитать книгу по php, многое можно сделать было лучше. По поводу ошибки, посмотри документацию mysql_fetch_array(), ты первым аргументом функции должен был передать ресурс, но передал boolean, думаю что mysql_query вернула false, вместо результата запроса.
да Добавлено спустя 6 минут 11 секунд: Выставил error_reporting(E_ALL); ошибок нет ни на локальном ни на хосте, на локальном работает, а на хосте нет(( Добавлено спустя 3 минуты 1 секунду: на локальной машине в таблице: Код (Text): INSERT INTO `oshibka` VALUES ('127.0.0.1', '2015-2-1 22:26:55', 4); на хосте: Код (Text): INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:04', 1); INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:08', 1); INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:10', 1); INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:31', 1); скрипты идентичны
Из инструкции по отладки проверь каждую переменную и каждое условие if, проследи за компьютером и перепроверь всё что он делает
как его проверить то? Код (Text): if ($ip == $tmp[0]) { //проверяем, есть ли пользователь в таблице "oshibka" $result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db); $myrow52 = mysql_fetch_array($result52); $col = $myrow52[0] + 1;//Если есть,то приплюсовываем количесво mysql_query ("UPDATE oshibka SET col=$col, date=NOW() WHERE ip='$ip'") or trigger_error(mysql_error().$query); mysql_error(); }
чо? не надо его отключать. надо 1) экранировать данные, попадающие в SQL запрос 2) не тащить в рот что попало. зачем ты в своем коде использовал HTTP_X_FORWARDED_FOR ? что там?
Перерыл все, ни чего не помогает(( По совету разделил по блокам проверил все условия. Заносим введенные пользователем логин и пароль в переменные $login, если он пустой, то уничтожаем переменные: Код (Text): if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } // if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } Если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт Код (Text): if (empty($login) or empty($password)) { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); } Экранируем вводимые данные Код (Text): $login = stripslashes($login); $login = htmlspecialchars($login); $password = stripslashes($password); $password = htmlspecialchars($password); $login = trim($login); $password = trim($password); Подключаюсь к базе, извлекаем ip, удаляем ip адреса тех кто ошибался позже 600сек Код (Text): include ("config/bd.php"); mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 600"); Получаем количество неудачных попыток с данным ip, если их больше 4-х выводим сообщение Код (Text): $result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db); $myrow = mysql_fetch_array($result); if ($myrow['col'] > 4) { exit("<br><h2><big><center>Вы набрали логин или пароль неверно 5 раз. Подождите 10 минут до следующей попытки.</center><big><h2>"); } Получаем данные о введенном пользователе Код (Text): $password =base64_encode(hash('whirlpool', $password, true) ); $result = mysql_query("SELECT * FROM accounts WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином $myrow = mysql_fetch_array($result); если пользователя с введенным логином и паролем не существует,то записываем ip пользователя с временем ошибки Код (Text): if (empty($myrow['password'])) { $select = mysql_query ("SELECT ip FROM oshibka WHERE ip='$ip'"); $tmp = mysql_fetch_row ($select); Если пользователь уже есть в таблице, то приплюсовываем количество не правильного ввода. Вот эта часть судя по всему работает не верно. Код (Text): if ($ip == $tmp[0]) { $result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db); $myrow52 = mysql_fetch_array($result52); $col = $myrow52[0] + 1; mysql_query ("UPDATE oshibka SET col=$col, date=NOW() WHERE ip='$ip'"); } Если пользователь ошибся и его еще нет в таблице, то добавляем Код (Text): else { mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'1')"); } exit ("Извините, введённый вами логин или пароль неверный. Доступно всего 5 попыток."); } если пароли совпадают, то запускаем пользователю сессию! Дальше все работает нормально Код (Text): else {.... Ошибок нет, проблема та же, вместо добавления +1 в столбик col к ip который уже ошибался, создается новая запись с таким же ip.