Video Tutorial - PHP Registrierung | Loginsystem


Liondo

Grünschnabel
Hallo,

danke erstmal für dieses super Tutorial. Leider habe ich das Problem, das mein SQL Statement fehler macht. Ich bekomme in dem Moment wo das Formular richtig ausgefüllt ist und abgeschickt werden soll, den Hinweis das ein Fehler im SQL Statement ist (Meine error_msg in der besagten Stelle)

Meine einzige Änderung zum Tutorial ist, dass ich den Benutzernamen aus Vor und Nachname generiere. Die UNIQUE Eigenschaft liegt also nur auf email. Weiterhin hat die Datenbank noch weitere Felder wie Adresse, die erst später ausgefüllt werden sollen, diese dürfen laut SQL NULL sein und werden auch nicht angesprochen im Script.

Hier mein geänderter Code:
PHP:
$_POST['vorname'] = trim($_POST['vorname']);
$_POST['nachname'] = trim($_POST['nachname']);
$_POST['pass'] = hash('sha256', $_POST['pass'][0].$salt);

$user_ip = ip2long($_SERVER['REMOTE_ADDR']);

 
$username = $_POST['vorname']."".$_POST['nachname'];

$sql = '
        INSERT INTO
         handballOS_user
         (Username, Password, Email, Vorname, Nachname, UserIP, regDate)
        VALUES
         (?,?,?,?,?,?, NOW())
       ';

$stmt = $db->prepare($sql);
$stmt->bind_param('sssi', $username, $_POST['pass'], $_POST['email'], $_POST['vorname'], $_POST['nachname'], $user_ip);

if(!$stmt->execute()) {
    
    echo $db->error;
    
    if (strpos($db->error, 'Duplicate') !== false) {
        $error_msg = "Die Emailadresse wird bereits verwendet";
    } else {
        $error_msg = "Es ist ein Fehler im SQL Statement aufgetaucht";
    }
    
    return;
}

$stmt->close();

$success_msg = "Das Benutzerkonto für ".$username." wurde angelegt.";

Wo liegt mein Fehler ? Ich erhalte auch keine Fehlermeldung von PHP im Browser.

Beste Grüße
 

m0dpad

Erfahrenes Mitglied
PHP:
$stmt = $db->prepare($sql);
$stmt->bind_param('sssi', $username, $_POST['pass'], $_POST['email'], $_POST['vorname'], $_POST['nachname'], $user_ip);

Wo liegt mein Fehler ? Ich erhalte auch keine Fehlermeldung von PHP im Browser.

Beste Grüße

Du hast zwei 's' zu wenig im bind_param wenn ich das richtig sehe.
 

Wisdom

Grünschnabel
Hey zusammen, erstmal ein dickes Daaaankö für das coole Tut, aber ein kleines Problem habe ich jetzt doch damit .. ich bin auf dem Gebiet noch relativ neu und versuche mich durch Probieren immer weiter voranzutasten.
Ich habe das Script fast 1 zu 1 übernommen um zu sehen was was bewirkt (nur die sql-datenbank heisst anders).
Die Überprüfungen werden alle korrekt ausgeführt und geben auch die richtigen Fehlermeldungen (wenn man zB das PW beim zweiten Mal nicht richtig geschrieben hat oder nicht alle Felder ausgefüllt sind). Gebe ich aber Daten für einen Testaccount ein, den das Script mir einrichten soll, gibt es mir in der lustigen roten Box nur ein: "Es ist ein Fehler aufgetreten".
So sieht mein Code aus der registration_logic.php aktuell aus:
PHP:
<?php

	if(!isset($_POST['submit'])) return;
	
	if(!isset($_POST['username']) || !isset($_POST['pass']) || !isset($_POST['email']) ||
		empty($_POST['username']) || empty($_POST['pass']) || empty($_POST['email']))
			{
				$error_msg="Das Formular wurde nicht vollständig ausgefüllt";
				return;
			}
			if ($_POST['pass'] [0] !== ($_POST['pass'] [1]))
			{
				$error_msg="Die Passwörter stimmen nicht überein";
				return;
			}
			
			$_POST['pass'] = hash('sha256', $_POST['pass'] [0].$salt);
			
			if (strlen($_POST['username']) > 20)
			{
				$error_msg="Der Benutzername ist zu lang";
				return;
			}
			
			$_POST['username'] = trim ($_POST['username']);
			
			if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
			{
				$error_msg="Die Emailadresse ist ungültig";
				return;
			}
			
			$userip=ip2long($_SERVER['REMOTE_ADDR']);
			
			$sql='
					INSERT INTO
					  			users
								(Username, Password, Email, IP, date)
					VALUES
								(?,?,?,?,NOW())';
			$stmt=$db->prepare($sql);
			$stmt->bind_param('sssi', $_POST['username'], $_POST['pass'], $_POST['email'], $user_ip);
			
			if(!$stmt->execute())
				{
					if (strpos($db->error, 'Duplicate') !== false)
					{
						$error_msg="Der Benutzername oder die Emailadresse wurde bereits registriert";
					} 
					else 
					{ 
						$error_msg="Es ist ein Fehler aufgetreten";
					}
				return;
			}
			$stmt->close();
			
			$success_msg="Das Benutzerkonto ".htmlspecialchars($_POST['username'])."wurde erfolgreich angelegt";
			
?>

Ich habe auch schon versucht die Fragezeichen (bei der SQL-Anweisung zum Eintragen der Daten) durch die passenden Formularfelder zu ersetzen (also $username, $pass, usw), aber das hat auch irgendwie nichts gebracht .. kann mir wer einen Hinweis geben wo mein Fehler eventuell liegt? Oder wie ich dem Fehler am besten auf die Spur komme?

Danke schonmal im voraus :)
 

m0dpad

Erfahrenes Mitglied
PHP:
<?php

	if(!isset($_POST['submit'])) return;
	
	if(!isset($_POST['username']) || !isset($_POST['pass']) || !isset($_POST['email']) ||
		empty($_POST['username']) || empty($_POST['pass']) || empty($_POST['email']))
			{
				$error_msg="Das Formular wurde nicht vollständig ausgefüllt";
				return;
			}
			if ($_POST['pass'] [0] !== ($_POST['pass'] [1]))
			{
				$error_msg="Die Passwörter stimmen nicht überein";
				return;
			}
			
			$_POST['pass'] = hash('sha256', $_POST['pass'] [0].$salt);
			
			if (strlen($_POST['username']) > 20)
			{
				$error_msg="Der Benutzername ist zu lang";
				return;
			}
			
			$_POST['username'] = trim ($_POST['username']);
			
			if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
			{
				$error_msg="Die Emailadresse ist ungültig";
				return;
			}
			
			$userip=ip2long($_SERVER['REMOTE_ADDR']);
			
			$sql='
					INSERT INTO
					  			users
								(Username, Password, Email, IP, date)
					VALUES
								(?,?,?,?,NOW())';
			$stmt=$db->prepare($sql);
			$stmt->bind_param('sssi', $_POST['username'], $_POST['pass'], $_POST['email'], $user_ip);
			
			if(!$stmt->execute())
				{
					if (strpos($db->error, 'Duplicate') !== false)
					{
						$error_msg="Der Benutzername oder die Emailadresse wurde bereits registriert";
					} 
					else 
					{ 
						$error_msg="Es ist ein Fehler aufgetreten";
					}
				return;
			}
			$stmt->close();
			
			$success_msg="Das Benutzerkonto ".htmlspecialchars($_POST['username'])."wurde erfolgreich angelegt";
			
?>

Ich habe auch schon versucht die Fragezeichen (bei der SQL-Anweisung zum Eintragen der Daten) durch die passenden Formularfelder zu ersetzen (also $username, $pass, usw), aber das hat auch irgendwie nichts gebracht .. kann mir wer einen Hinweis geben wo mein Fehler eventuell liegt? Oder wie ich dem Fehler am besten auf die Spur komme?

Danke schonmal im voraus :)

Hi,
die Fehlermeldung tritt auf, wenn dein Query zur Datenbank nicht ausgeführt werden kann bzw. fehlerhaft ist, aus welchen Gründen auch immer. Um die Fehlermeldung zu sehen kannst du die Standardnachricht "Es ist ein Fehler aufgetreten" durch $db->error ersetzten, dann siehst du die MySQL Notice.
 

Wisdom

Grünschnabel
muchas gracias :)
ich hab das mal probiert und jetzt weiss ich zumindest, dass es an
der IP liegt "Column 'IP' cannot be null" ^^

