2014-01-21 3 views
0

Я получил этот цикл прямо здесь с массивами, чтобы проверить, совпадает ли имя пользователя и пароль. Моя проблема в том, что мне нужно отобразить всплывающее сообщение, в котором будут указаны «Недопустимое имя пользователя/пароль», если они не совпадают и просто вернутся в форму. Но происходит то, что он проходит через цикл и отображает мое всплывающее сообщение каждый цикл. Вот мой код:Логика на петле с foreach в PHP

if (isset($_POST['submit'])) 
    { 
    $login = array 
     ( 
       0=>array 
        ('username'=>'Art', 
         'password'=>'[email protected]', 
         'user_id'=>'1'    
        ), 
       1=>array 
        ('username'=>'Berto', 
         'password'=>'1234', 
         'user_id'=>'2' 
        ), 
       2=>array 
        ('username'=>'Carrie', 
         'password'=>'5678', 
         'user_id'=>'3' 
        ), 
       3=>array 
        ('username'=>'Dino', 
         'password'=>'qwer', 
         'user_id'=>'4' 
        ), 
       4=>array 
        ('username'=>'Ely', 
         'password'=>'asdf', 
         'user_id'=>'5' 
        ) 
      ); 


foreach($login as $sub_array) 
     { 

      $uname = $_POST['user']; 
      $pass = $_POST['password']; 
      if ($uname == $sub_array['username'] && $pass == $sub_array['password']) 
       { 
        $message = ($sub_array['user_id']); 
        echo "<script type='text/javascript'> 
        alert('Your user ID is : $message'); 
        </script>"; 

       } 
      else 
       { 
        echo "<script type='text/javascript'> 
        alert('Invalid username/password.'); 
        </script>"; 
       } 
     } 
} 

ответ

2

Не печатайте сообщение в цикле, просто проверьте, существует ли это имя. И прекратите цикл, как только вы его найдете. Кроме того, поскольку и $password не меняются, вы должны установить их вне цикла.

$found_user = false; 
$uname = $_POST['user']; 
$pass = $_POST['password']; 

foreach ($login as $sub_array) { 
    if ($uname == $sub_array['username'] && $pass == $sub_array['password']) { 
     found_user = true; 
     $message = $sub_array['user_id']; 
     break; 
    } 
} 

if ($found_user) { 
    $message = ($sub_array['user_id']); 
    echo "<script type='text/javascript'> 
    alert('Your user ID is : $message'); 
    </script>"; 

} else { 
    echo "<script type='text/javascript'> 
    alert('Invalid username/password.'); 
    </script>"; 
} 
+0

Спасибо @Barmar. Этот код работал для меня. –

0

установить переменную (в моем случае $val)

foreach($login as $sub_array) 
      { 

       $uname = $_POST['user']; 
       $pass = $_POST['password']; 
       if ($uname == $sub_array['username'] && $pass == $sub_array['password']) 
        { 

         $val=1; 
         break; 

        } 
       else 
        { 
         $val=0; 
        } 
      } 
    } 
if(!empty($login)) 
{ 
    if($val==1){ 
    $message = ($sub_array['user_id']); 
    echo "<script type='text/javascript'> 
         alert('Your user ID is : $message'); 
         </script>"; 
    } 

    else 
    { 
    echo "<script type='text/javascript'> 
    alert('Invalid username/password.'); 
    </script>"; 
    } 
} 
else 
echo"empty array"; 
+0

Ваш будет работать только в том случае, если совпадающее имя является последним в массиве. – Barmar

+0

@Barmar correct, я добавил break :) –

+0

, если массив пуст, вы получите доступ к неинициализированной переменной '$ val'. – Barmar

0

Вы должны показать одно предупреждение, если один пользователь и пароль не совпадают, вы не можете сделать это для нескольких пользователей. просто положите перерыв после эхо-сигнала.

Другое дело, что вы должны назначить $user и $pass вне цикла. он не должен назначать каждый раз в цикле.

if (isset($_POST['submit'])) 
    { 
    $login = array 
     ( 
       0=>array 
        ('username'=>'Art', 
         'password'=>'[email protected]', 
         'user_id'=>'1'    
        ), 
       1=>array 
        ('username'=>'Berto', 
         'password'=>'1234', 
         'user_id'=>'2' 
        ), 
       2=>array 
        ('username'=>'Carrie', 
         'password'=>'5678', 
         'user_id'=>'3' 
        ), 
       3=>array 
        ('username'=>'Dino', 
         'password'=>'qwer', 
         'user_id'=>'4' 
        ), 
       4=>array 
        ('username'=>'Ely', 
         'password'=>'asdf', 
         'user_id'=>'5' 
        ) 
      ); 


      $uname = $_POST['user']; 
      $pass = $_POST['password']; 
    foreach($login as $sub_array) 
     { 


      if ($uname == $sub_array['username'] && $pass == $sub_array['password']) 
       { 
        $message = ($sub_array['user_id']); 
        echo "<script type='text/javascript'> 
        alert('Your user ID is : $message'); 
        </script>"; 
        break; 

       } 
      else 
       { 
        echo "<script type='text/javascript'> 
        alert('Invalid username/password.'); 
        </script>"; 
        break; 
       } 
     } 
} 

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

  $uname = $_POST['user']; 
      $pass = $_POST['password']; 
      $output = "<script type='text/javascript'>"; 
    foreach($login as $sub_array) 
     { 


      if ($uname == $sub_array['username'] && $pass == $sub_array['password']) 
       { 
        $message = ($sub_array['user_id']); 

        $output .= "alert(\"Your user ID is : $message \")"; 


       } 
      else 
       { 

        $output .= " alert('Invalid username/password.')"; 

       } 
     } 
} 

     $output .= "</script>"; 
echo $output; 

Это предупредит для всех пользователей в массиве $ входа в систему.

+0

@kenken: вы попробовали это? –

Смежные вопросы