PHP Es werden keine Inhalte in die Datenbank eingetragen (PDO)

J

Jxn

Gast
Hallo,

probiere gerade mit folgendem Code:

PHP(register.php):
PHP:
$pdo = new PDO('mysql:host=localhost;dbname=user', 'root', '');

if(isset($POST_['username'])) {
  $user = $_POST['username'];
} else {
  $user = null;
}

if(isset($_POST['password'])) {
  $pass = $_POST['password'];
} else {
  $pass = null;
}

$statement = $pdo->prepare("INSERT INTO user (username, password) VALUES (?, ?)");
$statement->execute(array($user, $pass));

HTML(index.html):
HTML:
  <div class="register" method="post">
    <p>Registrieren</p>
      <form action="register.php">
        <p>Username:</p>
        <input name="username" type="text">
        <p>Passwort:</p>
        <input name="password" type="password">
        <input type="submit" value="Absenden">
      </form>
  </div>

Wenn ich mit ("print_r($pdo->errorInfo());") nach Errors suche, kommt folgende Ausgabe:
Array ( [0] => 00000 [1] => [2] => ) Array ( [0] => 00000 [1] => [2] => )

Könnt ihr mir vielleicht weiterhelfen? Ich weiß nicht, wieso nichts in die Tabelle eingetragen wird.
 
Was soll das überhaupt werden? Sieht für mich nach Userverwaltung aus oder? Wenn ja warum nimmst du dafür nicht etwas fertiges? Userverwaltung sollte im Jahr 2017 kein Problem mehr sein mit dem man sich rumschlagen muss.

Warum es aber nicht klappt auf den ersten Blick schon mal weil du keine Variablen angegeben hast PHP Variablen beginnen immer mit einem $ z.B.:

Code:
<?php
$db = new PDO('dblib:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);
?>

Auf den zweiten Blick hast du keine DB angegeben außer die DB nennt sich "user" was ich nicht glaube.

Schau dir mal das an:

http://php.net/manual/de/book.pdo.php
 
@ Cool Master
Schul/Uni Zeug vllt. für einfaches Grundverständnis :)
 
Hmm... Kann sein, dann sollte aber auch escapen dran kommen, gerade bei der Nutzerverwaltung :)
 
Es ist ein Prepared Statement, was soll er da escapen?

Sehe den Fehler eher im HTML, method='POST' im DIV-Element statt im FORM-Element.

$_REQUEST nimmt übrigens alles, da musst du dir über POST und GET keine Gedanken machen.
 
Krafty schrieb:
Es ist ein Prepared Statement, was soll er da escapen?

Sehe den Fehler eher im HTML, method='POST' im DIV-Element statt im FORM-Element.

$_REQUEST nimmt übrigens alles, da musst du dir über POST und GET keine Gedanken machen.

Der Fehler war mir auch noch aufgefallen.

HTML:
  <div class="register">
    <p>Registrieren</p>
      <form action="register.php" method="post">
        <p>Username:</p>
        <input name="username" type="text">
        <p>Passwort:</p>
        <input name="password" type="password">
        <input type="submit" value="Absenden">
      </form>
  </div>

PHP:
<?php

$pdo = new PDO('mysql:host=localhost;dbname=userdata', 'root', '');

if(isset($POST_['username'])) {
  $user = $_POST['username'];
} else {
  $user = null;
}

if(isset($_POST['password'])) {
  $pass = $_POST['password'];
} else {
  $pass = null;
}

$statement = $pdo->prepare("INSERT INTO userdata (username, password) VALUES (?, ?)");
$statement->execute(array($user, $pass));




 ?>

Klappt aber immer noch nicht. :/
 
@Unbek4nt:
Zumindest laut errorInfo() scheint es ja an der Query nichts zu meckern zu geben.
Hast du mal die Parameter debugged?

@Cool Master:
Ist ja eine tolle Erkenntnis, dass Prepared Statements nichts mehr bringen, wenn man sie nach dem ersten Mal nicht mehr benutzt und Queries zusammenpfuscht.
 
Ist das nur zum Üben für ein generelles Verständnis von Web-Programmierung?

Falls daraus mal produktiver Code werden soll:
* Niemals Benutzerpasswörter im Klartext abspeichern. Wirklich. Niemals. Ohne Ausnahme. (password_hash() und password_verify() verwenden)

* Benutzereingaben nicht einfach ungefiltert weiterverarbeiten. Prepared Statement hin oder her, immer filter_input() auf Eingaben anwenden. Eingaben darf nicht vertraut werden, man muss jede Eingabe so behandeln, als würde sie dazu missbraucht werden, um das System zu hacken.

* Sich die (ständige) Verwendung der Superglobalen Variablen (die, die mit $_ anfangen) weitestgehend abgewöhnen.

* Ein vernünftiges Architekturmodell verwenden. Dafür gibt es gute Frameworks aller Formen und Farben.

* Objektorientiert entwickeln und dabei keinen Mist machen. DI verwenden. Factorys bauen. Keine riesigen Singletons entwerfen. Faustregel: Eine Methode passt auf eine Bildschirmseite, alles darüber ist zu groß und muss verkleinert werden.

* Nicht bei "Das Rad erfinden" anfangen.
 
Hi,

die isset Prüfung in Zeile 5 enthält einen Fehler. $POST_ statt $_POST. Daher ist $user immer null. Evtl. lehnt die Datenbank das ab, kannst ja mal die DDL der Tabelle posten. Außerdem solltest du prüfen, welchen Error Mode PDO verwendet. Standard ist m.W.n Exception, d.h. du brauchst einen try catch Block um die PDO Anweisungen.

Auch wenn es vielleicht nur um eine Lehraufgabe zum besseren Verständnis geht, du hast hier schon einige gute Hinweise bekommen. Bitte berücksichtige diese. Passwörter dürfen zum Beispiel niemals im Klartext gespeichert werden, sondern immer nur als Hash mit Secret Salt. Am besten verwendest du einen Algorithmus wie PBKDF2, dieser ist zum Beispiel speziell zu diesem Zweck entwickelt worden. Solche grundlegend falschen Konzepte schleichen sich sonst später im Job immer wieder ein. Das Netz ist leider voll von furchtbar schlechten Tutorials zu PHP und Datenbanken, Stichwort Gästebuch oder Forum. Bei https://www.owasp.org findest du Hinweise, wie du gängige Fehler im Bereich Sicherheit vermeidest. Wer später mal beruflich programmieren möchte, egal in welcher Sprache, für den ist das Pflichtlektüre.

Viele Grüße
 
Zurück
Oben