2016-04-13 7 views
1

Langsam lernen PHP mit viel viel mehr zu gehen. Ich fand mich an einem Punkt in dem Buch, ich denke, ist nützlich, Codierung Beispiel. Ich möchte ein Benutzerpasswort auf Länge und Komplexität überprüfen. Ja, ich verstehe, dass es viel Platz für längere und komplexere Passwörter gibt. Dieses Problem ist gut genug für mich, um langsam zu lernen. Anforderungen sind genau 9 Zeichen und 1 @ -Zeichen. Alle anderen Zeichen sind erlaubt. Nicht sicher, warum Fehlermeldungen nicht zurückgegeben werden, wenn das Passwort nicht den Anforderungen entspricht. Jede Hilfe ist willkommen und weiß, dass dies wahrscheinlich ein geschlagenes totes Pferd ist. Die meisten anderen Antworten hier sind komplexer als ich es will, werde aber irgendwann dort ankommen. Bitte konstruktiv kommentieren ... Danke!Fehlermeldungen werden dem Benutzer nicht angezeigt

<?php 
     $pwd = filter_input(INPUT_GET, 'password'); 
     $errmsg = ""; 

     //function with 2 parameters/one passed by reference 
     function passVal($pwd) { 
      $errmsg = null; 
      if (!preg_match('/^(?=.*[@]){9}$/', $pwd)) { 
        $errmsg = "Password must contain exactly 9 characters and one @ sign."; 
      } 
      if (strlen($pwd == 9) && preg_match('/(?=.*[@])/', $pwd)) { 
       $errmsg = "Contains exactly 9 characters and there is at least one @ sign. Password is good"; 
      } 
     return $errmsg; 
     } 
?> 

HTML

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Untitled Document</title> 
</head> 

<body> 
<header><h1>Password Check</h1></header> 
<form action="" method="get"> 
<h3>Enter a password in the box.</h3><br> 
<p>The password must be exactly 9 characters and include at least 
one &#64 sign. All other characters are allowed.</p> 
<p>Enter a password<input type="text" name="password"></p> 
<p><button type="submit" formmethod="get" name="button">Check Password</button></p> 
<p><?php echo $errmsg; ?></p> 
</body> 
</html> 
+1

Wo genau Sie die "passVal" -Funktion nennend? – dquinonez

+0

Zum einen scheinen Sie nicht tatsächlich die Funktion passVal() aufzurufen. – WillardSolutions

+0

Und Sie lesen das übermittelte Passwort von $ _GET nirgends. – WillardSolutions

Antwort

3

Neben den anderen Antworten gegeben. Sie haben nie die passVal() Funktion aufgerufen.

Ihre bedingte Anweisung für strlen() ist fehlgeschlagen.

if (strlen($pwd == 9) && preg_match('/(?=.*[@])/', $pwd)) 

und sollte, und Umwickeln $pwd in Klammern lesen:

if ((strlen($pwd) == 9) && preg_match('/(?=.*[@])/', $pwd)) 

gemäß dem Handbuch http://php.net/manual/en/function.strlen.php auf der strlen() Funktion.

  • strlen($str);

Ihre (strlen($pwd == 9) wird also hier scheitern.

Sie können also hinzufügen und Echo die Funktion mit dem $pwd Parameter:

echo passVal($pwd); 

nach

return $errmsg; 
} 

Doch einer bedingten Anweisung für sie überprüfen, ob sie gesetzt ist/nicht leer wäre besser.

Nebenbei bemerkt edit: Es scheint, dass Sie nicht das Formular schließen off haben, so dass, wenn Ihr eigentlichen Code ist, was Sie brauchen, es </form>.


mit der Idee bearbeiten Spielt.

Sie können auch einen ternären Operator verwenden, um sowohl eine bedingte empty() als auch die Funktion in derselben Zeile zu überprüfen.

Ie .: <p><?php echo !empty($pwd) ? passVal($pwd) : ''; ?></p> und definieren zwei verschiedene Nachrichten, die $errmsg von $msg_bad und $msg_good zugeordnet sind.

Hier ist eine vollständige Rewrite:

<?php 

$pwd = filter_input(INPUT_GET, 'password'); 

$msg_bad = "<b>Password must contain exactly 9 characters and one @ sign.</b>"; 
$msg_good = "Contains exactly 9 characters and there is at least one @ sign. Password is good"; 