jetzt stellt sich mir aber die Frage wie das denn null, bzw leer sein kann .. das wird doch vorher ermittelt, oder bin ich da jetzt leicht schief gewickelt?

~~~

oha ich glaube ich sehe grade was da nicht so ganz klappt :
ich hab einmal $userip und einmal $user_ip :)
 
Zuletzt bearbeitet:

Tim Bureck

Erfahrenes Mitglied
Hi und Willkommen bei tutorials.de,

Fatal error: Call to a member function bind_param() on a non-object in K:\xampp\htdocs\onte\regcode.php on line 51

Das würde bedeuten, dass du versuchst die Methode bind_param() aufzurufen, obwohl kein Objekt da ist. $stmt ist also kein Objekt. Das spricht dafür, dass das Statement einen Fehler hat. Das hier nach dem prepare einfügen:

PHP:
if (!$stmt) {
  echo $db->error;
}

Best regards
 

nemo121281

Grünschnabel
danke ;)!
das was ich klein geschrieben hatte war das gelöste problem;) irgendwie kam mir das heute morgen um 2 logisch vor...
Mein Problem ist das die fehlermeldungen nicht ankommen bzw die succsessmeldung...
 

korona

Mitglied
Hallo,

erstmal ein Lob für die beiten Tutorials. Das gute war/ist es funktioniert!

Ich habe eine Frage zum Login.

Wie verhindere ich, das wenn keine Session vorhanden ist, das bestimmte Seiten auf die ich weiterleite nicht angezeigt werden?
Bei der Lösung erscheint die Seite immer für einen Bruchteil einer Sekunde. Besteht dadurch nicht die Gefahr/Möglichkeit den Quelltext abzugreifen?
Welche anderen Möglichkeiten gibt es noch Seiten zu "sperren"?
Was ist von einer Lösung zu halten mit einer prüf.php die Seiten enthält die nicht frei zugänglich sind und auf den jeweiligen Seiten überprüfe ich die prüf.php?

Danke und Gruß

Code:
<?php
require_once ('config.php');
require_once ('functions.php');
require_once ('login_logic.php');


if(check_login() == false) {
    header ("Refresh: 0; http://localhost/PWAbfrage/login.php");
}

?>

<html>
    <head >
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body >
        
        <?php
            echo "Hallo Welt!";
        ?>

    </body>
</html>
 

sheel

I love Asm
Hi

du kannst auch statt mit HTML direkt mit PHP weiterleiten.
Dann sieht man die erste Seite überhaupt nicht
PHP:
header("Location: http://www.example.com/");

Gruß
 

korona

Mitglied
Hallo,

ich leite ja nur weiter wenn keine Session vorhanden ist. Ich möchte auch nicht, das der Seitenname im header eingegeben werden kann.

Ich muß doch immer html Tags arbeiten für die ordentliche Darstellung im Browser!?
Bzw. ich müßte dann wieder für eine Seite mit mehreren php Seiten arbeiten und require_once, oder?


Gruß
 
Zuletzt bearbeitet:

m0dpad

Erfahrenes Mitglied
Hi,
wenn keine Session da ist, kannst du ja einfach auf eine andere Seite weiterleiten, die Seite kann dann natürlich auch auf einer ganz anderen Datei basieren wie die von der du weiterleitest. Kann dir leider nicht ganz folgen.

Gruß
 

korona

Mitglied
Hi,
in dem Video sagst du das du in der login_logic.php auf jede beliebige Seite weiterleiten kann. Das habe ich gemacht (erster Post). Damit habe ich doch den eigentlichen Login Vorgang beendet und bewege mich in einem geschützten Bereich. Wenn in diesem Bereich mehrere Seiten geschützt sind wie überprüfe ich ob ich eingeloggt bin und ich möchte vermeiden, das jemand über URL Eingabe auf die Seiten kommt. Wie sieht auf dieser/diesen Seite die Überprüfung aus ob die Session vorhanden ist?
Grüß
 

m0dpad

Erfahrenes Mitglied
Hi,
Wie überprüfe ich ob ich eingeloggt bin und ich möchte vermeiden, das jemand über URL Eingabe auf die Seiten kommt. Wie sieht auf dieser/diesen Seite die Überprüfung aus ob die Session vorhanden ist?
Grüß

Na das wird doch auch alles gezeigt, PHP Login Tutorial erstes Video ab ca. 10 Minuten, da wird eine check_login() Funktion erstellt. Mithilfe dieser check_login() Funktion wird eben geprüft, ob der Besucher eingeloggt ist oder nicht.

