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
Форумы портала PHP.SU :: Версия для печати :: Перебор массива и редирект по условию -- редирект происходит в любом случае (почему и как с этим бороться?)
Форумы портала PHP.SU » » Вопросы новичков » Перебор массива и редирект по условию -- редирект происходит в любом случае (почему и как с этим бороться?)

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

1. Mikhail_Z - 25 Июня, 2014 - 07:56:54 - перейти к сообщению
Есть задачка. В массив помещаем 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.  
2. Mikhail_Z - 25 Июня, 2014 - 07:59:32 - перейти к сообщению
Ну и второй файлик - якобы "страница регистрации", на которую происходит редирект.
Обе странички должны быть в одной директории.
3. Sail - 25 Июня, 2014 - 08:15:08 - перейти к сообщению
Не факт, что проверяемый 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.  
4. Mikhail_Z - 25 Июня, 2014 - 08:28:29 - перейти к сообщению
Sail пишет:
Не факт, что проверяемый ip-адрес будет первым в списке разрешенных.


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

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

 

Powered by ExBB FM 1.0 RC1