//function with 2 parameters/one passed by reference 
function passVal($pwd) { 

global $msg_good, $msg_bad; 

    $errmsg = null; 


    if ((strlen($pwd) == 9) && preg_match('/(?=.*[@])/', $pwd)) { 

     $errmsg = $msg_good; 

    } 

    else { 

     $errmsg = $msg_bad; 

    } 

    return $errmsg; 

} 


?> 
<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Untitled Document</title> 
</head> 

<body> 
<header><h1>Password Check</h1></header> 

<form action="" method="get"> 
<h3>Enter a password in the box.</h3> 
<p>The password must be exactly 9 characters and include at least 
one &#64 sign. All other characters are allowed.</p> 
<p>Enter a password<input type="text" name="password"></p> 
<p><button type="submit" formmethod="get" name="button">Check Password</button></p> 
</form> 

<p><?php echo !empty($pwd) ? passVal($pwd) : ''; ?></p> 

</body> 
</html> 
+0

Das ist eine gute Erklärung. Es scheint, als würde mir immer eine kritische Syntax fehlen. Leider sind meine Mittel zum Debuggen, außer zu Hause, begrenzt. Ich habe diese Antwort akzeptiert, weil mein Ziel darin bestand, Regex in diesem Code zu verwenden und nicht zu arbeiten. Fehler behoben und jetzt funktioniert es. Vielen Dank! – allendks45

+0

@ allenks45 Gern geschehen, war froh, Ihnen geholfen zu haben. Ich habe eine kleine Bearbeitung meiner Antwort vorgenommen, bei der ich nicht sicher war, ob Ihr Arbeitscode das abschließende ''-Tag enthält oder nicht. Ich habe das zu meiner Antwort am unteren Rand hinzugefügt, * Prost * –

0

Überprüfen Sie den Code unten, zog ich die $ errmsg Variable nach unten und rufen Sie die Funktion den Rückgabewert, um es zuzuweisen.

<?php 
$pwd = $_GET['password']; 

//function with 2 parameters/one passed by reference 
function passVal($pwd) { 
    $errmsg = null; 

    if (!preg_match('/^(?=.*[@]){9}$/', $pwd)) { 
     $errmsg = "Password must contain exactly 9 characters and one @ sign."; 
     } 

    if (strlen($pwd == 9) && preg_match('/(?=.*[@])/', $pwd)) { 
     $errmsg = "Contains exactly 9 characters and there is at least one @ sign. Password is good"; 
} 
    return $errmsg; 
} 

**$errmsg = passVal($pwd);** 

?> 
<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Untitled Document</title> 
</head> 

<body> 
<header><h1>Password Check</h1></header> 
<form action="" method="get"> 
<h3>Enter a password in the box.</h3><br> 
<p>The password must be exactly 9 characters and include at least 
one &#64 sign. All other characters are allowed.</p> 
<p>Enter a password<input type="text" name="password"></p> 
<p><button type="submit" formmethod="get" name="button">Check Password</button></p> 
<p><?php echo $errmsg; ?></p> 
</body> 
</html> 
0

Soweit ich kann nie die passVal Funktion sehen nennen. Sie sollten etwas in der Art tun:

Eine Funktion wird nicht automatisch einfach aufgerufen, weil Sie ein Formular senden. In der Tat sollten Sie immer überprüfen, ob ein Formular eingereicht wurde und dann die Verarbeitung durchführen, die Sie benötigen.

Idealerweise sollten Sie Ihre PHP-Logik auch von Ihrem HTML trennen, aber das ist ein anderes Thema.

0

Sie rufen nicht die Funktion plus, es besteht keine Notwendigkeit für eine Funktion. Tun Sie dies:

<?php 
$pwd = filter_input(INPUT_GET, 'password'); 
$errmsg = ""; 
//function with 2 parameters/one passed by reference 

if ((count($pwd)<9) && (strpos($pwd, "@") == false)) { 
    $errmsg = "Password must contain exactly 9 characters and one @ sign."; 
    } 
else { 
    $errmsg = "Contains exactly 9 characters and there is at least one @sign. Password is good"; 
} 



?> 
<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Untitled Document</title> 
</head> 
<body> 
<header><h1>Password Check</h1></header> 
<form action="" method="get"> 
<h3>Enter a password in the box.</h3><br> 
<p>The password must be exactly 9 characters and include at least 
one &#64 sign. All other characters are allowed.</p> 
<p>Enter a password<input type="text" name="password"></p> 
<p><button type="submit" formmethod="get" name="button">Check Password</button></p> 
<p><?php echo $errmsg; ?></p> 
</body> 
</html> 
Verwandte Themen