За последние 24 часа нас посетили 53253 программиста и 1713 роботов. Сейчас ищут 915 программистов ...

Помогите с кодом

Тема в разделе "PHP для новичков", создана пользователем Terminator004, 5 янв 2018.

  1. Terminator004

    Terminator004 Новичок

    С нами с:
    1 дек 2016
    Сообщения:
    195
    Симпатии:
    1
    У меня есть база данных и таблица "users". И там есть все данные о пользователе. Вот так выглядит:
    upload_2018-1-3_21-32-2.png

    И у меня проблема с одним кодом, вот этим:
    PHP:
    1. $id = $_SESSION['id'];
    2.             $mysqli = mysqli_connect("localhost", "root", "", "nobiblio");
    3.             $res = mysqli_query($mysqli, "SELECT `status` FROM `users` WHERE  `id`='" . $id . "'");
    4.          
    5.          
    6.          
    7.             if ($res) {
    8.                 $status = mysqli_fetch_assoc($res);
    9.                 if ($status['status'] == 0) {
    10.                     $flag = false;
    11.                     $result = mysqli_query($mysqli, "SELECT login,id FROM users ORDER BY login");
    12.                     ?>Список пользователей для <b>пользователя:</b><br><?php
    13.                     while ($myrow = mysqli_fetch_array($result)) {?>
    14.                     <p>          
    15.                   <?php     printf("<a href='page.php?id=%s'>%s</a><br>", $myrow['id'], $myrow['login']);     }?>            
    16.                     <p>
    17.                     <?php
    18.                  }
    19.                else if($status['status'] == 1){
    20.                      $flag = true;
    21.                     $result = mysqli_query($mysqli, "SELECT login,id FROM users ORDER BY login");
    22.                     ?>Список пользователей для <b>Администратора:</b><br><?php
    23.                     while ($myrow = mysqli_fetch_array($result)) {?>
    24.                     <p>
    25.                         <?php if($flag){?>
    26.                         <span><?php echo $myrow['id']; echo "<br>". $status['status'];?></span>
    27.                         <?php }
    28.                      
    29.          
    30.                         $mylogin='<br>'.$myrow['login'].'<br>';
    31.                      
    32.              
    33.                      
    34.                         printf("<a href='page.php?id=%s'>%s</a><br>", $myrow['id'], $mylogin);
    35.                      
    36.                      
    37.                      
    38.                     }?>
    39.                     <p>
    40.                <?php
    41.                }
    42.            
    43.          
    44.             }
    45.           ?>

    Значит тут я сделал, что если пользователь имеет статус 1 ( там в бд написано, кто такой статус имеет ), значит он может видеть всех зарегистрированных пользователей и их ид в бд. Если статус 0, так видит только всех зарегистрированных пользователей, но ид не видит. И я ещё хочу для статуса 1 добавить, чтоб видел ещё и номер статуса того пользователя ( как в бд ). Но мне это не очень получается, потому что когда я пишу вот так:
    PHP:
    1. span><?php echo $myrow['id']; echo "<br>". $status['status'];?></span>
    Так у меня везде 1 показывает у каждого пользователя, хотя 1 статус имеет только пользователь "Administracija", так значит, что только у него 1 должен показываться, а у других ноль.

    upload_2018-1-3_21-39-46.png
    Надеюсь, вы сможите мне помочь. Спасибо.
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Ну так тебе результирующие таблицы надо дополнить этим статусом (login,id,status) и при итерации результата обращаться к правильному массиву ($myrow['status'] вместо $status['status'])
    --- Добавлено ---
    И запросы при статус 0 и статус 1 у тебя ни чем не отличаются. Так и задумано?
     
    Terminator004 нравится это.
  3. Terminator004

    Terminator004 Новичок

    С нами с:
    1 дек 2016
    Сообщения:
    195
    Симпатии:
    1
    Аааа, всё, спасибо, да, я там не дописал status. Вообшем я уже исправил и всё работает.
    PHP:
    1.   $result = mysqli_query($mysqli, "SELECT login,id,status FROM users ORDER BY login");
    2.                     ?>Список пользователей для <b>Администратора:</b><br><?php
    3.                
    4.                     while ($myrow = mysqli_fetch_array($result)) {?>
    5.                     <p>
    6.                         <?php if($flag){?>
    7.                        
    8.                         <span><?php echo $myrow['id']?><?php echo "<br>". $myrow['status']?></span>
    9.                         <?php }
    10.                        
    11.            
    12.                         $mylogin='<br>'.$myrow['login'];
    13.                         $myid='<br>'.$myrow['id'];
    14.                
    15.                        
    16.                         printf("<a href='page.php?id=%s'>%s</a><br>",$myid, $mylogin );
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    много мусора в коде, переделал...
    PHP:
    1. $id = $_SESSION['id'];
    2.  
    3. $mysqli = mysqli_connect ( '127.0.0.1', 'root', '', 'nobiblio' );
    4. mysqli_set_charset ( $mysqli, 'utf8' );
    5.  
    6. $res = mysqli_query ( $mysqli, sprintf ( 'SELECT `status` FROM `users` WHERE  `id`= %d ', $id ) );
    7.  
    8.  
    9.  
    10. if ( mysqli_num_rows ( $res ) > 0 )
    11. {
    12.     $usrstatus = mysqli_fetch_assoc ( $res );
    13.    
    14.     $result = mysqli_query ( $mysqli, 'SELECT id, login, status FROM users ORDER BY login' );
    15.    
    16.     while ( [ $id, $login, $status ] = mysqli_fetch_array ( $result ) )
    17.     {
    18.         switch ( $usrstatus )
    19.         {
    20.             case 1:
    21.                 printf ( '<p><div>ID: %d | STATUS: %d</div><div><a href="/page.php?id=%1$d">%s</a></div></p>', $id, $status, $login );
    22.             break;
    23.             default:
    24.                 printf ( '<p><div><a href="/page.php?id=%d">%s</a></div></p>', $id, $login );
    25.         }
    26.     }
    27. }
    --- Добавлено ---
    ой забыл тхт
    --- Добавлено ---
    page.php?id=<br>30 o_O
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    У вас у обоих сохраняется смешная логическая ошибка - проверка кол-ва строк после первого запроса. А он у вас получается подстановкой айдишника пользователя из сессии. Пользователь аутентифицирован и вы проверяете существование кортежа в таблице пользователей. Для зачем?
     
    denis01 нравится это.
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    чтобы предохраниться от форсмажора.
    Когда юзер на сайте и его вдруг админ захотел почистить к хренам.
     
  7. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Обычно не удаляют кортеж а меняют какой-то признак - тот же статус. А поскольку ты и так выбираешь статус - то тебе не нужна проверка на кол-во кортежей в результирующей таблице - там он должен быть ровно один так как для этого пользователя уже существует сессия.
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    ммм верно
    --- Добавлено ---
    а то смотрю на код, где условиями проверяется статус 0 или 1
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    не не нее... все тип топ у меня. Аргументирую.

    когда проходит аутентификация пользователя, можно предположить что, если у юзера есть сессия с ид то никаких действий не предпринимаем. Браузер переоткрыли... сессия(обычная) конечно слетела... нужно снова занести в сессию ИД пользователя, но вот нежданчик.. данные не верны или пользователя такого не существует. В сессию ничего не пишется... а значит мы в данном скрипте ловим НОТИС... и в $id заносится null
    PHP:
    1. $id = $_SESSION['id'];
    далее...

    первый запрос вернул 0 строк, проверив. Тобишь дальнейший код по выводу списка пользователей ЮЗЕРУ вовсе не отрабатывает свой план. У нас же второй запрос запрашивает всю таблицу с некими полями для заполнении таблицы с пользователями. Так зачем юзеру нужно выводить таблицу? если:

    юзера заметь тут нет...
    В итоге проверка на кол-во строк оправдана.
    --- Добавлено ---
    если даже поставить место default
    case 0
    то все равно будут лишние движения ( цикл крутиться )
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @MouseZver так себе оправдался. Если пользователь закрыл браузер и слетела сессионная кука и потом он возвращается - ему предложат залогиниться ибо данная страница доступна аутентифицированному пользователю. Она только различает админа и нормал-юзера при отображении данных. Анонимусов она не обрабатывает так как где-то до этого отсутствие сессии породит восстание машин редирект к форме входа.
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @Ganzal, а если админ забанил/удалил пользователя, пока тот был залогинен? Поэтому может быть, что запрос вернёт пустоту, если соотв. условие туда добавить.
     
  12. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @mkramer статус поменяется. Число строк - нет.
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    судя по наличию
    PHP:
    1. $mysqli = mysqli_connect ( '127.0.0.1', 'root', '', 'nobiblio' );
    и дальнейшего кода, страница будет доступна абсолютно всем
    --- Добавлено ---
    в null. Что соответственно будет работать лишний код, который предназначен



    только авторизованным, не выепаным лицам
    PHP:
    1. if ( mysqli_num_rows ( $res ) > 0 )
    а если айди не нашел? кода же нету (выше упомянуто). Ибо вангу врубаем - где - то второй раз подключаем бд.
    --- Добавлено ---
    заходит мол новый юзер
    и сразу по каким то выкрутасами вбивает в адресную строку ссылку до скрипта и смотрит всю таблицу юзеров с айди. Мой же код препятствует этому
     
    Terminator004 нравится это.
  14. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    считает количество рядов и $res>0 значит что таблица не пустая а не проверка статуса.
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
  16. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @MouseZver Как тебе и говорил @Ganzal, у тебя ошибка с логикой,
    PHP:
    1. if ( mysqli_num_rows ( $res ) > 0 )
    тебе вернет единицу независимо от статуса - это количество рядов в выборке и соответственно у тебя в коде при статусе 0 будет все равно case 1
    у тебя будет тип топ если пользователя нет в базе, но это уже другой вопрос.
     
  17. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Хотя нет я неправ, ( mysqli_num_rows ( $res ) даст единицу но $res все равно останется 0
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    для юзера не будут обрабатываться дальнейшие действия по выводу таблицы и прочее
    --- Добавлено ---
    если он будет существовать в таблице
     
  19. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Но все же это не правильно если даже сессия пустая все равно устанавливается соединение с базой, лучше бы если была проверка
    PHP:
    1. if ($_SESSION['id']) {
    2. $id = $_SESSION['id'];
    3. } else
    4. //редирект на залогивание
     
  20. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    вот именно, что нужно аутентификацию латать + ставить заглушки
    Так что как и говорил
     
  21. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Если (не залогинен) тогда редирект конецЕсли

    Всё. один логический блок, который прервёт выполнение скрипта по условию. Всё что ниже этого блока будет доступно в контексте "иначе" этого же логического блока.
     
    keren нравится это.
  22. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Да лучше бы
    PHP:
    1. if (! isset $_SESSION['id']) {
    2. //редирект на залогивание
    3. } else
    4. $id = $_SESSION['id'];
     
  23. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    не надо элс
     
    keren нравится это.
  24. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    сессия осталась, а юзера в таблице нет. Ваш ход
     
  25. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а почему пользователя в таблице нет?