Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471

Не работает условие

29.03.2016, 12:51. Показов 1034. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
include ($_SERVER['DOCUMENT_ROOT'].'/include/connectdb.php');
$id = $_COOKIE['I'];
$hash = $_COOKIE['P'];
 
$q = mysql_query("SELECT * FROM `login` WHERE `user_id`='$id'");
    $h = mysql_fetch_array($q);
 
//проверяем совпадение хэша
if($id != $h['user_id'] && $hash != $h['hash']){
    header("Location: /login.php"); //редирект на авторизацию
    exit();
}
?>
Почему не хочет работать условие if($id != $h['user_id'] && $hash != $h['hash']){?
В бд всего 1 запись с ид и хэшем, а пускает с разных устройств где ранее был авторизован, то есть не редиректит на /login.php
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2016, 12:51
Ответы с готовыми решениями:

Проверка на число: Одно и то же условие работает в случае numchar, но не работает с xchar и ychar
Помогите ламеру с ламерской программкой. В тестирующей функции запрашиваются три строки numchar, xchar, ychar (число для вывода и...

Не работает условие
Примитивное условие: если эти три кнопки невидимы, то.. procedure TForm1.Button75Click(Sender: TObject); begin if...

Не работает условие if else
function indexAction($smarty){ $catId = isset($_GET) ? $_GET : null; if($catId == null) exit(); $rsChildCats = NULL; ...

20
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
29.03.2016, 13:07
Так у вас хэш не меняется при авторизации. Поэтому да, можно одновременно авторизоваться с нескольких устройств.

Чтобы авторизован мог быть только 1 юзер, надо после успешного логина генерировать новый хэш.
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 13:11  [ТС]
Jodah, да, так и есть, при авторизации новый хэш в куку прописывается.

Добавлено через 1 минуту
Если таблица пустая, то просит на любом устройстве авторизоваться. Но если я хоть где-то авторизовался, то начинает пускать со всех устройств. Хотя в куках хэши разные.

Добавлено через 1 минуту
Записываю новый хэш пока вот так, чтоб были разные, потом переделаю на IP и пароль
PHP
1
$hash = md5(date("Y-m-d H:m:s"));
$hash как раз таки идет и в куку и в $h['hash'].
0
 Аватар для useruser
166 / 90 / 38
Регистрация: 29.06.2015
Сообщений: 1,100
29.03.2016, 14:06
Цитата Сообщение от dukesov Посмотреть сообщение
if($id != $h['user_id'] && $hash != $h['hash']){ header("Location: /login.php"); //редирект на авторизацию exit();
Неверная логика. Вы пытаетесь редиректить на авторизацию того у кого что-то не верно.
А нужно проверять юзера и если всё верно - редиректить куда надо, а остальных редиректить на авторизацию.
Ваше условие работает, но не так как вам нужно.
--
Если айди не равен юзер_айди И хэш не равен какой_то_хэш тогда редирект, стоп скрипт.
У меня айди не равен юзер_айди. И меня не редирекнет. Ещё же надо хэш не равен какой_то_хэш.
Где бы мне взять неверный айди и неверный хеш и записать их в куки, что бы меня пустили к авторизации? )
А что делать новым пользователям у которых нет ни айди ни хеша?
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 20:08  [ТС]
useruser, именно нужно сделать редирект если не совпадает. Этот скрипт подключаю в каждую страницу админки. Это как проверка, тот ли человек зашел туда, куда нельзя заходить обычным пользователям.

Добавлено через 1 минуту
Я переделывал условие на: если ид=равен ид и хэш не равен хэшу то вообще не пускает никуда, сразу редирект на авторизацию.

Добавлено через 18 минут
useruser, сделал вот так:
PHP
1
2
3
4
if($id == $h['user_id'] && $hash == $h['hash']){
    header("Location: /login.php"); //редирект на авторизацию
    exit();
}
Очистил таблицу, а он все равно пускает.


Вот что сейчас. Все же не могу разобраться. Помогите кто знает как правильно составить это условие. Кстати, если в таблице нет этого ид, то пускает всех. Ну с этим я разберусь, добавлю доп условие. Но нужно чтоб смотрел все значения с одинаковым ид. Смотрит только первое, и со второго устройства уже не пускает, будь хоть 15 записей.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
include ($_SERVER['DOCUMENT_ROOT'].'/include/connectdb.php');
$id = $_COOKIE['I'];
$hash = $_COOKIE['P'];
 
$q = mysql_query("SELECT * FROM `login` WHERE `user_id` = $id");
    $h = mysql_num_rows($q);
    
//проверяем совпадение хэша
if($id == $h['user_id'] && $hash != $h['hash']){
    header("Location: /login.php"); //редирект на авторизацию
    exit();
}
?>
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
29.03.2016, 21:04
Цитата Сообщение от dukesov Посмотреть сообщение
Почему не хочет работать условие if($id != $h['user_id'] && $hash != $h['hash']){?
потому что там || должно быть
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 21:09  [ТС]
полудух, нет, сразу редирект на логин, хотя на 2-х устройствах хэш равен хэшу в таблице.
0
7 / 7 / 5
Регистрация: 17.03.2014
Сообщений: 77
29.03.2016, 21:15
Что-то не совсем понятно зачем так, здесь $h = mysql_num_rows($q); вы получаете количество строк полученных из БД, возвращает integer, а затем вы обращаетесь к числу как к массиву $id == $h['user_id'] && $hash != $h['hash']
Может вам все-таки нужно получить записи из БД и их проверять, а не количество этих записей?
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
29.03.2016, 21:24
Цитата Сообщение от dukesov Посмотреть сообщение
полудух, нет, сразу редирект на логин, хотя на 2-х устройствах хэш равен хэшу в таблице.
шта?
в этом условии нужен ||
Цитата Сообщение от dukesov Посмотреть сообщение
if($id != $h['user_id'] || $hash != $h['hash'])
а в этом - &&
Цитата Сообщение от dukesov Посмотреть сообщение
if($id == $h['user_id'] && $hash != $h['hash'])
но у вас походу теперь второе, тогда едем дальше
вот эта строка мимо
Цитата Сообщение от dukesov Посмотреть сообщение
$h = mysql_num_rows($q);
mysql_num_rows() тут не пришей рукав, как сказали выше уже

а вообще, чтобы экономить всем время в будущем, проверяйте сразу var_dump($_COOKIE) и var_dump($h)
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 21:38  [ТС]
geee, полудух, вот один единственный код, уже исправил кое какие ошибки, пробовал многие варианты...
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
include ($_SERVER['DOCUMENT_ROOT'].'/include/connectdb.php');
$id = $_COOKIE['I'];
$hash = $_COOKIE['P'];
 
$q = mysql_query("SELECT * FROM `login` WHERE `user_id` = $id");
    $h = mysql_fetch_array($q);
    
//проверяем совпадение хэша
if($id == $h['user_id'] && $hash != $h['hash']){
    header("Location: /login.php"); //редирект на авторизацию
    exit();
}
?>
Если записей в таблице login с текущим user_id нет, не редиректит, должен редиректить.

Если присутствует 1 запись, то все в порядке, с другого устройства уже не зайти, потому что хэш в куках отличается, примерно как в ВКонтакте, когда закрываешь все соединения просит авторизовать заново.

Если присутствует 2 или более записей с одинаковым user_id, но разным хэшем, то выбирает только первый user_id, то-есть, авторизовался я на компьютере, поработал, решил зайти на телефоне, редиректит, хотя не должно...


В общем говоря мне нужно так: скрипт проверит существует ли запись в таблице с одинаковым ид и одинаковым хэшем (без разница сколько раз пользователь заходил, скрипт должен найти соответствие среди всех одинаковых ид), значит оставляем и ни куда не редиректим... Если запись с ид существует, но хэш отличается тот что в куках, то редиректим на логин... Если записей с ид вообще нет то редиректим на логин.

Ну как то так...
0
7 / 7 / 5
Регистрация: 17.03.2014
Сообщений: 77
29.03.2016, 21:46
Цитата Сообщение от dukesov Посмотреть сообщение
В общем говоря мне нужно так: скрипт проверит существует ли запись в таблице с одинаковым ид и одинаковым хэшем (без разница сколько раз пользователь заходил, скрипт должен найти соответствие среди всех одинаковых ид), значит оставляем и ни куда не редиректим... Если запись с ид существует, но хэш отличается тот что в куках, то редиректим на логин... Если записей с ид вообще нет то редиректим на логин.
Вот так:
if($id != $h['user_id'] || $hash != $h['hash']){
редирект
}

Если что-то не так как должно быть, то пишешь var_dump($h); смотришь, что вообще в массиве лежит от этого и плясать
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 21:52  [ТС]
geee, не видит вторую запись. Вот что выдал var_dump:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
array(10) {
  [0]=>
  string(1) "1"
  ["user_id"]=>
  string(1) "1"
  [1]=>
  string(13) "**.254.***.69"
  ["ip"]=>
  string(13) "**.254.***.69"
  [2]=>
  string(142) "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.3.0.7146 Yowser/2.5 Safari/537.36"
  ["user_agent"]=>
  string(142) "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.3.0.7146 Yowser/2.5 Safari/537.36"
  [3]=>
  string(19) "2016-03-29 21:47:40"
  ["datevhod"]=>
  string(19) "2016-03-29 21:47:40"
  [4]=>
  string(32) "cd4254fb5ecb17066e591c795919f155"
  ["hash"]=>
  string(32) "cd4254fb5ecb17066e591c795919f155"
}
Добавлено через 1 минуту
Первым я авторизовал комп, потом телефон. На компе норм, а с телефона редирект, обе записи с одинаковым ид но разным хэшем присутствуют в таблице.
0
7 / 7 / 5
Регистрация: 17.03.2014
Сообщений: 77
29.03.2016, 21:54
А какую вторую запись должно видеть? Или в БД несколько записей с одинаковым user_id?
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 21:55  [ТС]
geee, да, несколько записей с одинаковым user_id, но разными $h['hash'].
0
7 / 7 / 5
Регистрация: 17.03.2014
Сообщений: 77
29.03.2016, 21:58
Ну тогда и нужно проходить по всем записям, а не только по первой:

PHP
1
2
3
4
5
while ($row = mysql_fetch_array($q, MYSQL_ASSOC)) {
    if($id != $row['user_id'] || $hash != $row['hash']){
       редирект
    }
}
Как-то так. Вот вообще эта функция http://php.net/manual/ru/funct... -array.php Сама по себе она только первую строку выбирает из БД
1
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 22:01  [ТС]
geee, я пробовал... редиректит на всех устройствах где был авторизован.
0
7 / 7 / 5
Регистрация: 17.03.2014
Сообщений: 77
29.03.2016, 22:02
Ну может в куках не то лежит? Можно вывести куки на экран и посмотреть
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 22:04  [ТС]
geee, все то же что и в таблице, ид и хэш соответствует кукам.
0
7 / 7 / 5
Регистрация: 17.03.2014
Сообщений: 77
29.03.2016, 22:08
А так?
PHP
1
2
3
4
5
6
7
while ($row = mysql_fetch_array($q, MYSQL_ASSOC)) {
    if($id == $row['user_id'] && $hash == $row['hash']){
       break;
    }else{
       редирект
    }
}
0
 Аватар для dukesov
19 / 18 / 11
Регистрация: 24.08.2015
Сообщений: 471
29.03.2016, 22:10  [ТС]
geee, выбирает только первую запись
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2016, 22:10
Помогаю со студенческими работами здесь

Не работает условие
Вопрос казалось бы простой, но, кто может мне объяснить, почему условие не работает? Суть простая: $a может быть или 1 или 2, $b от 1...

Не работает условие
Господа! Не могу понять, что происходит: Есть два одинаковых условия, но для разных полей select. Первое не работает, второе...

Условие if else не работает
Всем привет! Возникла следующая проблема. Не работает if else. Точнее то что в if выполняется, но если создать условие чтобы выполнялось...

Не работает условие IF
Помогите, плиииз, советом: я применила код к своей базе данных. он мне ищет номера торгов. Но почему-то в определённый момент затирает...

Не работает условие
здравствуйте! есть простенький запрос, но при формировании отчета по этому запросу ничего не выводит, если убираю условие то выводит все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru