Video Tutorial - PHP Registrierung | Loginsystem


m0dpad

Erfahrenes Mitglied
Hi,

ja, es dürfen keine Informationen an den Client gesendet werden bevor der header gesetzt ist. Du kannst also entweder den ganzen Output buffern (ob_start()) und erst dann ausgeben, oder du achtest darauf, dass keine Ausgabe in der Logik stattfindet.

Ich vermute mal, dass es an
PHP:
echo $db->error;

liegt, wenn du diese Zeile nicht wieder auskommentiert/entfernt hast ;)
 

VincentVega20

Grünschnabel
Hallo, Danke erstmal für das tolle Tutorial! :)

Leider klappt es bei mir noch nicht so ganz. Ich kriege folgenden Fehler:
Parse error: syntax error, unexpected T_BOOLEAN_OR in C:\xampp\htdocs\registration_logic.php on line 6

Zeile 6 beinhaltet:
PHP:
if(!isset($_POST['username'])) || !isset($_POST ['pass']) || !isset($_POST ['email']) || !isset($_POST ['fullname'])  ||

Habe noch fullname als Feld zusätzlich, alles andere sollte eigentlich gleich sein.
Was habe ich denn übersehen? :rolleyes:
 
Zuletzt bearbeitet:

m0dpad

Erfahrenes Mitglied
Parse error: syntax error, unexpected T_BOOLEAN_OR in C:\xampp\htdocs\registration_logic.php on line 6

Zeile 6 beinhaltet:
PHP:
if(!isset($_POST['username'])) || !isset($_POST ['pass']) || !isset($_POST ['email']) || !isset($_POST ['fullname'])  ||

Bei dem if - Statement hast du 1. falsch gesetzte Klammern und 2. am Ende ein || (=oder) das keinen Sinn ergibt. ;)
 

VincentVega20

Grünschnabel
Hallo, Danke für den Hinweis - da waren die Augen wohl schon müde ;)

Leider erscheint nun die Fehlermeldung:

PHP:
$stmt = $db ->prepare($sql);

Fehler:
Notice: Undefined variable: db in C:\xampp\htdocs\registration_logic.php on line 42
Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\registration_logic.php on line 42


Keine Verbindung zur Datenbank?
 

ComFreek

Mod | @comfreek
Moderator
Der Fehler besagt, dass die Variable $db gar nicht definiert wurde und somit ein Benutzen als Objekt unmöglich ist!

Ich habe nicht deinen Code / des Tutorials zur Hand. Kannst du vielleicht einen Link geben oder ich suche kurz unter den Tutorials?

//Edit Leider ist beim Video-Tutorial der Code nicht als Text mitgeliefert. Also am einfachsten wäre es, wenn du einfach deinen Code posten würdest.
 

VincentVega20

Grünschnabel
Die registration_logic:

PHP:
<?php

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

// Übeprüfen ob Daten vollständig eingegeben sind
if (!isset($_POST['username'])||!isset($_POST['pass'])||!isset($_POST['email'])||!isset($_POST['fullname'])||
empty($_POST['username'])||empty($_POST['pass'])||empty($_POST['email'])||empty($_POST['fullname'])) {

    $error_msg = "Das Formular wurde nicht vollständig ausgefüllt.";
	return;
}

// Passwörter überprüfen
if($_POST['pass'] [0] !== $_POST['pass'] [1])
{
	$error_msg = "Die Passwörter stimmen nicht überein.";
	return;
}

// Hash-Code generieren und Benutzername prüfen
$_POST['pass'] = hash('sha256', $_POST['pass'] [0].$salt);
if(strlen ($_POST['username']) > 50)
{
	$error_msg = "Der Benutzername ist zu lang.";
	return;
}
// Leerzeichen entfernen
$_POST['username'] = trim($_POST['username']);

if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
{ 
	$error_msg = "Die E-Mail Adresse ist ungültig";
	return;
}

$sql = 'INSERT INTO
			users
			(full_name, users_name, password, email)
		VALUES
			(?, ?, ?, ?)';

$stmt = $db->prepare($sql);

$stmt->bind_param('ssss', $_POST['fullname'], $_POST['username'], $_POST['pass'], $_POST['email']);

if(!$stmt->execute())
{
	$error_msg = "Es ist ein Fehler aufgetreten";
	return;
}
$stmt->close();

$success_msg = "Das Benutzerkonto wurde erfolgreich angelegt";
$error_msg = "Das Benutzerkonto wurde erfolgreich angelegt";

?>

Danke schon mal für die Mühe! :)
 

ComFreek

Mod | @comfreek
Moderator
Du erstellst auch nirgends im Code ein neues PDO-Objekt.

