Hey,
bitte halte dich an das Eingabe-Verarbeitung-Ausgabe-Prinzip. Siehe auch : https://php-de.github.io/jumpto/eva-prinzip/
Weist du was du da machst ? Der Code sieht grausam aus.
Bei Insert Into tust du die ganzen daten in die datenbank eintragen nicht auswählen und sozusagen herausziehen.
Dann ist der Teil schonmal meiner Ansicht nach Käse : $ctrl_register = $insertRegister->fetch();
Dann folgenden Zeilen:
$insertRegister = $db->prepare("INSERT INTO tbl_logindata (username, password, email, firstname, lastname, birthday, gender) VALUES (':username', ':pw', ':email', ':firstname', ':lastname', ':date', ':geschlecht')");
$result_register = $insertRegister->execute(array('username' => $username, 'password' => $pw, 'email' => $email, 'firstname' => $firstname, 'lastname' => $lastname, 'birthday' => $date, 'gender' => $geschlecht));
Dort hast du bei execute immer das : vor den Platzhaltern welchen den Wert der Variablen zugewiesen werden vergessen.
Hier ist ein Ansatz mit Insert Into bei einem Registriervorgang:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$errors = array();
if(isset($_POST['submit'])){
$vorname = isset($_POST['vorname']) ? $_POST['vorname'] : null;
$nachname = isset($_POST['nachname']) ? $_POST['nachname'] : null;
(int)$alter = isset($_POST['alter']) ? $_POST['alter'] : null;
$password = isset($_POST['password']) ? $_POST['password'] : null;
$vorname = filter_var($vorname, FILTER_SANITIZE_STRING);
$nachname = filter_var($nachname, FILTER_SANITIZE_STRING);
(int)$alter = filter_var($alter, FILTER_SANITIZE_STRING);
$password_hash = password_hash($password, PASSWORD_DEFAULT);
$succes = "<p>Ihnen wurde eine E-Mail mit dem Bestätigungslink gesendet</p>";
if(empty($vorname)){
$errors[] = "<p>Bitte Vorname angeben!</p>";
}
if(empty($nachname)){
$errors[] = "<p>Bitte Nachname angeben!</p>";
}
if(empty($alter)){
$errors[] = "<p>Bitte Alter angeben!</p>";
} else if(!is_int((int)$alter)){
$errors[] = "<p>Bitte geben sie nur Ganzzahlen ein!</p>";
} else if(strlen($alter) > 2){
$errors[] = "<p>Es dürfen nur 2 Zahlen eingegeben werden!</p>";
}
if(empty($password)){
$errors[] = "<p>Bitte Password angeben!</p>";
}
if(count($errors) === 0){
try{
$dbv = new PDO('mysql:host=127.0.0.1;dbname=***;charset=utf8', '***' , '****');
$stmt1 = $dbv->prepare("INSERT INTO register(vorname, nachname, age, password) VALUES (:vorname, :nachname, :age, :password)");
$stmt1->execute(
array(
':vorname' => $vorname,
':nachname' => $nachname,
':age' => $alter,
':password' => $password_hash,
)
);
}catch (Exception $e){
echo "Fehler aufgetreten" . $e->getMessage();
exit();
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Register</title>
</head>
<body>
<h1>Registiervorgang</h1>
<form method="POST">
<label>Vorname: <input type="text" name="vorname"></label>
<label>Nachname: <input type="text" name="nachname"></label>
<label>Alter: <input type="text" name="alter"></label>
<label>Password:<input type="password" name="password"></label>
<input type="submit" name="submit" value="Regestieren...">
<?php
if(isset($errors) && count($errors) > 0){
echo implode('', $errors);
} else if(isset($succes) && count($errors) === 0){
echo $succes;
}
?>
</form>
</body>
</html>
Alles anzeigen
Was ich dir raten würde, ist dabei noch ein extra zufälligen hashwert zu erstellen, z.b. aus dem namen oder so, und dann fügst du diesen hashwert deinem Link als Parameter an : deineseite/registriervorgang_abschluss.php?hashwert . Dann würde ich dem jenigen eine E-Mail senden wo er, bevor er sich anmelden kann, noch den Link bestätigen muss. Dann würde ich auf dieser Abschlusseite denn erstellten hashwert der an die email gehongen worden ist aus der db ziehen, und wenn jemand mit diesem link auf die seite kommt, den Parameter im Link auslesen und mit dem in der Datenbank vergleichen.
Ebenso natürlich vor dem Insert Into, muss ein Select-Statement erstellt werden, welches überprüft ob schon ein benutzer mit dem Namen regestriert ist, und wenn ja fehlermeldung ausgeben.
Stef