2010-01-08 5 views
1

J'essaie d'apprendre à créer une séquence de connexion. Dans une partie, je voulais déterminer si l'utilisateur a quitté l'un des 3 champs obligatoires vides:Je ne comprends pas comment ce tableau se produit

foreach ($_POST as $key => $value) 
    { 
     if ($key = "school_code" || 
      $key = "user_name" || 
      $key = "password") 
     { 
      if ($value == "") 
       { 
        $a_blank[] = $key ; 
       } 
     } 
    } 

if(@sizeof($a_blank) > 0) 
    { 
     echo '<pre>'; 
     print_r($a_blank); 
     echo '</pre>'; 
    } 

Si l'utilisateur ne saisit rien pour school_code ou user_name, mais ne saisissez un mot de passe, puis clique sur PRÉSENTER, le résultat:

Array 
(
    [0] => 1 
    [1] => 1 
) 

Pourquoi pas le tableau tel résultat (à savoir les valeurs de clé $)?

Array 
(
    [0] => school_code 
    [1] => user_name 
) 

Merci!

+1

Veuillez également poster votre formulaire HTML. – Sampson

+0

Est-ce le code exact que vous utilisez, ou réécrit pour cette question? Parce que, en plus d'utiliser un mauvais opérateur, le code semble correct. Je ne vois pas comment le HTML aurait pu foirer ça. –

+0

@musicfreak, en fonction de quels noms et attributs les éléments et la forme ont, il y a beaucoup de choses qui peuvent être fausses. – Sampson

Répondre

7

La comparaison est avec ==, not =.

$key = "school_code" || $key = "user_name" || $key = "password" 

Devrait être avec == à la place. Vous pouvez écrire cela d'une manière un peu moins bavard aussi:

$options = array("school_code","user_name","password"); 
if (in_array($key, $options) && empty($value)) { 
    $a_blank[] = $key; 
} 
+0

Toujours, ne devrait-il pas imprimer '[0] => school_code'? – Nirmal

+0

Nirmal, je ne sais pas. Je devrais voir le formulaire HTML. – Sampson

+0

Non, il ne devrait pas l'être, car l'opérateur or a une priorité plus élevée que l'opérateur d'affectation: http://php.net/manual/fr/language.operators.precedence.php. Le résultat de l'opérateur or est affecté à la variable clé $, c'est-à-dire $ key = (boolean) 'school_code' || ... –

2

Lorsque vous faites une comparaison, souvenez-vous d'utiliser deux signes égaux (==) au lieu d'un seul (=). Un seul signe égal est assignation, deux est comparaison.

Prenez cet exemple:

$val = false; 
if ($val = true) 
    foo(); 

Si vous utilisez = dans la déclaration if, foo() sera appelée. Ce que vous êtes en train de faire est en réglant la valeur de $val à true directement à l'intérieur de l'instruction if. Dans ce cas, , il sera toujours vrai. Ce n'est pas ce que tu veux.

$val = false; 
if ($val == true) 
    foo(); 

C'est ce que vous voulez. Ici, foo() ne sera pas appelé.

Pour plus d'informations, voir le PHP docs.

1

Deux problèmes avec ce code.

Le

$key = "school_code" || $key = "user_name" || $key = "password" 

assignera à la clé $ le résultat de la logique ou qui sera toujours vrai (== 1).

L'autre problème est que, selon le navigateur, les valeurs de formulaires "vides" ne sont pas toujours retournées donc si l'utilisateur laisse le mot de passe vide, il peut ne pas apparaître dans le tableau $ _POST.

Vous feriez bien mieux de faire un simple "si" plutôt que des astuces de tableau pour cela.

$missing = array(); 
foreach (array('school_code','user_name','password') as $nm 
if (!isset($_POST[$nm] length($_POST[$nm]) == 0) { 
     $missing[] = $nm; 
} 
+0

Pour autant que je sache, les zones de texte vides sont toujours retournées. Seules les cases à cocher et les cases d'option vides ne sont pas renvoyées par les navigateurs. – Nirmal

0

J'ai essayé ce code (en utilisant == comme comparaison bien sûr) et cela fonctionne bien.

Ceci est le résultat que je suis:

Array 
(
    [0] => school_code 
    [1] => password 
) 

Mais lorsqu'il est exécuté avec l'original (en utilisant par erreur le signe =), il retourne:

Array 
(
    [0] => 1 
    [1] => 1 
) 

Le problème est que le demandeur est en utilisant = comparer au lieu de ==. Donc la solution est d'utiliser == et cela fonctionnera.

Quelqu'un peut-il expliquer cela?

+1

Il semble que l'opérateur-or || a une priorité plus élevée que l'opérateur set =. Avec des parenthèses, le code ressemblerait à $ key = ("code_école" || $ key = ("nom_utilisateur" || $ key = "mot de passe"))). Et en php "school_code" est égal à 1 en tant que drapeau booléen. Le manuel de priorité des opérateurs le confirme: http://php.net/manual/fr/language.operators.precedence.php –

+0

La correction de = to == devrait donc résoudre le problème. Peut-être que les crochets devraient être utilisés aussi pour éviter la confusion. Ou puisque les opérateurs de comparaison (==) ont une priorité supérieure à || ça ne devrait pas vraiment faire la différence. – Chaim

0

Merci pour toute l'aide avec ma question! Je suis frustré que le "==" vs "=" m'a encore une fois fait trébucher. Je voudrais pouvoir définir mon IDE de sorte que chaque fois que je tapais un signe égal, une petite fenêtre me demandait, "Es-tu sûr?"

FWIW, voici le code HTML:

<?php 
session_start() ; 
$_SESSION["form_token"] = md5(rand(time(), true)) ; 
?> 

<!-- Display login form --> 
<div id="login"> 
<p>Please supply your username, 3-digit school code, and password.</p> 

<form action = "<?php echo $_SERVER['PHP_SELF']; ?>" 
     method = "post"> 

<Input type = "hidden" 
     name = "form_token" 
     value = "<?php echo $_SESSION['form_token']; ?>" /> 

<dl> 
<dt><strong>Username</strong></dt> 
<dd><input type = "text" 
      name = "user_name" /></dd><br/> 

<dt><strong>School code</strong></dt> 
<dd><input type = "text" 
      name = "school_code" /></dd><br/> 

<dt><strong>Password</strong></dt> 
<dd><input type = "password" 
      name = "password" /></dd> <br/> 

<dd><input type = "submit" 
      name = "action" 
      value = "Login" /></dd> 
</dl> 
</form> 
0

lorsque vous utilisez cette comapring si ($ key == "school_code" || ..)

vous pouvez avoir un tel bug si vous taper à tort « = » au lieu « == »

truc sympa est l'utiliser de cette façon: si (« school_code » == $ key || ... et vous ne serez jamais a ce bug, car une autre façon, il serait erreur

désolé pour le mauvais anglais.

Questions connexes