Video Tutorial - PHP Registrierung | Loginsystem

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
 
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.
 
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 :)
 
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.
 
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:
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
 
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...
 
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>
 
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ß
 
Zurück