За последние 24 часа нас посетили 52518 программистов и 1797 роботов. Сейчас ищут 795 программистов ...

UPDATE SET не работает

Тема в разделе "PHP и базы данных", создана пользователем R2ndom, 1 фев 2015.

  1. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Код (Text):
    1.  
    2. <?php
    3.  
    4.  
    5. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
    6. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    7. $n = "3";
    8. //заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
    9. if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
    10. {
    11. exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
    12. }
    13. //если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
    14. $login = stripslashes($login);
    15. $login = htmlspecialchars($login);
    16.  
    17. $password = stripslashes($password);
    18. $password = htmlspecialchars($password);
    19.  
    20. //удаляем лишние пробелы
    21. $login = trim($login);
    22. $password = trim($password);
    23.  
    24.  
    25. require ("config/bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
    26.  
    27. // минипроверка на подбор паролей
    28. $ip=getenv("HTTP_X_FORWARDED_FOR");
    29. if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
    30.  
    31. mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 600");//удаляем ip-адреса ошибавшихся при входе пользователей через 15 минут.
    32.  
    33. $result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);// извлекаем из базы колличество неудачных попыток входа за последние 15 минут у пользователя с данным ip
    34. $myrow = mysql_fetch_array($result);
    35.  
    36. if ($myrow['col'] > 4) {
    37. //если таковых попыток больше трех, то выдаем сообщение.
    38. exit("<br><h2><big><center>Вы набрали логин или пароль неверно 5 раз. Подождите 10 минут до следующей попытки.</center><big><h2>");
    39. }
    40.  
    41.  
    42. $password  =base64_encode(hash('whirlpool', $password, true) );
    43. //можно добавить несколько своих символов по вкусу, например, вписав "b3p6f". Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет. Но советую ставить другие символы, можно в начале строки или в середине.
    44.  
    45. //При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера.
    46.  
    47. $result = mysql_query("SELECT * FROM accounts WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином
    48. $myrow = mysql_fetch_array($result);
    49. if (empty($myrow['password']))
    50. {
    51. //если пользователя с введенным логином и паролем не существует,то записываем ip пользователя и с датой ошибки
    52.  
    53. $select = mysql_query ("SELECT ip FROM oshibka WHERE ip='$ip'");
    54. $tmp = mysql_fetch_row ($select);
    55. if ($ip == $tmp[0]) {
    56. //проверяем, есть ли пользователь в таблице "oshibka"
    57. $result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
    58. $myrow52 = mysql_fetch_array($result52);
    59.  
    60. $col = $myrow52[0] + 1;//Если есть,то приплюсовываем количесво
    61. mysql_query ("UPDATE oshibka SET col=$col,date=NOW() WHERE ip='$ip'");
    62. }
    63.  
    64. else {
    65. //если за последние 15 минут ошибок не было, то вставляем новую запись в таблицу "oshibka"
    66. mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'1')");
    67. }
    68.  
    69.  
    70. exit ("<br><h2><big><center>Извините, введённый вами логин или пароль неверный. Доступно всего 5 попытки.<br>
    71. Количество неудачных попыток: <big>$col</big><br><br><a href='/index.php'> Назад</a>
    72.  
    73. <p>
    74.  
    75.  
    76. <br>
    77.  
    78. <a href='reg.php'>Зарегистрироваться</a>
    79.  
    80. <br>
    81.  
    82. <a href='send_pass.html'>Забыли пароль?</a>
    83.  
    84. </p></form>
    85.  
    86. </center><big></h2>");
    87. }
    88. else {
    89.  
    90.           //если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел!
    91.           $_SESSION['password']=$myrow['password'];
    92.           $_SESSION['login']=$myrow['login'];
    93.           $_SESSION['id']=$myrow['id'];//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь
    94.          
    95. //Далее мы запоминаем данные в куки, для последующего входа.
    96. //ВНИМАНИЕ!!! ДЕЛАЙТЕ ЭТО НА ВАШЕ УСМОТРЕНИЕ, ТАК КАК ДАННЫЕ ХРАНЯТСЯ В КУКАХ БЕЗ ШИФРОВКИ
    97.  
    98. if (isset($_POST['save'])){
    99. //Если пользователь хочет, чтобы его данные сохранились для последующего входа, то сохраняем в куках его браузера
    100. setcookie("login", $_POST["login"], time()+9999999);
    101. setcookie("password", $_POST["password"], time()+9999999);}
    102. }  
    103.      
    104. echo "<center><big><h2><big>ЛИЧНЫЙ КАБИНЕТ<br><br><br>Добро пожаловать, ".$_SESSION['login']."<br><br>
    105.    
    106. ?>
    Каждый раз создаются новые записи вместо добавления к уже существующей:
    Код (Text):
    1.  
    2. 213.138.80.2    1.2.2015 21:15:16   1
    3. 213.138.80.2    1.2.2015 21:15:11   1
    4. 213.138.80.2    1.2.2015 21:12:52   1
    5. 213.138.80.2    1.2.2015 21:12:53   1
    6. 213.138.80.2    1.2.2015 21:15:22   1
    7. 213.138.80.2    1.2.2015 21:15:23   1
    Что может быть?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Отладку делал? phpfaq.ru/debug
    Где происходит ошибка?
     
  3. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Notice: Undefined variable: col in...
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    На какой строчке? Как из партизана всё нужно вытягивать
     
  5. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Notice: Undefined variable: col in /home/c/cg42771/public_html/app/lc.php on line 86
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    На 86 строчке нет такой переменной, что-то не совпадает.
    Notice это не ошибка, а уведомление что переменная не объявлена, но её используют.
    По отладке всё понятно? phpfaq.ru/debug
     
  7. alxkolm

    alxkolm Новичок

    С нами с:
    1 фев 2015
    Сообщения:
    1
    Симпатии:
    0
    Проверьте, почему у вас не выполняется условие на строке 54
    Код (Text):
    1. if ($ip == $tmp[0]) {
    Как выясните, думаю всё получится

    И бросьте учитить PHP по этому гавнокоду десятилетней давности. Учите сразу Yii или Laravel
     
  8. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Переменная не была объявлена на 71 строке, поправил. Но это к делу не относится.
    В базе вместо UPDATE уже существующей записи, добавляется новая.
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Начиная с Yii или Laravel как он сможет читать их исходники, если даже свои ещё осваивает.

    R2ndom, сколько ещё будешь игнорировать, умеешь делать отладку кода?
     
  10. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    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 тоже самое
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Попробуй переписать этот код с нуля, но проверяя каждое действие и смотри результат.
    Советую прочитать книгу по php, многое можно сделать было лучше.

    По поводу ошибки, посмотри документацию mysql_fetch_array(), ты первым аргументом функции должен был передать ресурс, но передал boolean, думаю что mysql_query вернула false, вместо результата запроса.
     
  12. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    На локальном сервере все работает.
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    На нём включены отображения всевозможных ошибок и уведомления?
     
  14. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    да

    Добавлено спустя 6 минут 11 секунд:
    Выставил error_reporting(E_ALL);
    ошибок нет ни на локальном ни на хосте, на локальном работает, а на хосте нет((

    Добавлено спустя 3 минуты 1 секунду:
    на локальной машине в таблице:
    Код (Text):
    1.  
    2. INSERT INTO `oshibka` VALUES ('127.0.0.1', '2015-2-1 22:26:55', 4);
    на хосте:
    Код (Text):
    1.  
    2. INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:04', 1);
    3. INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:08', 1);
    4. INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:10', 1);
    5. INSERT INTO `oshibka` VALUES ('213.138.80.2', '2015-2-1 22:27:31', 1);
    скрипты идентичны
     
  15. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Из инструкции по отладки проверь каждую переменную и каждое условие if, проследи за компьютером и перепроверь всё что он делает
     
  16. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Бред какой-то. Вместо UPDATE происходит INSERT
     
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Тебе писали выше проверить условие $ip == $tmp[0]
     
  18. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    как его проверить то?
    Код (Text):
    1. if ($ip == $tmp[0]) {
    2. //проверяем, есть ли пользователь в таблице "oshibka"
    3.  
    4.  
    5. $result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
    6. $myrow52 = mysql_fetch_array($result52);
    7.  
    8. $col = $myrow52[0] + 1;//Если есть,то приплюсовываем количесво
    9. mysql_query ("UPDATE oshibka SET col=$col, date=NOW() WHERE ip='$ip'") or trigger_error(mysql_error().$query);
    10. mysql_error();
    11. }
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    [​IMG]

    http://phpfaq.ru/debug почитай уже

                   и раздупляйся
     
  20. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Как отключить header_access X-Forwarded-For deny all?
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    чо? не надо его отключать. надо

    1) экранировать данные, попадающие в SQL запрос
    2) не тащить в рот что попало. зачем ты в своем коде использовал HTTP_X_FORWARDED_FOR ? что там?
     
  22. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Спасибо, там ничего, убрал
     
  23. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Перерыл все, ни чего не помогает(( По совету разделил по блокам проверил все условия.
    Заносим введенные пользователем логин и пароль в переменные $login, если он пустой, то уничтожаем переменные:
    Код (Text):
    1.  
    2. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //
    3. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    Если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
    Код (Text):
    1.  
    2. if (empty($login) or empty($password))
    3. {
    4. exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
    5. }
    Экранируем вводимые данные
    Код (Text):
    1.  
    2. $login = stripslashes($login);
    3. $login = htmlspecialchars($login);
    4. $password = stripslashes($password);
    5. $password = htmlspecialchars($password);
    6. $login = trim($login);
    7. $password = trim($password);
    Подключаюсь к базе, извлекаем ip, удаляем ip адреса тех кто ошибался позже 600сек
    Код (Text):
    1.  
    2. include ("config/bd.php");
    3. mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 600");
    Получаем количество неудачных попыток с данным ip, если их больше 4-х выводим сообщение
    Код (Text):
    1.  
    2. $result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
    3. $myrow = mysql_fetch_array($result);
    4.  
    5. if ($myrow['col'] > 4) {
    6.  
    7. exit("<br><h2><big><center>Вы набрали логин или пароль неверно 5 раз. Подождите 10 минут до следующей попытки.</center><big><h2>");
    8. }
    Получаем данные о введенном пользователе
    Код (Text):
    1.  
    2. $password  =base64_encode(hash('whirlpool', $password, true) );
    3. $result = mysql_query("SELECT * FROM accounts WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином
    4. $myrow = mysql_fetch_array($result);
    если пользователя с введенным логином и паролем не существует,то записываем ip пользователя с временем ошибки
    Код (Text):
    1.  
    2. if (empty($myrow['password']))
    3. {
    4. $select = mysql_query ("SELECT ip FROM oshibka WHERE ip='$ip'");
    5. $tmp = mysql_fetch_row ($select);
    Если пользователь уже есть в таблице, то приплюсовываем количество не правильного ввода. Вот эта часть судя по всему работает не верно.
    Код (Text):
    1.  
    2. if ($ip == $tmp[0]) {
    3. $result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
    4. $myrow52 = mysql_fetch_array($result52);
    5. $col = $myrow52[0] + 1;
    6. mysql_query ("UPDATE oshibka SET col=$col, date=NOW() WHERE ip='$ip'");
    7. }
    Если пользователь ошибся и его еще нет в таблице, то добавляем
    Код (Text):
    1.  
    2. else {
    3. mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'1')");
    4. }
    5. exit ("Извините, введённый вами логин или пароль неверный. Доступно всего 5 попыток.");
    6. }
    если пароли совпадают, то запускаем пользователю сессию! Дальше все работает нормально
    Код (Text):
    1. else {....
    Ошибок нет, проблема та же, вместо добавления +1 в столбик col к ip который уже ошибался, создается новая запись с таким же ip.
     
  24. R2ndom

    R2ndom Новичок

    С нами с:
    21 янв 2015
    Сообщения:
    41
    Симпатии:
    0
    Плиз хелп, не хочется возвращаться к капче.
     
  25. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    $ip == $tmp[0] это условие выполняется? через var_dump проверял