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:
Da funktioniert auch soweit alles, dann kommt das register.php
Und dort scheitert es:
Und die Funktion showInfo sieht so aus:
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
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
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 ü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ß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ügt, sie alter Fuchs. Sie können sich nun anmelden. Viel Spaß 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;
Ich danke euch vielmals für jede hilfreiche Antwort
Euer am verzweifelnder DonFab
Zuletzt bearbeitet: