За последние 24 часа нас посетили 21659 программистов и 1018 роботов. Сейчас ищут 714 программистов ...

Mysqli и ajax. Некорректно возвращается ответ от mysql

Тема в разделе "PHP и базы данных", создана пользователем Evgeniy1, 25 июн 2019.

  1. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    Есть скрипт который должен изменять данние пользователя в таблице Users в моей базе.
    HTML:
    1. <div class="row">
    2.                    <div class="col col-12 col-md-6 col-lg-4 col-sm-6">
    3.                                               <div class="form-group">
    4.     <label for="login_input">Ваш логин в системе</label>
    5.     <input type="text" required class="changeable form-control text-center" id="login_input" placeholder="Login" value="<?php echo   $my_user['login'];  ?>" readonly>
    6.   </div>
    7.                    </div>
    8.                    <div class="col col-12 col-md-6 col-lg-4 col-sm-6">
    9.                                               <div class="form-group">
    10.     <label for="email_input">Ваш E-mail в системе</label>
    11.     <input type="email"required class="changeable form-control text-center <?php if($my_user['email_confirm']){echo 'text-success';} elseif(!$my_user['email_confirm']){echo 'text-danger';} ?>" data-html="true" data-toggle="tooltip" data-placement="top" title="<?php if($my_user['email_confirm']){echo 'Ваша почта подтверждена';} elseif(!$my_user['email_confirm']){echo "Внимание! Вам следует подтвердить вашу почту.<a class='btn btn-success' href='./confirm_email.php'>Подтвердить почту</a> ";} ?>" id="email_input" placeholder="Email" value="<?php echo $my_user['e_mail'];  ?>" readonly>
    12.   </div>
    13.                    </div>
    14.  
    15.                    <div class="col col-12 col-md-6 col-lg-4 col-sm-6">
    16.                                               <div class="form-group">
    17.     <label for="pass_input">Ваш пароль в системе</label>
    18.     <input type="text" required class="changeable form-control text-center" id="pass_input" placeholder="Password" value="<?php echo $my_user['pass']; ?>" readonly>
    19.   </div>
    20.                    </div></div>
    21. <button class="btn btn-primary mt-3" onclick="start_change()">&#9998; Изменить
    22.                    </button>
    23.  
    24.  
    25.  
    Чуть ниже идет скрипт вот скрипт (Он корявенько написан но работает!)
    Код (Javascript):
    1. var new_login = '';
    2.           var new_pass = '';
    3.           var new_email = '';
    4.     function start_change(){
    5.       $('.changeable').removeAttr('readonly');
    6.       $('button[onclick="start_change()"]').removeClass('btn-primary');
    7.       $('button[onclick="start_change()"]').addClass('btn-success');
    8.       $('button[onclick="start_change()"]').text('Сохранить');
    9.       $('button[onclick="start_change()"]').attr('onclick','end_change()');
    10.   };
    11.   function Success_ajax (data){
    12.       alert(data);
    13.   };
    14.   function end_change(){
    15.       $('.changeable').attr('readonly','');
    16.       new_login = $('#login_input').val();
    17.       new_pass = $('#pass_input').val();
    18.       new_email = $('#email_input').val();
    19.       $('button[onclick="end_change()"]').removeClass('btn-success');
    20.       $('button[onclick="end_change()"]').addClass('btn-primary');
    21.       $('button[onclick="end_change()"]').html('&#9998; Изменить');
    22.       $('button[onclick="end_change()"]').attr('onclick','start_change()');
    23.       $.ajax({
    24.   type: "POST",
    25.   url: 'change.php',
    26.   data: {'new_login':new_login,'new_pass':new_pass,'new_email':new_email},
    27.   success: Success_ajax,
    28.   dataType: 'text'
    29. });
    30.      
    31.   };
    32.       $(function () {
    33.   $('[data-toggle="tooltip"]').tooltip();
    34.  
    35. });
    Ну и наконец php
    PHP:
    1. <?php
    2. if (!isset($_SESSION['authid'])){
    3.     header("Location: http:/....../index.php?error=Вы не авторизованы )");
    4.     exit;
    5. }
    6. $new_email = $_POST['new_email'];
    7. $new_login = $_POST['new_login'];
    8. $new_pass = $_POST['new_pass'];
    9. if (isset($new_email) and isset($new_login) and isset($new_pass)){
    10.     if(!empty($new_email) and !empty($new_login) and !empty($new_pass)){
    11.         if (strlen($new_login) > 3 and strlen($new_pass) > 5){
    12.             if(!filter_var($new_email, FILTER_VALIDATE_EMAIL)){
    13.                 echo 'E-mail не валидный!';
    14.             }
    15.             else{
    16.                 $my_user = require '../action/useR/info_useRr.php';
    17.                 if ($my_user['login'] != $new_login or $my_user['e_mail'] != $new_email or $my_user['pass'] != $new_pass){
    18.                     $id_user = $_SESSION['authid'];
    19.                     $id_user2 = $my_user['id'];
    20.                     if (!$id_user == $id_user2){
    21.                         echo 'CRITICAL SERVER ERROR! несоотвиствие данных в системе обратитесь к админу!(на главной стр!)';
    22.                     }
    23.                 $link = mysqli_connect('localhost', '', '','');
    24.                 if (!$link) {
    25.                     die ('Ошибка соединения: ' . mysqli_error());
    26.                     header("Location: http://.........../profile.php?error=Ошибка соединения:". mysqli_error());
    27.                     exit;}
    28.                 mysqli_set_charset($link, "utf8");
    29.                 // CHECK
    30.                 $sql_check = "SELECT COUNT(*) as count  FROM `Users` WHERE `e_mail` = '$new_email' AND BINARY`login` = '$new_login' AND BINARY `pass` = '$new_pass'";
    31.                 if(!$result3 = mysqli_query($link,$sql_check)){
    32.                     echo 'Ошибка проверки базы!';
    33.                     exit;
    34.                 }
    35.                 echo $sql_check;
    36.                 $count = mysqli_fetch_assoc($result3);
    37.                 var_dump ($count);
    38.                 mysqli_free_result($result3);
    39.                
    40.                 //UPD
    41.                 $sql_upd = "UPDATE `........`.`Users` SET `login` = '$new_login', `e_mail` = '$new_email', `pass` = '$new_pass', `email_confrim` = '1' WHERE `Users`.`id` = $id_user2";
    42.                 if(!$result = mysqli_query($link,$sql_upd)){
    43.                     echo 'Ошибка обновления базы!';
    44.                     exit;
    45.                 }
    46.                 mysqli_free_result($result);
    47.                 mysqli_close($link);
    48.                 echo 'Новые данные сохранены!';
    49.             }}
    50.         }
    51.         else{
    52.             echo 'Логин должен состоять из более чем 4 символов а пароль из 5!';
    53.         }
    54.     }
    55.     else{
    56.         echo 'Все поля должны быть заполнеными!';
    57.     }
    58. }
    59. else{
    60.     echo 'Ошибка передачи данних!';
    61. }
    62. ?>
    И вот крч ПРОБЛЕМА во время етапа проверки новых данных: Крч получатеся после проверки у меня должна быть переменная с кол-вом повторений моих новых данних если будет 0 тогда пропускаем дальше и изменяем в базе если > 0 тогда не пропускаем ! Но выходит так что при любом логине пароле и почте все равно вернется 0 НО если я скопирую с php запрос и введу вручную данние тогда выведет уже правильно кол-во учеток с такими данними ! Прошу помощи сам хз =(
     
  2. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    РЕБЯТ все работает вроде ) я потом отпишусь ну может ет я тупанул))
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Опять редирект? С аяксом он практически несовместим.

    Прежде чем кодить, прорабатывай структуры данных и алгоритмы. Просто делай UPDATE при успешной авторизации и после проверяй результат. Дублирование логинов и т.п. отсекай за счет использования юников (уник. ключей для соотв. полей).
    --- Добавлено ---
    P.S. Можно делать предвыборку, если в сессии недостаточно данных, но только для того, чтобы не обновлять неизменившиеся поля (вплоть до полного отказа от UPDATE). Возможно, лучше сессию дополнить этими данными и не делать (доп.) предвыборку.
    --- Добавлено ---
    Неверный порядок:
    PHP:
    1. $new_email = $_POST['new_email'];
    2. $new_login = $_POST['new_login'];
    3. $new_pass = $_POST['new_pass'];
    4. if (isset($new_email) and isset($new_login) and isset($new_pass)){
    --- Добавлено ---
    Кстати, isset может принимать несколько аргументов.
     
  4. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    Спасибо) крч работает как-то странно ) но работает ещё с запросом поиграюсь и уберуу редиректы) Я для полной безопасности в сесии храню ток id пользователя остальное делает скрипт и сохраняет масив с данными в $my_user
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    В таком случае подумай, нужны ли тебе вообще сессии РНР.
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    топ
     
  7. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    В этом и прикол) Я тип зделал сессию в ней лежит id пользователя, а тот скрипт берёт id из сессии и возвращает масив о пользователе на основании сессии
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    В чем прикол? Говорю, тебе по сути один шаг остался, чтобы вообще не использовать сессии РНР, – научиться генерировать достаточно стойкий криптоключ, записывать и считывать его в БД. Это просто была инфа к размышлению. По существу вопроса я выше отписался: UPDATE с проверкой результата и все.
     
  9. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    Да спасибо, я наладил запрос теперь все работает как и задумывал, с отказом от сессии подумаю. Спасибо за дельные советы и помощь.
     
  10. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    Кому интересно ) В итоге такой запрос получился:
    PHP:
    1. $sql_check = "SELECT COUNT(*) as count FROM (SELECT * FROM `Users` WHERE `id` != '$id_user' ) t WHERE `e_mail` = '$new_email' OR BINARY `login` = '$new_login'";
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Уже не интересно, с учетом последней выкладки и этого:
     
  12. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    Кому-то может пригодится
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Да прям всем пригодится SELECT вместо UPDATE :)
     
  14. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    Неее ет запрос для проверки чтобы повторения не было , а дальше конечно update
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Т.е. ты на мой совет решил подзабить. Ну ОК, лепи монстров дальше.
     
  16. Evgeniy1

    Evgeniy1 Новичок

    С нами с:
    5 июн 2018
    Сообщения:
    39
    Симпатии:
    0
    Пока я делаю колхоз машину =) потом я другу буду давать на доработку. + Сессия нужна я туда ещё переменную закинул для корректной нумерации таблицы
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Конкретно против сессии я особо ничего не имею против. Я про твои проверки. Чем тут изгаляться, лучше почитай про уникальные ключи (индексы).