Loginskript

DonFab

Ensign
Registriert
März 2008
Beiträge
140
GELÖST: [PHP] Loginskript

Ich versuche derzeit PHP zu lernen und habe dazu http://tut.php-q.net zu Rate gezogen,

ich habe die Grundlagen soweit alle durchgearbeitet und versuche nun das Loginskript zu bauen.. aber ich bin seit zig Stunden am verzweifeln, weil ich ein Problem nicht in den Griff kriege.

Ich würde mich riesig freuen, wenn ihr mir helfen könntet.

Die index.php sieht soweit so aus:

PHP:
<?php
error_reporting(E_ALL);         // Stellt ein, dass alle Errors "reportet" werden
ini_set('display_errors', 1);  // Stellt ein, dass die Errors auch angezeigt werden

include 'includes/constants.php';       // Templates werden integriert
include 'includes/variables.php';
include 'includes/functions.php';


// Verbindung zur Datenbank aufnehmen  
$mysqli = @new MySQLi('localhost', 'root', '', 'game');  // dem mysqli_construct werden (host, user, pw, datenbank)
$ret = 1;                        // speichert den rückgabewert von include, standardwert 1
if (mysqli_connect_errno()) {   // der Rueckgabewert mysqli_connect_errno enthaelt 0 bei einem fehler
    $ret = 'Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error();
} else {


// Laden der Include-Datei
/*
 * Die Include-Datei muss eine return Anweisung enthalten mit folgenden
 * Werten:
 * - Bei normaler Ausführung
 *   Array('filename' => string, -- Dateiname vom Template
 *         'data' => Array())    -- Array mit Daten für das Template
 * - Bei einem Fehler
 *   string  -- Die Fehlermeldung die angezeigt werden soll.
 */

  if (isset($_GET['section'], $dateien[$_GET['section']])) {   // wenn der teil section= in der url besetzt ist und er auch   definiert wurde, dann..
    if (file_exists('includes/'.$dateien[$_GET['section']])) { // und wenn die datei dann auch wirklich existiert
        $ret = include 'includes/'.$dateien[$_GET['section']]; 
    } else {
        $ret = "Include-Datei konnte nicht geladen werden: 'includes/".$dateien[$_GET['section']]."'";
    }
} else {
    // default bereich laden, news
    $ret = include 'includes/'.$dateien['register'];
} 

    
    
 }
 
//laden des HTML-kopf
include 'templates/header.tpl';


// laden der Template-datei (fuer die ausgabe)
if (is_array($ret) and isset($ret['filename'], $ret['data']) and
        is_string($ret['filename']) and
        is_array($ret['data'])) {  
                              // wenn dies alles stimmt haben wir ein gueltiges template
     if (file_exists($file = 'templates/'.$ret['filename'])) {
        $data = $ret['data']; // speichert die Arraydaten in eine Variable $data
                              // die dann im Template verwendet werden kann.
        include $file;
    } else {
                              // Datei existiert nicht, eine Fehlermeldung anzeigen.
        $data = array();
        $data['msg'] = 'Templatedatei "'.$file.'" ist nicht vorhanden.';
        include 'templates/error.tpl';
    }
} else if (is_string($ret)) {
                              // include-Datei lieferte eine String zurück, welches eine Fehlermeldung sein soll
    $data = array();
    $data['msg'] = $ret;
    include 'templates/error.tpl';
} else if (1 === $ret) {
                              // return-Anweisung wurde vergessen
    $data = array();
    $data['msg'] = 'In der Include-Datei wurde die return Anweisung vergessen.';
    include 'templates/error.tpl';
} else {
                             // überhaupt ein ungültiger return-Wert
    $data = array();
    $data['msg'] = 'Die Include-Datei hat einen ungültigen Wert zurückgeliefert.';
    include 'templates/error.tpl';
  }
    
    
// HTML footer laden
include 'templates/footer.tpl';
       

?>



Da funktioniert auch soweit alles, dann kommt das register.php
Und dort scheitert es:


PHP:
<?php
$ret = array();                    // $ret array wird erstellt, er enthaelt den return-wert
$ret['filename'] = 'register.tpl'; // gibt an das spaeter das register.tpl eingebunden werden soll
$ret['data'] = array();
                                     // Testen ob auch das richtige Fomular verwendet wurde (und keins ausserhalb der Homepage                               evt.) indem alle werte getestet werden 

    
