У меня есть база данных и таблица "users". И там есть все данные о пользователе. Вот так выглядит: И у меня проблема с одним кодом, вот этим: PHP: $id = $_SESSION['id']; $mysqli = mysqli_connect("localhost", "root", "", "nobiblio"); $res = mysqli_query($mysqli, "SELECT `status` FROM `users` WHERE `id`='" . $id . "'"); if ($res) { $status = mysqli_fetch_assoc($res); if ($status['status'] == 0) { $flag = false; $result = mysqli_query($mysqli, "SELECT login,id FROM users ORDER BY login"); ?>Список пользователей для <b>пользователя:</b><br><?php while ($myrow = mysqli_fetch_array($result)) {?> <p> <?php printf("<a href='page.php?id=%s'>%s</a><br>", $myrow['id'], $myrow['login']); }?> <p> <?php } else if($status['status'] == 1){ $flag = true; $result = mysqli_query($mysqli, "SELECT login,id FROM users ORDER BY login"); ?>Список пользователей для <b>Администратора:</b><br><?php while ($myrow = mysqli_fetch_array($result)) {?> <p> <?php if($flag){?> <span><?php echo $myrow['id']; echo "<br>". $status['status'];?></span> <?php } $mylogin='<br>'.$myrow['login'].'<br>'; printf("<a href='page.php?id=%s'>%s</a><br>", $myrow['id'], $mylogin); }?> <p> <?php } } ?> Значит тут я сделал, что если пользователь имеет статус 1 ( там в бд написано, кто такой статус имеет ), значит он может видеть всех зарегистрированных пользователей и их ид в бд. Если статус 0, так видит только всех зарегистрированных пользователей, но ид не видит. И я ещё хочу для статуса 1 добавить, чтоб видел ещё и номер статуса того пользователя ( как в бд ). Но мне это не очень получается, потому что когда я пишу вот так: PHP: span><?php echo $myrow['id']; echo "<br>". $status['status'];?></span> Так у меня везде 1 показывает у каждого пользователя, хотя 1 статус имеет только пользователь "Administracija", так значит, что только у него 1 должен показываться, а у других ноль. Надеюсь, вы сможите мне помочь. Спасибо.
Ну так тебе результирующие таблицы надо дополнить этим статусом (login,id,status) и при итерации результата обращаться к правильному массиву ($myrow['status'] вместо $status['status']) --- Добавлено --- И запросы при статус 0 и статус 1 у тебя ни чем не отличаются. Так и задумано?
Аааа, всё, спасибо, да, я там не дописал status. Вообшем я уже исправил и всё работает. PHP: $result = mysqli_query($mysqli, "SELECT login,id,status FROM users ORDER BY login"); ?>Список пользователей для <b>Администратора:</b><br><?php while ($myrow = mysqli_fetch_array($result)) {?> <p> <?php if($flag){?> <span><?php echo $myrow['id']?><?php echo "<br>". $myrow['status']?></span> <?php } $mylogin='<br>'.$myrow['login']; $myid='<br>'.$myrow['id']; printf("<a href='page.php?id=%s'>%s</a><br>",$myid, $mylogin );
много мусора в коде, переделал... PHP: $id = $_SESSION['id']; $mysqli = mysqli_connect ( '127.0.0.1', 'root', '', 'nobiblio' ); mysqli_set_charset ( $mysqli, 'utf8' ); $res = mysqli_query ( $mysqli, sprintf ( 'SELECT `status` FROM `users` WHERE `id`= %d ', $id ) ); if ( mysqli_num_rows ( $res ) > 0 ) { $usrstatus = mysqli_fetch_assoc ( $res ); $result = mysqli_query ( $mysqli, 'SELECT id, login, status FROM users ORDER BY login' ); while ( [ $id, $login, $status ] = mysqli_fetch_array ( $result ) ) { switch ( $usrstatus ) { case 1: printf ( '<p><div>ID: %d | STATUS: %d</div><div><a href="/page.php?id=%1$d">%s</a></div></p>', $id, $status, $login ); break; default: printf ( '<p><div><a href="/page.php?id=%d">%s</a></div></p>', $id, $login ); } } } --- Добавлено --- ой забыл тхт --- Добавлено --- page.php?id=<br>30
У вас у обоих сохраняется смешная логическая ошибка - проверка кол-ва строк после первого запроса. А он у вас получается подстановкой айдишника пользователя из сессии. Пользователь аутентифицирован и вы проверяете существование кортежа в таблице пользователей. Для зачем?
чтобы предохраниться от форсмажора. Когда юзер на сайте и его вдруг админ захотел почистить к хренам.
Обычно не удаляют кортеж а меняют какой-то признак - тот же статус. А поскольку ты и так выбираешь статус - то тебе не нужна проверка на кол-во кортежей в результирующей таблице - там он должен быть ровно один так как для этого пользователя уже существует сессия.
не не нее... все тип топ у меня. Аргументирую. когда проходит аутентификация пользователя, можно предположить что, если у юзера есть сессия с ид то никаких действий не предпринимаем. Браузер переоткрыли... сессия(обычная) конечно слетела... нужно снова занести в сессию ИД пользователя, но вот нежданчик.. данные не верны или пользователя такого не существует. В сессию ничего не пишется... а значит мы в данном скрипте ловим НОТИС... и в $id заносится null PHP: $id = $_SESSION['id']; далее... первый запрос вернул 0 строк, проверив. Тобишь дальнейший код по выводу списка пользователей ЮЗЕРУ вовсе не отрабатывает свой план. У нас же второй запрос запрашивает всю таблицу с некими полями для заполнении таблицы с пользователями. Так зачем юзеру нужно выводить таблицу? если: юзера заметь тут нет... В итоге проверка на кол-во строк оправдана. --- Добавлено --- если даже поставить место default case 0 то все равно будут лишние движения ( цикл крутиться )
@MouseZver так себе оправдался. Если пользователь закрыл браузер и слетела сессионная кука и потом он возвращается - ему предложат залогиниться ибо данная страница доступна аутентифицированному пользователю. Она только различает админа и нормал-юзера при отображении данных. Анонимусов она не обрабатывает так как где-то до этого отсутствие сессии породит восстание машин редирект к форме входа.
@Ganzal, а если админ забанил/удалил пользователя, пока тот был залогинен? Поэтому может быть, что запрос вернёт пустоту, если соотв. условие туда добавить.
судя по наличию PHP: $mysqli = mysqli_connect ( '127.0.0.1', 'root', '', 'nobiblio' ); и дальнейшего кода, страница будет доступна абсолютно всем --- Добавлено --- в null. Что соответственно будет работать лишний код, который предназначен только авторизованным, не выепаным лицам PHP: if ( mysqli_num_rows ( $res ) > 0 ) а если айди не нашел? кода же нету (выше упомянуто). Ибо вангу врубаем - где - то второй раз подключаем бд. --- Добавлено --- заходит мол новый юзер и сразу по каким то выкрутасами вбивает в адресную строку ссылку до скрипта и смотрит всю таблицу юзеров с айди. Мой же код препятствует этому
PHP: mysqli_num_rows считает количество рядов и $res>0 значит что таблица не пустая а не проверка статуса.
@keren https://php.ru/forum/threads/pomogite-s-kodom.68204/#post-551854 --- Добавлено --- https://php.ru/forum/threads/pomogite-s-kodom.68204/#post-551837
@MouseZver Как тебе и говорил @Ganzal, у тебя ошибка с логикой, PHP: if ( mysqli_num_rows ( $res ) > 0 ) тебе вернет единицу независимо от статуса - это количество рядов в выборке и соответственно у тебя в коде при статусе 0 будет все равно case 1 у тебя будет тип топ если пользователя нет в базе, но это уже другой вопрос.
для юзера не будут обрабатываться дальнейшие действия по выводу таблицы и прочее --- Добавлено --- если он будет существовать в таблице
Но все же это не правильно если даже сессия пустая все равно устанавливается соединение с базой, лучше бы если была проверка PHP: if ($_SESSION['id']) { $id = $_SESSION['id']; } else //редирект на залогивание
Если (не залогинен) тогда редирект конецЕсли Всё. один логический блок, который прервёт выполнение скрипта по условию. Всё что ниже этого блока будет доступно в контексте "иначе" этого же логического блока.
Да лучше бы PHP: if (! isset $_SESSION['id']) { //редирект на залогивание } else $id = $_SESSION['id'];