2012-12-08 8 views
5

niech mi tylko najpierw powiedzieć, że próbowali wyciąć poniższy kod tak małe jak to możliwe:Jak zatrzymać rozwijanego menu wyświetlania „Wybierz opcję” gdy wyświetlany jest komunikat o błędzie

 <?php 
     // required variables (make them explciit no need for foreach loop) 

     $getyear  = (isset($_POST['year'])) ? $_POST['year'] : ''; 
     $getpass  = (isset($_POST['studentpass'])) ? $_POST['studentpass'] : ''; 
     $getretypepass = (isset($_POST['retypepass'])) ? $_POST['retypepass'] : ''; 
     $errormsg  = (isset($errormsg)) ? $errormsg : ''; 

     $validSubmission = isset($_POST['registerbtn']) && $_POST['year'] && $_POST['studentpass'] && $_POST['retypepass']; 

     $min_year = 1; 
     $max_year = 10; 
     $years = range($min_year, $max_year); // returns array with numeric values of 1900 - 2012 
     $yearHTML = ''; 
     $yearHTML .= '<select name="year" id="yearDrop">' . PHP_EOL; 
     $yearHTML .= '<option value="">Please Select</option>' . PHP_EOL; 
     foreach ($years as $year) { 
      if (!$validSubmission && isset($_POST['year']) && $year == $_POST['year']) { 
       $yearHTML .= "<option value='" . $year . "' selected='selected'>$year</option>" . PHP_EOL; 
      } else { 
       $yearHTML .= "<option value='" . $year . "'>$year</option>" . PHP_EOL; 
      } 
     } 

     $yearHTML .= '</select>'; 


     if ((isset($_POST['registerbtn']))) { 
      if (in_array($_POST['year'], $years) === true) { 
       $getyear = (int) $_POST['year']; 
      } 
      $getpass  = $_POST['studentpass']; 
      $getretypepass = $_POST['retypepass']; 


      if ($getyear) { 
       if ($getpass) { 
        if (strlen($getpass) <= 5) { 
         $errormsg = "The Password must be a minimum of 6 characters or more"; 
        } else { 
         if ($getretypepass) { 
          if ($getpass === $getretypepass) { 
           //perform 2 queries, one query contains $aliasnumrows and other contains $numrows 

           if ($aliasnumrows == 0) { 
            if ($numrows == 0) { 
             //perform query which contains $numrows 


             if ($numrows == 1) { 
              $errormsg = "<span style='color: green'>Student has been Registered</span>"; 

              $getyear = ""; 


             } else { 
              $errormsg = "An error has occured, Student has not been Registered"; 

             } 

            } 

            else { 
             $errormsg = "There is already a Student with that Username"; 
            } 
           } 

           else { 
            $errormsg = "There is already a Student with that Alias"; 
           } 
          } 

          else { 
           $errormsg = "Your Passwords did not match"; 
          } 
         } 

         else { 
          $errormsg = "You must retype your Password to Register"; 
         } 
        } 
       } else { 
        $errormsg = "You must enter in a Password to Register"; 
       } 

      } 

     else{ 
    $errormsg = "You must enter in Student's current Academic Year to Register"; 
    } 

    } 

$form = " 
<form action='" . htmlentities($_SERVER["PHP_SELF"]) . "' method='post'> 
    <table> 
    <tr> 
    <td></td> 
    <td id='errormsg'>$errormsg</td> 
</tr> 
    <tr> 
    <td>Year:</td> 
    <td>{$yearHTML}</td> 
    </tr> 
    <tr> 
    <td>Password:</td> 
    <td><input type='password' name='studentpass' value='' /></td> 
    </tr> 
    <tr> 
    <td>Retype Password:</td> 
    <td><input type='password' name='retypepass' value='' /></td> 
    </tr> 
    <tr> 
    <tr> 
    <td></td> 
    <td><input type='submit' value='Register' name='registerbtn' /></td> 
    </tr> 
    </table> 
    </form>"; 

    echo $form; 

Ok to jest kwestia, którą mam. Mam rozwijane menu od lat i dwa wejścia tekstowe do wpisywania hasła i ponownego wpisywania hasła. Teraz, jeśli użytkownik wybierze rok z rozwijanego menu i prześle formularz, wyświetli komunikat o błędzie z informacją, że należy wprowadzić hasło, a menu rozwijane roku nadal wyświetla opcję wybraną przez użytkownika z rozwijanego menu roku.