if ('POST' == $_SERVER['REQUEST_METHOD']) {    // Testen ob auch POST verwendet wurde (und nicht zb. GET)
    if (!isset($_POST['user'], $_POST['pw'], $_POST['mail'],
               $_POST['formaction'])) {
        return LEERES_FORMULAR;                 // die konstante fuer falsche formulare wird zurueck gegeben   
    
    
    }
}

    if (!is_array($_POST['pw']) OR count($_POST['pw']) != 2) { // pw muss ein array sein und 2 mal geschickt worden sein( wegen wiederholung)
        return FALSCHES_FORMULAR;
    }
    if ($_POST['pw'][0] != $_POST['pw'][1]) {               // die beiden pw's muessen identisch sein
        return 'Bitte geben Sie in beiden Feldern, das gleiche Passwort ein.';
    } 
    if (($user         = trim($_POST['user']))       == ''      OR    //es wird geguckt ob &uuml;berall auch was drinsteht
            ($pw       = trim($_POST['pw'][0]))      == ''      OR    // trim entfernt die leerzeichen am anfang und ende
            ($mail     = trim($_POST['mail']))       == '') {
        return LEERES_FORMULAR;                                       // konstante fuer leeres formluar
    } 
    if (!preg_match('~\A\S{2,30}\z~', $user)) { 
                          // preg_match durchsucht nach bestimmten zeichenketten
        return 'Der Benutzername darf nur aus 2 bis 30 Zeichen bestehen und '.
               'keine Leerzeichen enthalten.';   
                       
    }
    
    $squery ='SELECT                      
                  ID
              FROM
                  User
              WHERE
                  Username = ?
              LIMIT
                  1';                   // der Select Query fragt die datenbank nach der id des users "?" aus der tabelle User, es darf hoechstens ein ergebnis herauskommen (denn sonst waere der name ja bereits 2 mal vergeben"
                
    $stmt = $mysqli->prepare($squery);    //prepare ist eine methode der mysqli klasse und muss gemacht werden um execute oder bind_param  durchzufueren
        if (!$stmt) {                 // wenns nicht geklappt hat gibt es 0 aus
        return $mysqli->error;        //dann muss das ganze abgebrochen werden
    }
    $stmt->bind_param('s', $user); // bind_param ersetzt das ? bei Username mit der Varaible $user (das s besagt das es sich um strings handelt
    $stmt->execute();               // fuerhrt den bind_param dann aus (ersetzt den ? parameter mit variable)
    $stmt->store_result();          // liest nun das ergenis der query anfrage aus der datenbank
    if ($stmt->num_rows) {          //num_rows gibt die anzahl von reihen des ergenisses aus (also: wenn es den namen gibt 1 sonst 0)
        return 'Der Username wird bereits verwendet.';
    }
    $stmt->close();                 //schlie&szlig;t das statement
    
    
    $squery = 'INSERT INTO          
                  user(username, mail)
               VALUES
                  (?, ?)';         // dieser query soll nun die neuen werte in die tabelle einfuegen
    $stmt = $mysqli->prepare($squery);
    if (!$stmt) {
        return $mysqli->error;
    }
    $stmt->bind_param('ss', $user, $mail);     // ss fuer "beides strings"
    if (!$stmt->execute()) {
        return $stmt->error;                        // wenn execute fehlschlaegt abbrechen
    }
   
    
    $UserID = $stmt->insert_id;               //insert_id gibt die fuer den letzten datensatz erzeugte id aus
    $sql = 'UPDATE
                User
            SET
                pw = ?
            WHERE
                ID = ?';                      //wir updaten die daten des erstellten users (pw fehlt ja noch)
    $stmt = $mysqli->prepare($squery);               // wie immer erstmal preparen
    if (!$stmt) {
        return $db->error;
    }
    $Hash = md5(md5($UserID).$pw);      //wir haben ja zur sicherheit bei dem abfrage template die hash funktion benutzt daher muss dieser nun auch als hashwert eingegeben werden
    $stmt->bind_param('si', $Hash, $UserID);   //nun wieder die ? ersetzen s sagt das erste ist ein string, i sagt das zweite ist ein integer
    if (!$stmt->execute()) {              //und durchfuehren das ganze
        return $stmt->error;
    }    
        
      // noch eine kleine meldung das auch wirklich alles geklappt hat:   
    return showInfo('Ihre Registrierungsdaten wurden den Datenbank hinzugef&uuml;gt, sie alter Fuchs. Sie k&ouml;nnen sich nun anmelden. Viel Spa&szlig; beim gamen, wuenscht ihr Eichhornstudios-online-Team');
    
?>

Und die Funktion showInfo sieht so aus:

PHP:
function showInfo($msg) {
    $ret = array();
    $ret['filename'] = 'info.tpl';
    $ret['data'] = array();
    $ret['data']['msg'] = $msg;
    return $ret;
}



Ich bekomme immer die Fehlermeldung: "In der Include-Datei wurde die return Anweisung vergessen." ,
deswegen dachte ich müsste ich vllt am Ende von register.php ein
PHP:
return $ret;
einbauen, aber es funktioniert trotzdem nicht, $ret wird ja irgendwie auch garnicht bestimmt im register.php...... ich komme nicht weiter.

Ich danke euch vielmals für jede hilfreiche Antwort


Euer am verzweifelnder DonFab
 
Zuletzt bearbeitet:
Alles klar hab den Fehler gefunden, es wurde die erste if Abfrage im register.php zu früh geschlossen, weil eig. außer der letzten Anweisung aber alles davon abhängt, hats nicht funktioniert.

-----------------------------------------------------------------------------------------------------------------------
Kann geschlossen werden.
 
Zurück
Oben