PHP:
if(check_login() == false) {
   // MACHE DIES WENN BENUTZER NICHT EINGELOGGT IST
   // Zum Beispiel weiterleiten
   header('Location: http://deineDomain.de/notLoggedIn');
   exit;
}
// Alles hier drunter wird ausgeführt, wenn der Benutzer eingeloggt ist
 

m0dpad

Erfahrenes Mitglied
Genau das habe ich gemacht! Schau dir mal bitte meinen ersten Post auf der zweiten Seite ganz unten an.
Gruß

Hey,
na ganz genau so hast du es nicht gemacht, du verwendest zum Beispiel Refresh um weiterzuleiten und ein exit um das Skript zu killen verwendest du auch nicht. Außerdem musst du eine Session starten (session_start(); ganz am Anfang der Datei), bevor das Ganze funktioniert natürlich (weiß jetzt nicht ob das in einer Datei geschieht die du einbindest).

Mit dem exit wird definitiv das was darunter kommt nicht mehr ausgeführt und angezeigt.
 

korona

Mitglied
Hallo,

ich habe da noch mal eine Frage bzw. Problem. Ich habe es mal online gestellt. Das Anmelden hat wunderbar funktioniert allerdings klappt das Login nicht. Nachdem ich den Benutzernamen und Kennwort eingebe bekomme ich diese Fehlermeldung.
Wär super wenn Du aushelfen kannst :D

Danke und Gruß

PHP:
Fatal error: Call to a member function bind_param() on a non-object in /mnt/web7/42/64/52244564/htdocs/meinname/functions.php on line 16
Hier der Code von functions.php
PHP:
1 <?php
 2 function login($username, $password, $db, $salt){
 3     $password = hash('sha256', $password.$salt);
 4     
 5     $sql = '
 6         SELECT
 7                 COUNT(*)
 8         FROM
 9                 USER
10         WHERE
11                 Username = ?
12         AND
13                 Password = ?
14                 ';
15     $stmt = $db->prepare($sql);
16     $stmt->bind_param('ss', $username, $password);
17     $stmt->execute();
18     $stmt->bind_result($result);
19     $stmt->fetch();
20     $stmt->close();
21     
22     if($result ==1) {
23         $_SESSION['logged_in'] = true;
24         $_SESSION['username'] = $username;
25         return true;
26     } else {
27         return false;
28     }
29 }
30     function check_login(){
31         if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
32             return true;
33         }
34         return false;
35     }
36 
37 ?>
 

m0dpad

Erfahrenes Mitglied
Hi,
sehe jetzt auf den ersten Blick eigentlich keinen Fehler. Du kannst mal schauen was für ein Datenbankfehler auftritt, indem du unter die Zeile 15 folgendes schreibst:

PHP:
echo $db->error;
 

korona

Mitglied
Hi,
super, danke es hat funktioniert!
Kommte nicht auf die Datenbankt mit den Namen "dbName.USER" zugegriffen werden.
PHP:
 5     $sql = '
 6         SELECT
 7                 COUNT(*)
 8         FROM
 9                 USER
10         WHERE
11                 Username = ?
12         AND
13                 Password = ?
14                 ';
Nachdem ich USER in user geänder habe funktionierte es. Auf xxampp hat es nichts ausgemacht.

Allerdings bekomme ich nun diese Fehlermeldung. :(
Warning: Cannot modify header information - headers already sent by (output started at /mnt/web7/42/64/52244564/htdocs/name/config.php:8) in /mnt/web7/42/64/52244564/htdocs/name/login_logic.php on line 18

PHP:
<?php
if(isset($_POST['logout'])){
    unset($_SESSION);
    session_destroy();
    return;
}


if(!isset($_POST['submit']))    return;

if(!isset($_POST['username']) || !isset($_POST['password']) ||
    empty ($_POST['username']) || empty ($_POST['password'])) {
    $error_msg = "Das Formular ist nicht vollständig ausgefüllt.";
    return;
}

if(login($_POST['username'], $_POST['password'], $db, $salt)) {
    header('Location: login_markup_logged_in.php');               // Zeile 18 
} else {
    $error_msg = "Der Benutzername oder Passwort ist falsch.";
}

?>
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.614
Mitglieder
187.830
Neuestes Mitglied
hansmeiser