Beispiel für MySQL:
PHP:
$db = new PDO("mysql:host=localhost;dbname=MyLoginDB", 'user', 'password');
 

VincentVega20

Grünschnabel
Hallo,

dachte es reicht die connect.php die ich eingebunden hab wie in dem Video-Tutorial:

PHP:
<?php

   $mysqlhost="localhost";
   $mysqluser="x";
   $mysqlpasswd="x";
   $mysqldbname="x";
   $mysqltable="users";
   $mysqlpwd="password";
   $mysqlname="users_name";

   $link = @mysql_pconnect($mysqlhost, $mysqluser, $mysqlpasswd);
   if ($link == FALSE) {
     echo "<p><b>Keine Verbindung zur Datenbank.";
     echo "Bitte versuchen Sie es später noch einmal.</b></p>\n";
     exit();
   }
   
   mysql_select_db($mysqldbname);
   $salt = "njegrngjen45344rgujiernguier756jeruige3453ruigeriugn";
    
?>

Muss ich also so wie du geschrieben hast $db definieren?
Das kam im Video leider nicht vor
 

ComFreek

Mod | @comfreek
Moderator
Wieso nutzt der Ersteller des Videotutorials (m0pad?) auf ein mal eine persistene MySQL-Verbindung und im vorherigen Skript das PDO-Layer?

Naja, du kannst ja diesen Code vorerst auskommentieren und meinen oben geposteten Code anhängen.
 

sheel

I love Asm
Die Verbindungsherstellung ist die PHP-MySQL-Extension, der Rest PDO.
Kann nicht gehen.
Wenn das im Video auch so ist... :(
Die Zeile von Comfreek macht im Grunde das Gleiche.
Zugangsdaten anpassen, einfügen.
 

VincentVega20

Grünschnabel
Hab ich die Zeile nun vor $stmt = $db->prepare($sql); gesetzt, nun erhalte ich die Fehlermeldung:

Fatal error: Call to undefined method PDOStatement::bind_param() in C:\xampp\htdocs\registration_logic.php on line 47

Och man :(
 

m0dpad

Erfahrenes Mitglied
Ja das heißt, dass die Variable in der eigentlich das Datenbankobjekt instanziiert sein sollte nicht definiert ist.

Also irgendwo fehlt $db = new Mysqli(...); oder irgendein Script wird nicht richtig eingebunden.
 

VincentVega20

Grünschnabel
Hm okay, irgendwie habe ich das in deinem Video-Tutorial leider nicht gefunden/übersehen.
Gibts auf deinem Blog das Tutorial nochmal in Schriftform?
EDIT: Hab`s schon :)

Hab nun BindParam korrigiert, aber gleich der nächste Fehler
Warning: PDOStatement::bindParam() expects parameter 3 to be long, string given in C:\xampp\htdocs\registration_logic.php on line 47

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\xampp\htdocs\registration_logic.php on line 49
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Sorry, es gibt auch bei MySQLi eine bind_param-Funktion! (Ich bin davon ausgegangen, dass es PDO wäre.)

Das erklärt dann auch die Config-Datei.

Versuche mal folgenden Code:
PHP:
<?php 

   $mysqlhost="localhost"; 
   $mysqluser="x"; 
   $mysqlpasswd="x"; 
   $mysqldbname="x";
 
   $db = new MySQLi($mysqlhost, $mysqluser, $mysqlpasswd, $mysqldbname);
    
   $salt = "njegrngjen45344rgujiernguier756jeruige3453ruigeriugn"; 
     
?>
 

Raisch

extraordinary bit

Raisch

extraordinary bit
VincentVega20 hat gesagt.:
PHP:
$stmt->bind_param('sssi', $_POST['username'], $_POST['pass'], $_POST['email'], $user_ip);
  1. poste die Zeile wo das $stmt Objekt erstellt wird ($stmt = $objDB->prepare(...))!
  2. ist dein Aufruf von bind_param falsch...

Der Aufbau sollte, mMn, so sein:
PHP:
$objDB = new mysqli( /* */ );

$objStmt = $objDB->prepare( 'INSERT INTO table VALUES (?, ?, ?, ?, ?)' );

$objStmt->bind_param( 'sssi', $username, $pass, $email, $ip );

$username = $objDB->real_escape_string( $_POST['username'] );
$pass     = $objDB->real_escape_string( $_POST['pass'] );
$email    = $objDB->real_escape_string( $_POST['email'] );
$ip       = $objDB->real_escape_string( $user_ip );

$objStmt->execute();

Gruß
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.614
Mitglieder
187.830
Neuestes Mitglied
hansmeiser