Hey zusammen,
ich sitze grad am double opt in- Verfahren, bisher nur für die Registration.
Nun habe ich schon gecodet, das die daten in datenbank gespeichert werden. Und das eine E-Mail geschickt wird mit der Hashid, welche bei jedem user nach der registration gespeichert wird.
Nun möchte ich abfragen : Wo benutzername .... ist select hashid.
Und nun diese hashid mit der id vom Laden des Aktivierungslinks (als Parameter) zu vergleichen. Da ich sowas nochnie gemacht habe. Wende ich mich an euch.
Mein aktueller Stand:
Registrier-Seite:
<?php
session_start();
$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 ){
$hashid_email = sha1(mt_rand(10000,99999).time().$email); // hash mit sha1 methode aus email und zufälligen Zahlen
$bestaetigungslink = 'http://apple231.bplaced.net/Registriervorgang/registration_weiterleitung.php?' . $hashid_email ;
$empfaenger = $email;
// Betreff
$betreff = 'Registration bei StefHome';
// Nachricht
$nachricht = '
<html>
<head>
<meta charset="UTF-8">
<title>Registration</title>
</head>
<body>
<p>Sehr geehrte/r ' . $vorname .' ' . $nachname . ' ,<br>
Sie haben sich bei uns neu regestriert. Bitte bestätigen sie ihre Registration mit dem Link den sie unten sehen:
</p>
<a href="'.$bestaetigungslink.'">'.$bestaetigungslink.'</a>
<p>Wir freuen uns auf sie und bis bald.</p>
<p>Mfg,<br>Stef Webdesign</p>
</body>
</html>
';
$header = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
// zusätzliche Header
$header .= 'From: StefWebdesign' . "\r\n";
$header .= 'Bcc: Webdesign@webdesign.de' . "\r\n";
// verschicke die E-Mail
$emailversand = mail($empfaenger, $betreff, $nachricht, $header);
if(!$emailversand)
{
$fail = "Etwas ist fehlgeschlagen";
exit;
} else
{
$ausgabe = "<p class='true'>Vielen Dank für die Registration";
$_SESSION['benutzername'] = $benutzername;
}
/*
header('Location: registration_weiterleitung.php');
<--- Erst nach datenbankverarbeitung und überprüfung ob hash id übereinstimmt ---->
*/
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("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' => $hashid_email,
)
);
if(!$result){
var_dump($statement->errorInfo());
}
}
}
?>
Alles anzeigen
Und die registration_weiterleitung.php
wo ich nun die id welche beim klick auf aktivierungslink gesendet wird mit der hashid in der db vergleichen.
<?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
Dabei wird immer diese Exception geworfen:
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(3[Blockierte Grafik: http://www.forum-hilfe.de/images/smilies/icon_cool.gif]: PDO->prepare('SELECT hashid F...') #1 {main} thrown in /users/apple231/www/Registriervorgang/registration_weiterleitung.php on line 38
Freue mich auf eure Hilfe und wieder was neues zu lernen.
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 ?
Nochwas:
Habe jetzt mittels fetchColumn(); probiert den inhalt auszugeben, aber das klappt auch nicht warum denn das ?
<?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
'apple231', // User-Name
'rt12!?1234', //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->fetchColumn();
$ausgabe = 'Hashid lautet: ' . $result . '<br>';
}
?>
<!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">
<?php
if(isset($user) && !empty($user)){
echo "<p class='php-ausgabe'>Hallo " . $user ."</p>";
}
?>
<div class="border-text">
<p>
<?php
/* if(isset($antwort) && count($fehler) === 0)
{
echo $antwort;
} else if (isset($fehler) && count($fehler) > 0){
implode('<br>',$fehler) ;
}*/
if(isset($ausgabe) && !empty($ausgabe) )
{
echo $ausgabe;
}
?>
</p>
</div>
</div>
</body>
</html>
Alles anzeigen
Stef