Problem polega na tym, że jeśli pojawi się jeden z poniższych komunikatów, opcja rozwijana wraca do wyświetlania "Wybierz proszę". Moje pytanie brzmi: jak mogę zatrzymać rozwijane menu wracając do opcji "Proszę wybrać", gdy pojawią się następujące komunikaty o błędach?

$errormsg = "There is already a Student with that Username"; 
$errormsg = "There is already a Student with that Alias"; 
$errormsg = "Your Passwords did not match"; 
$errormsg = "You must retype your Password to Register"; 

Linia kodu wierzę potrzeby zmieniania jest tutaj:

$validSubmission = isset($_POST['registerbtn']) && $_POST['year'] && $_POST['studentpass'] && $_POST['retypepass']; 
+0

Kod zawiera wiele logiki, która jest niezwykle trudne do naśladowania (nie wspominając o niewygodne, gdy ktoś ma więcej niż jeden błąd, ponieważ będzie tylko pokazać jedną z nich i będą musieli ponownie złożyć formularz). Kiedy sprawdzam poprawność formularzy, dodajemy wszystkie moje błędy do tablicy, a następnie przeglądam je, aby wyświetlić je użytkownikowi. – Mike

+0

@Mike Tak, to jest jedno z ulepszeń, które mogę zrobić. Szczerze mówiąc, robię z powrotem koniec, więc czy to zależy od mnie, czy to do osoby prowadzącej front end? – user1881090

Odpowiedz

1

myślę co szukasz to:

// This is just a suggestion, but I would set these to null instead of an empty string: 
    $getyear  = (isset($_POST['year'])) ? $_POST['year'] : null; 
    $getpass  = (isset($_POST['studentpass'])) ? $_POST['studentpass'] : null; 
    $getretypepass = (isset($_POST['retypepass'])) ? $_POST['retypepass'] : null; 
    $errormsg  = (isset($errormsg)) ? $errormsg : null; 
// You have already defined these, so no need to use $_POST here 
// Also, I like to compare it to an actual value rather than just doing if ($variable) 
// to avoid unforseen circumstances. Note, isset() returns false if $var == null. 
$validSubmission = (isset($_POST['registerbtn']) && isset($getyear) && isset($getpass) && isset($getretypepass)); 

Wtedy myślę, że masz swoją logikę wstecz później:

foreach ($years as $year) { 
     if ($validSubmission && $year == $getyear) { 
      $yearHTML .= "<option value='" . $year . "' selected='selected'>$year</option>" . PHP_EOL; 
     } else { 
      $yearHTML .= "<option value='" . $year . "'>$year</option>" . PHP_EOL; 
     } 
    } 
+0

Wierzę, że używa on $ validSubmission do sprawdzenia, czy wartości nie są "falsey", a nie, jeśli są ustawione. –

+0

To prawda, myślę, że może jego logika jest odwrotna, a on odwraca swój test na '$ validSubmission' później. – Mike

+0

Czy muszę pozbyć się plików isset() znajdujących się u góry skryptu, które już mam i które zawierają isset w '$ validSubmiision', o czym wspomniałeś? – user1881090

0

Problemem jest to, że Piszesz powrotem do serwera, a serwer jest ponownie renderowania strony. Aby to zrobić, , odpowiednio i w sposób, który będzie działał we wszystkich przeglądarkach, będziesz musiał powtórzyć wyniki $ _POST (po prawidłowym wydostaniu się z nich) z powrotem do elementów wejściowych.

Podobnie, należy użyć wartości $ _POST w polu wyboru, aby określić, który znacznik option powinien mieć ustawiony atrybut .

1

Kiedy zasiedlać te rozwijaną roku, prawdopodobnie nie dbasz o to, czy jakakolwiek część zgłoszenia jest ważna, czy nie, po prostu chcesz go ponownie zaludnić, niezależnie od tego. Po prostu porzuć tę logikę.

foreach ($years as $year) { 
    if (isset($_POST['year']) && $year == $_POST['year']) { 
     $yearHTML .= "<option value='" . $year . "' selected='selected'>$year</option>" . PHP_EOL; 
    } else { 
     $yearHTML .= "<option value='" . $year . "'>$year</option>" . PHP_EOL; 
    } 
} 
+0

Zgadzam się. To chyba lepsza odpowiedź niż moja. – Mike