Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Перебор массива и редирект по условию -- редирект происходит в любом случае (почему и как с этим бороться?)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Mikhail_Z
Отправлено: 25 Июня, 2014 - 07:56:54
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2014  


Помог: 0 раз(а)




Есть задачка. В массив помещаем IP разрешенных пользователей. Скрипт должен проверять IP пользователя с элементами массива, в случае совпадения - возвращать приветствие.
Если IP в массиве нет - возвращать ругательство и делать редирект на другую страницу.
Проблема: Редирект происходит в любом случае.
Предполагаю, что это происходит в процессе перебора циклом foreach.
Как с этим бороться?
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3.  
  4. /*-----Скрипт должен проверять IP пользователя, если IP есть в списке (массиве),
  5. то возвращать приветствие, если IP нет в списке (массиве),
  6. то возвращать ругательство и перенаправлять пользователя на другую страницу.
  7. Проблема в том, что он перенаправляет всех пользователей? в том числе и с правильным IP
  8. ------*/
  9.  
  10. // Список зарегистрированных пользователей с IP
  11. $user['Balbes']='192.168.0.22';
  12. $user['Trus']='192.168.0.23';
  13. $user['Byvaly']='192.168.0.24';
  14. $user['Ilya']='192.168.0.25';
  15. $user['Dobrynya']='192.168.0.26';
  16. $user['Alyosha']='192.168.0.27';
  17. $user['Admin']='127.0.0.1'; //Для проверки работы скрипта эту строчку нужно комментировать
  18.  
  19. function userIP($user){
  20.                 foreach($user as $login=>$ip){
  21.                         if ($_SERVER[REMOTE_ADDR] == $ip) {
  22.                                 $str="<h2 align='center'>Дорогой $login, рады вас видеть! Читайте и наслаждайтесь!</h2>";
  23.                                                                
  24.                         }else{
  25.                                 $strRedirect='<meta http-equiv="refresh" content="5; url=index8reg.php">'; // !Почему-то эта строка кода срабатывает, даже когда условие в блоке IF верно.
  26.                                 //Видимо, оно успевает срабатывать, пока цикл ведет перебор элементов массива. Как этого избежать? Если сюда написать строку echo - она тоже срабатывает, даже если верно решение в блоке IF
  27.                        
  28.                                 $str="<h2>У вас нет прав доступа к нашему замечательному сайту. Пожалуйста, зарегистрируйтесь</h2>
  29.                                 <h3>Через 5 секунд вы будете перенаправлены на страницу регистрации</h3>";}
  30.                 }
  31.                
  32.                 return $userIPinput = array ("str"=>$str, "strRedirect"=>$strRedirect);
  33. }
  34.  
  35. $userIPinput=userIP($user);
  36.        
  37. ?>
  38.  
  39. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  40. <html>
  41. <head>
  42. <?= $userIPinput[strRedirect]; ?>
  43. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  44. <title>Зверски интересный сайт</title>
  45.  
  46. </head>
  47.  
  48. <body bgcolor="cyan">
  49. <h1>Жутко интересная страница</h1>
  50. <?=$userIPinput[str];?>
  51.  
  52. </body>
  53. </html>
  54.  

Скачать файл: index8.php
Скачан раз: 33
 
 Top
Mikhail_Z
Отправлено: 25 Июня, 2014 - 07:59:32
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2014  


Помог: 0 раз(а)




Ну и второй файлик - якобы "страница регистрации", на которую происходит редирект.
Обе странички должны быть в одной директории.
Скачать файл: index8reg.php
Скачан раз: 46
 
 Top
Sail
Отправлено: 25 Июня, 2014 - 08:15:08
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Не факт, что проверяемый ip-адрес будет первым в списке разрешенных.
Можно как-то так:
PHP:
скопировать код в буфер обмена
  1. $bPermit = FALSE;
  2. foreach($user as $login=>$ip) {
  3.   if ($_SERVER['REMOTE_ADDR'] == $ip) {
  4.     $bPermit = TRUE;
  5.     break;
  6.   }
  7. }
  8. if($bPermit) {
  9.  // say hello!
  10. } else {
  11.  // say bye-bye & redirect
  12. }
  13.  

(Отредактировано автором: 25 Июня, 2014 - 08:17:52)

 
 Top
Mikhail_Z
Отправлено: 25 Июня, 2014 - 08:28:29
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2014  


Помог: 0 раз(а)




Sail пишет:
Не факт, что проверяемый ip-адрес будет первым в списке разрешенных.


Да, я тоже об этом подумал, и что надо как-то "заткнуть" моменты перебора неправильных IP.
Теперь по коду.
Вы добавили в тело цикла условие, которое меняет значение переменной с FALSE на TRUE.
Условия для приветствия/редиректа вынесли за цикл.
Это понятно.
А что там делает слово "break"? Прекращает работу цикла, когда найдено соответствие IP в массиве? Иначе цикл может продолжить работу и значение переменной опять изменится на FALSE?
 
 Top
Sail
Отправлено: 25 Июня, 2014 - 08:39:34
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Mikhail_Z пишет:
А что там делает слово "break"? Прекращает работу цикла, когда найдено соответствие IP в массиве? Иначе цикл может продолжить работу и значение переменной опять изменится на FALSE?

Да, прекращает.
Если "цикл продолжит работу", значение той переменной не изменится. Но зачем лишние итерации?
 
 Top
Mikhail_Z
Отправлено: 25 Июня, 2014 - 09:01:45
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2014  


Помог: 0 раз(а)




Sail
Спасибо! Все работает!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB