2011-01-01 4 views
1

Um PHP und MySQL-Entwicklung zu üben, versuche ich das Benutzerregistrierungssystem für ein Online-Schachspiel zu erstellen.Wie soll ich den Fall behandeln, in dem ein Benutzername bereits verwendet wird?

Was sind die besten Praktiken für:

  • Wie ich sollte die (wahrscheinlich) Möglichkeit zu behandeln, dass, wenn ein Benutzer zu registrieren versucht, den Benutzernamen er sich entschieden hat, ist bereits im Einsatz, vor allem, wenn es darum geht, Funktion Rückgabewerte? Soll ich vor der INSERT-Abfrage eine separate SELECT-Abfrage erstellen?

  • Wie werden unterschiedliche Seitentitel behandelt?
    ($gPageTitle = '...'; require_once 'bgsheader.php'; ist ziemlich hässlich)

(Ein Auszug aus dem Code, den ich bisher geschrieben habe in der Geschichte ist.)

Antwort

1

Führen Sie eine separate SELECT aus, um zu überprüfen, ob der Benutzername bereits verwendet wird, bevor Sie versuchen, INSERT.

Noch wichtiger, ich würde vorschlagen, etwas wie die folgende Struktur für das Skript, das Sie schreiben. Es hat eine starke Trennung der Präsentationslogik (z. B. HTML) von Ihrer anderen Verarbeitung (z. B. Validierung, Datenbank, Geschäftslogik). Dies ist ein wichtiger Aspekt des Model-View-Controller-Paradigmas und wird allgemein als Best-Practice angesehen. Wenn Sie $ _POST Eingabe filtern, können Sie etwas wie array_map() verwenden, das jedes Element eines Arrays durch eine Funktion stellt und es einem neuen Array zuordnet.

<?php 

// The default state of the form is incomplete with no errors. 
$title = "Registration"; 
$form_completed = false; 
$errors = array(); 

// If the user is submitting the form .. 
if ($_POST) { 

    // Validate the input. 
    // This includes checking if the username is taken. 
    $errors = validate_registration_form($_POST); 

    // If there are no errors. 
    if (!count($errors)) { 

     // Add the user. 
     add_user($_POST['username'], $_POST['password']); 

     // The user has completed. 
     $form_completed = true; 

     // Optionally you could redirect to another page here. 

    } else { 

     // Update the page title. 
     $title = "Registration, again!" 

    } 

} 

?> 

<html> 
<head> 
<title>Great Site: <?= $title ?></title> 
<body> 

<?php if ($form_complete): ?> 

    <p>Thanks for registering!</p> 

<?php else: ?> 

    <?php if (count($errors)): ?> 
    <ul> 
    <?php foreach ($errors as $error): ?> 
    <li><?= $error ?></li> 
    <?php endforeach; ?> 
    </ul> 
    <?php endif; ?> 

    <form method="post"> 
    Username: <input type="text" name="username"> 
    Password: <input type="password" name="password"> 
    <input type="submit"> 
    </form> 

<?php endif; ?> 

</body> 
</html> 
0
  1. Sie in Formulare erhalten soll, und lassen Sie Ihre Seite auf eine andere umleiten Seite, wo Sie dort den 'Benutzernamen zur Datenbank einfügen' haben.
  2. Angenommen, der eingegebene Benutzername befindet sich in einer Beitragsvariablen wie $_POST['username'].
  3. Haben Sie Ihre Datenbank zu überprüfen, wo der Benutzername existiert:

    $res = mysql_query("SELECT * FROM table WHERE username='$_POST['username']'") or die(mysql_error()); 
    if(mysql_num_rows($res) > 0) { 
    echo "Username exists."; 
    // more code to handle username exist  
    } else { 
    // ok here. 
    } 
    

Was geschehen ist, ist im Grunde wir überprüfen, ob Ihre Tabelle bereits über einen Benutzernamen enthält. mysql_num_rows($res) gibt 0 zurück, wenn kein Benutzername existiert.

1

Nun, eine Sache, die Sie anstelle von sich wiederholenden Code tun können, nach unten in der Nähe der Unterseite ist dies:

if($result === true) { 
    $gPageTitle = 'Registration successful'; 
    $response = <p>You have successfully registered as ' . htmlspecialchars($username) . ' on this site.</p>'; 
} elseif($result == 'exists') { 
    $gPageTitle = 'Username already taken'; 
    $response = '<p>Someone is already using the username you have chosen. Please try using another one instead.</p>'; 
} else { 
    trigger_error('This should never happen'); 
} 

require_once 'bgsheader.php'; 
echo $response; 
require_once 'bgsfooter.php'; 

Auch Sie können false zurück, anstatt die Zeichenfolge ‚existiert‘ in der Funktion, nicht, dass es macht viel Unterschied.

Überprüfen Sie die Fehlernummer ist nicht schlecht, ich bin mir sicher, deshalb ist es eine im Lieferumfang enthaltene Funktion. Wenn Sie wirklich etwas anderes machen wollten, könnten Sie überprüfen, ob es bereits einen Benutzer mit diesem Namen gibt, indem Sie den Benutzernamen auswählen. Wenn kein Ergebnis vorhanden ist, fügen Sie den Benutzer ein, andernfalls geben Sie den Fehler ein.

Eine Sache, die ich gerne mit der Fehlerbehandlung in Formularen tun würde, ist, alle Fehlerzeichenfolgen in einem Array wie $ error ['username'], $ error ['email'] usw. zu speichern und dann durchlaufen zu lassen der Fehler an jedem Eingang Überprüfung einzeln alle Fehlerstrings zu setzen, und dann eine Funktion hat, die so etwas wie dies funktioniert:

function error($field) 
{ 
    global $error; 
    if(isset($error[$field])) 
    { 
      echo $error[$field]; 
    } 
} 

und rufen Sie dann, dass in der Form nach jedem Feld der Fehlerberichterstattung auf dem Formular zu geben. Natürlich muss die Formularseite an sich selbst übergeben werden, aber Sie könnten alle Fehlerüberprüfungslogik in einer separaten Datei haben und ein Include ausführen, wenn $ _POST ['whatever'] gesetzt ist. Wenn Ihr Formular in einer Tabelle oder einem anderen Format formatiert ist, können Sie beispielsweise echo '<tr><td class="error">' . $error[$field] . '</td></tr> eingeben und automatisch eine weitere Zeile direkt unter dem Feld einfügen, um den Fehler zu speichern, falls vorhanden.

Denken Sie auch immer daran, Ihre Eingaben zu filtern, auch wenn sie automatisch gefiltert werden sollten. Übermitteln Sie Post-Infos niemals direkt in eine Datenbank, ohne sie auszuprobieren.Ich würde auch vorschlagen, die spezifische superglobale Variable für die Aktion zu verwenden, wie $ _POST anstelle von $ _REQUEST, weil $ _REQUEST die Variablen $ _GET, $ _POST und $ _COOKIE enthält und jemand möglicherweise etwas Seltsames tun könnte, wie es auf der Seite einreicht ? username = was auch immer nach der Seite, und dann haben Sie sowohl $ _POST ['Benutzername'] und $ _GET ['Benutzername'], und ich bin mir nicht sicher, wie $ _REQUEST das handhaben würde. Wahrscheinlich würde es einen $ _REQUEST ['username'] [0] und $ _REQUEST ['username'] [1] geben.

Auch ein bisschen über die Seitentitel. Weiß nicht, ob Sie es so eingerichtet haben, aber Sie können in Ihrem Header etwas tun:

$pageTitle = "My Website"; 
if(isset($gPageTitle)) 
{ 
    $pageTitle .= "- $gPageTitle"; 
} 
echo "<title>$pageTitle</title>"; 

, die die Seite zu laden, die normalerweise mit „Meine Website“ als Titel machen würde, und fügen Sie „- Benutzername existiert bereits "oder was auch immer für" Meine Website - Benutzername existiert bereits "als Titel, wenn $ gPageTitle gesetzt ist.

+0

Also, Sie haben eine Funktion, die etwas wie folgt macht: 'function escapestring ($ input) {return mysql_real_escape_string (trimmen ($ input));}' und dann tun $ filterinput = array_map ('escapestring', $ _ POST); 'und Sie erhalten $ filterinput ['username'] $ filterinput ['password'] usw., die über die im ersten Argument von array_map angegebene Funktion übergeben wurden. – Phoenix

0

Ich denke, die Antwort von Mr. Neigyl würde eine separate Reise in die Datenbank erfordern, was keine gute Idee ist, da es nur einen Leistungs-Overhead zu Ihrer App hinzufügen würde. Ich bin kein PHP-Guru, aber ich kenne mich aus, obwohl ich mich nicht an den Operator === erinnere. == Ich erinnere mich. Sie könnten den Funktionsaufruf direkt in die IF-Anweisung übergeben.

if (addUser($username, $passwd)); 

ich nichts falsch sehen mit dem $ gPageTitle Variable, aber Sie werden wahrscheinlich „global“ zuerst müssen erklären und dann Namespaces, damit Sie es tatsächlich innerhalb der „header.php“ zugreifen weil "header.php" nicht wissen wird, wie man die Variablen dieser Seite anspricht. Obwohl ich persönlich mag es nicht, mit Namensräumen durcheinander, und ich würde eher eine Funktion aus der „header.php“ nennen und den Seitentitel hinein

display_title($pgTitle); 

oder

display_title("Registration Successfull"); 

oder

passieren
$header->display_title("Registration Successfull") 

, wenn Sie mögen OO-Stil besser

mich, ob diese Hilfe wissen lassen s. :)

+0

Müsste keine Namespaces verwenden, damit die Headerdatei die Variablen von der Seite erkennt, in der sie enthalten ist. Include enthält die Datei, so wie sie tatsächlich als Teil der Seite geschrieben wird, in der sie enthalten ist Variablen sind gleich. Er müsste auch $ gPageTitle global nicht deklarieren, wenn er nicht innerhalb einer Funktion verwendet wird.Außerdem ist === der Operator für die literale Äquivalenz des Typs. So (int) 7 ist nicht === zu '7', aber (int) 7 === (int) 7. Es gibt auch! == für literale Nicht-Äquivalenz so (int) 7! == '7'. – Phoenix

+0

Das stimmt, aber wenn Sie die "header.php" innerhalb einer anderen Seite ausführen, die nicht den $ pageTitle enthält, erhalten Sie einen Fehler – techexpert

+0

Nicht, wenn Sie überprüfen, ob es isset() in der Header-Datei vor der Verwendung. – Phoenix