Hey,
var_dump( $_SERVER['QUERY_STRING'] ); gibt aus : string(32) "d1ef18526fd7f033d7c18fc0de5d9b68"
var_dump( $dsRow->hashid ); gibt aus : string(32) "5304e2a2b72f1ff680c531d9607f0afa"
Ok sorry. Hab es schon getan.
Hey,
var_dump( $_SERVER['QUERY_STRING'] ); gibt aus : string(32) "d1ef18526fd7f033d7c18fc0de5d9b68"
var_dump( $dsRow->hashid ); gibt aus : string(32) "5304e2a2b72f1ff680c531d9607f0afa"
Ok sorry. Hab es schon getan.
Hey,
Ja da habe ich es versucht, aber die schicken mir nur links zu faq und sagen das ich anrufen soll. Und im FAQ habe ich ehrlich bis jetzt keine Zeit gehabt nachzuschauen mach ich diese woche oder heute/morgen nochmal.
Deine Hashid lautet : 0f3f63bdf2199dc377059e6f5b48a61f
in der Session steckt die eingegebene email von Formular, d.h. bei dir : -----
Habe deine Änderungen durchgeführt und nochmal es getestet:
Es kommt weiterhin die Fehlermeldung.
Meine Hashid ist in db : 0ea4abb2a3ca3316259da3ff4d7c532a
in der url : 0ea4abb2a3ca3316259da3ff4d7c532a
die selbe eigentlich.
Das ist die url zu meinem link : http://apple231.bplaced.net/Registriervorg…59da3ff4d7c532a
Das script der Seite wo den urlhashwert mit dbhashwert vergleicht :
<?php
session_start();
if(!isset( $_SESSION['useremail'] ))
{
die ("Bitte erst <a href='registrieren.php'>hier</a> regestrieren! ");
exit;
} else{
$userEmail = $_SESSION['useremail'];
}
$check = !empty( $_SERVER['QUERY_STRING'] )? $_SERVER['QUERY_STRING']: null;
try{
$pdo = new PDO('mysql:host=localhost;
dbname=apple231', //der Host und dbname
'**', // User-Name
'***', //Password
array(
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
// gibt an, dass man die Rückgabe eines Datensatzes von Methoden als Objekt erhaltet
PDO::ATTR_EMULATE_PREPARES => false,
// sagt, dass man nicht nur emulieren wollen, sondern PreparedStatements nutzen wollen
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
// PDO veranlassen , Exceptions zu werfen, die man abfangt und darauf reagiert
)
);
} catch(Exception $e)
{
exit('Fehler beim verbinden:' . $e->getMessage());
}
$statement = $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE email = ?" );
$statement->bindParam( 1, $userEmail, PDO::PARAM_STR );
$result = $statement->execute();
$fehler = array();
if ( !$result ) {
$fehler[] = 'Fehler in der Datenbankabfrage!';
} else {
if ( !$dsRow = $statement->fetch() ) {
$fehler[] = 'E-Mail Adresse in Datenbank nicht gefunden!';
} else {
if ( $dsRow->hashid != $check ) {
$fehler[] = 'Keine Übereinstimmung!';
}
}
}
$ausgabe = "Vielen Dank. <br> Hier gehts es zum Profil : <a href='#'>Zum Profil</a>";
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="msvalidate.01" content="53A0A1A36CF935B55216766839090AE3" >
<link href="registration.css" rel="stylesheet">
<title> Bestätigung der Registration</title>
<style type="text/css">
.php-ausgabe
{
color: yellow;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="rahmen">
<div class="border-text">
<p>
<?php
echo ( !empty($fehler) )? implode( '<br>', $fehler ): $ausgabe;
?>
</div>
</div>
</body>
</html>
Alles anzeigen
Bei dir gehts ja. Aber warum jetzt nicht bei mir?
Gruß,
Stef
Hey,
hier ist der Link der Registrationsseite : http://apple231.bplaced.net/Registriervorgang/registrieren.php
(kenn deine email nicht)
Ich sende es mit der mail() function als html-mail, habe es zwar mit php mailer probiert aber es hat nicht geklappt da ich nicht alle daten hatte und ich rufe doch nicht bei meinem email anbieter an, welchser pro minute 4 € verlangt um meinen port rauszubekommen. Ich werde ´mich in nächster Zeit nochmal daran setzen.
Gruß,
Stef
Hey,
zu deinem HTML-Teil:
Wenn du input-elemente beschreiben willst benutze den label-tag. Der ist dazu da diese input felder zu beschreiben.
-> siehe : http://www.w3schools.com/tags/tag_label.asp
Was machst du da mit dem attribut : font face ?
Wenn du jedem Element in deinem html-teil die schriftart arial geben möchtest kannst du ganz easy im css den * Selektor verwenden welches das ganze dokument anspricht und da kannst du dann die schriftart mit : font-family: Arial,sans-serif; einstellen. Die 2. Schriftart wird erst aktiv wenn die 1.ste nicht vorhanden ist
Wenn du ein unsichtbares input feld erstellen willst brauchst du das css wie in deinem Beispiel nicht. Du kannst es da einfach so machen:
Mit dem könntest du z.b. mit php abfragen ob formular bereits schonmal aufgerufen wurde, weil dieses feld gibt die value erst aus wenn das formular abgesendet wurde.
Es gibt sehr viele Möglichkeiten in php dies zu machen. Aber dies ist für den anfang die leichteste.
Zu diesem PHP-Mailer kann ich dir nicht helfen.
Gruß,
Stef
Hey,
ja habe da anstatt varchar int verwendet. Mein Fehler. Nun wird der hash so in db angegeben
Jedoch nach weiteren Tests kommt immernoch die Fehlermeldung : Keine Übereinstimmung!
Wird die hashid in der url nicht erkannt oder wie ?Oder was läuft da schief ?
Gruß,
Stef
Hey,
habe es nun mit deinem versucht. Da kommt die ausgabe : Keine Übereinstimmung!
Die hashid ist in der datenbank 0... Warum denn das ?
Habe mal die ganzen db hashid vom test hier im Foto:
http://prnt.sc/cgdw12
Aber warum sind so viele 0 ? Und nicht die hash id die mit email versendet wird?
Ich tuh ja die hashid da eintragen in db, da verstehe ich einfach nicht das da 0 eingetragen wird.
Stef
Hey,
ja ok. So ist das.
Das habe ich vergessen, das echo.
Ich möchte das die var $ausgabe ausgegeben wird-
Aber warum wird da diese nicht ausgegeben ?
Da ist doch eigentlich kein fehler ? Dann sollte doch die var $ausgabe ausgegeben werden.
Danke.
Gruß, Stef
Hey,
ja ok. Etwas ungeschickt von mir.
Hier der ganze code:
<?php
session_start();
$fehler = array();
if(!isset( $_SESSION['useremail'] ))
{
die ("Bitte erst <a href='registrieren.php'>hier</a> regestrieren! ");
exit;
} else{
$userEmail = $_SESSION['useremail'];
}
$check = ( !empty($_SERVER['QUERY_STRING']) )? explode( '$', $_SERVER['QUERY_STRING'] ): null;
try{
$pdo = new PDO('mysql:host=localhost;
dbname=apple231', //der Host und dbname
'***', // User-Name
'****', //Password
array(
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
// gibt an, dass man die Rückgabe eines Datensatzes von Methoden als Objekt erhaltet
PDO::ATTR_EMULATE_PREPARES => false,
// sagt, dass man nicht nur emulieren wollen, sondern PreparedStatements nutzen wollen
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
// PDO veranlassen , Exceptions zu werfen, die man abfangt und darauf reagiert
)
);
} catch(Exception $e)
{
exit('Fehler beim verbinden:' . $e->getMessage());
}
$statement = $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE email = ?" );
$statement->bindParam( 1, $userEmail, PDO::PARAM_STR );
$result = $statement->execute();
$fehler = array();
if ( !$result ) {
$fehler[] = 'Fehler in der Datenbankabfrage!';
} else {
if ( !$dsRow = $statement->fetch() ) {
$fehler[] = 'E-Mail Adresse in Datenbank nicht gefunden!';
} else {
if ( $dsRow->hashid != $check[1] ) {
$fehler[] = 'Keine Übereinstimmung!';
}
}
}
$ausgabe = "Vielen Dank. <br> Hier gehts es zum Profil : <a href='#'>Zum Profil</a>";
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="msvalidate.01" content="53A0A1A36CF935B55216766839090AE3" >
<link href="registration.css" rel="stylesheet">
<title> Bestätigung der Registration</title>
<style type="text/css">
.php-ausgabe
{
color: yellow;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div class="rahmen">
<div class="border-text">
<p>
<?php
if ( isset($fehler) && count($fehler) > 0 ) {
implode('<br>', $fehler) ;
} else if (isset($ausgabe) && count($fehler) === 0) {
echo $ausgabe;
}
?>
</p>
</div>
</div>
</body>
</html>
Alles anzeigen
Dann wird beim bindparm die var useremail mit dem Wert in der Spalte Hashid gegeneinandergestellt und verglichen ?
Gruß,
Stef
Hey,
naja egal jetzt.
Ah ok. Danke jetzt kommt der error nichtmehr, jedoch wird nichts ausgegeben auf der Seite..
Meine Ausgabe sieht wie folgt aus :
<?php
if ( isset($fehler) && count($fehler) > 0 ) {
implode('<br>', $fehler) ;
} else if (isset($ausgabe) && count($fehler) === 0) {
echo $ausgabe;
}
?>
Alles anzeigen
Weiß nicht warum.
Vielen Dank!
Stef
Hey,
doch die kommen wirklich aus meinem Script..
Aso, ja das stimmt.
Ok. Nein $check nutze ich wie du es mir oben in dem script gecodet hast.
Ja mein Problem war ja dies, dass ich noch nicht überprüft habe ob es den selben Datensatz gibt, ich wusste ja nicht wie ichs machen soll.
Paar Fragen:
Was macht den ___DIR___ ?
Warum wird da ein ? genommen als value der email ?
Was macht denn diese Zeile ?
Vielen Dank schonmal
EDIT:
Habe nun deins getestet und es kommt folgender error wie bei mir :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: Columns/Parameters are 1-based' in /users/apple231/www/Registriervorgang/registration_weiterleitung.php:38 Stack trace: #0 /users/apple231/www/Registriervorgang/registration_weiterleitung.php(38): PDOStatement->bindParam(0, 'Hans.klais...', 2) #1 {main} thrown in /users/apple231/www/Registriervorgang/registration_weiterleitung.php on line 38
Gruß,
Stef
Hey,
so ne richtige Ahnung habe ich nicht. Hab ich ja auch gesagt weil ichs noch nie gemacht habe und nicht weiß wies geht.
Aber das ist ja klar wenn ich mit === auf den Typ prüfe das da eigentlich nichts ausgegeben wird. Da das eine ein array und das andere kein array ist.
Habe nun die 3 vars ($statement, $check, $result) ausgeben lassen. Das kommt raus:
statement: object(PDOStatement)#2 (1) { ['queryString']=> string(73) "SELECT hashid FROM Registrierdaten WHERE benutzername = "Stef Hunnington"" }
result: bool(true)
check:array(1) { [0]=> string(64) "a1d22d92f96a0bb64032aaf25ebb9b68b6b98122e755fa7406e03a5f0a73fd1d" }
Jetzt fehlt da noch die hashid von Datenbank..Eine typsichere vergleichung ist doch da sinnvoll. Wie könnte man es dann sonst machen ?
Abenteuerlich ?
Stef
Hey,
ich glaube den Fehler gefunden zu haben in sql statement es waren die anführungszeichen..
Nun das nächste Problem. Es kommt zwar kein error mehr aber es wird nichts ausgegeben.
Die Ausgabe mache ich so:
<?php
if(isset($antwort) && count($fehler) === 0)
{
echo $antwort;
} else if (isset($fehler) && count($fehler) > 0){
implode('<br>',$fehler) ;
}
?>
Warum gibt der da nix aus ?
Gruß,
Stef
Hi,
aso ok. Vielen Dank.
Hey,
Mein aktueller Stand sieht wie folgt aus:
<?php
session_start();
$fehler = array();
if(!isset($_SESSION['benutzername']))
{
die ("Bitte erst <a href='registrieren.php'>hier</a> regestrieren! ");
exit;
}
$user = $_SESSION['benutzername'];
if ( !empty($_SERVER['QUERY_STRING']) ) {
$check = explode( '$', $_SERVER['QUERY_STRING'] );
try{
$pdo = new PDO('mysql:host=localhost;
dbname=apple231', //der Host und dbname
'****', // User-Name
'***', //Password
array(
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
// gibt an, dass man die Rückgabe eines Datensatzes von Methoden als Objekt erhaltet
PDO::ATTR_EMULATE_PREPARES => false,
// sagt, dass man nicht nur emulieren wollen, sondern PreparedStatements nutzen wollen
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
// PDO veranlassen , Exceptions zu werfen, die man abfangt und darauf reagiert
)
);
} catch(Exception $e)
{
exit('Fehler beim verbinden:' . $e->getMessage());
}
$statement = $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE benutzername = ".$user."");
$result = $statement->execute();
if($result === $check)
{
$antwort = "Dankeschön. Hier gehts zu ihrem <a href='#'Profil</a>.";
} else if ($result !== $check){
$fehler[] = "Fehlerhafte Registration. Bitte registrieren sie sich nochmal!<br><a href='registrieren.php'>Hier registrieren</a>";
}
} else if ( empty($_SERVER['QUERY_STRING']) ) {
$fehler[] = "Kein Wert vorhanden. Bitte registrieren sie sich nochmal!<br><a href='registrieren.php'>Hier registrieren</a>";
}
?>
Alles anzeigen
PHP wirft mir dabei immer diese Exception :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'rere' in 'where clause'' in /users/apple231/www/Registriervorgang/registration_weiterleitung.php:38 Stack trace: #0 /users/apple231/www/Registriervorgang/registration_weiterleitung.php(38): PDO->prepare('SELECT hashid F...') #1 {main} thrown in /users/apple231/www/Registriervorgang/registration_weiterleitung.php on line 38
Das heißt, das die spalte nicht gefunden worden ist. Ich sag selektiere/wähle die spalte hashid aus wo benutzername ist $user. ($user ist der Session Benutzername dieser wiederum ist der Benutzername der eingegeben worden ist.) Aber wie kann es sein ?
Und wie ich es nun vergleichen soll. Hab ich nochnicht gemacht.
Sollte man da mittels fetch die einzelne Spalte durchgehen und dann in dieser bedingung die if statements reinmachen ?
Gruß,
Stef
Hey,
ich habe nun mal die Datenbankverbindung aufgebaut und die ganzen Daten speichern lassen.
Mein aktueller Stand:
<?php
$vorname = $nachname = $email = $tag = $monat = $jahr = $benutzername = $password = $password_gehahst = $password_wiederholung = null; // alle vars auf null setzen
$fehler = array();
if(isset($_POST['submitted']))
{
$vorname = trim($_POST['vorname']);
$nachname = trim($_POST['nachname']);
$email = trim($_POST['email']);
//Geburtsdatum
$tag = $_POST['tage'];
$monat = $_POST['monate'];
$jahr = $_POST['jahre'];
//Benutzername
$benutzername = trim($_POST['benutzername']);
//Password
$password = $_POST['password'];
$password_wiederholung = $_POST['password_wiederholung'];
$password_gehahst = password_hash($password_gehahst, PASSWORD_DEFAULT);
/***********************Die ganzen errors**************************/
if(empty($vorname)){
$fehler[] = '<p class="fehler">Bitte geben sie ihren Vornamen an!</p>';
}
if(empty($nachname)){
$fehler[] = '<p class="fehler">Bitte geben sie ihren Nachnamen an!</p>';
}
if(empty($email)){
$fehler[] = '<p class="fehler">Bitte geben sie ihre E-Mail-Adresse an!</p>';
} else if (filter_var($email , FILTER_VALIDATE_EMAIL) === false){
$fehler[] = '<p class="fehler">Bitte geben sie eine gültige E-Mail-Adresse an!</p>';
}
if(empty($tag) or empty($monat) or empty($jahr)){
$fehler[] = '<p class="fehler">Bitte geben sie ihr Geburtsdatum an!</p>';
}
if(empty($benutzername)){
$fehler[] = '<p class="fehler">Bitte geben sie ihren Benutzernamen an!</p>';
}
if(empty($password)){
$fehler[] = '<p class="fehler">Bitte geben sie ihr Password an!</p>';
}
if(empty($password_wiederholung)){
$fehler[] = '<p class="fehler">Bitte wiederholen sie ihr Passwords!</p>';
} else if($password_wiederholung !== $password){
$fehler[] = '<p class="fehler">Das wiederholte Password stimmt nicht überein!</p>';
}
if(count($fehler) === 0 ){
$email_id = uniqid();
$bestaetigungslink = 'http://apple231.bplaced.net/Registriervorgang/registration_weiterleitung.php?' . $email_id;
try{
$pdo = new PDO('mysql:host=localhost;
dbname=Registriervorgang', //der Host und dbname
'root', // User-Name
'', //Password
array(
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
// gibt an, dass man die Rückgabe eines Datensatzes von Methoden als Objekt erhaltet
PDO::ATTR_EMULATE_PREPARES => false,
// sagt, dass man nicht nur emulieren wollen, sondern PreparedStatements nutzen wollen
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
// PDO veranlassen , Exceptions zu werfen, die man abfangt und darauf reagiert
)
);
} catch(Exception $e)
{
exit('Fehler beim verbinden:' . $e->getMessage());
}
$statement = $pdo->prepare("INSERT INTO Registrierdaten(vorname,nachname,email,tag,monat,jahr,benutzername,password,hashid)
VALUES(:vorname,:nachname,:email,:tag,:monat,:jahr,:benutzername,:password,:hashid)" );
$result = $statement->execute(
array(
':vorname' => $vorname,
':nachname' => $nachname,
':email' => $email,
':tag' => $tag,
':monat' => $monat,
':jahr' => $jahr,
':benutzername' => $benutzername,
':password' => $password_gehahst,
':hashid' => $email_id,
)
);
if(!$result){
var_dump($statement->errorInfo());
}
}
}
?>
Alles anzeigen
Da habe ich nun eine id die sich immer ändert. Und diese wird dann der email hinzugefügt als url parameter. Nun muss ich ja noch die hashid die bei der Regestration abgespeichert wird überprüfen ob email und hasid zusammenpassen.
Aber wie mache ich es jetzt ? Ich habe gedacht eine weiteres statement die hashid und email selektieren, um dann zu überprüfen ob die zusammenpassen.
Komisch die hash id bleibt immer gleich... Soll doch nicht ??? Mit uniqid(); erstellt man doch unterschiedliche ids ?? Mit hash(); weiß ich nicht wie ichs machen soll. Was soll man denn da hashen lassen ? Weil es gibt keine hash function die ohne werte einen hash-wert erstellt glaube ich. Habe bisher keine gefunden.
Ich möchte, dass wenn jemand sich registriert noch nicht sich einloggen kann. Erst wenn dieser die Bestätigungsmail geklickt hat.
Wenn ich nun aber die hashid schon in db speichere ist es doch unnötig des zu vergleichen. Weil der User eh sich einloggen kann.
Aber wie soll ich denn rausbekommen ob der User den Link geklickt hat ?
Gruß,
Stef
Hey zusammen,
ich möchte das double opt in verfahren anwenden um wirklich sicher zu gehen das die email richtig ist die eingegeben worden ist und kein fake.
Nun wie kann man sowas machen ?
Ich habe schon danach gesucht aber nicht viel gefunden.
Gruß,
Stef
Hey,
ah ok. Wusste ich nicht.
Was ist denn GA und BA ?
Stef
ja dann wird halt nichts in die datei geschrieben. Und dann am nächsten Monat weiter gemacht .
Eins reicht nicht ?
Ich verstehe unter 1 email account, Die Domain mit dem Platz wo die Email eingehen und gespeichert werden.
Wie viel braucht man denn dann mindestens ?
Hey,
ok. Ich würde dann es so machen:
1. Besucherzähler mit txt-file speicherung.
2. Dann die date()-funktion abfragen ob der Tag 1 ist z.b. so :
3. Dann wenn 01 zutrifft in der Bedingung die File öffnen eine neue zeile anfangen und da dann weiterzählen lassen mit angabe des datums
Stef