• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Sessionvariable in Datenbank speichern

Bei normalen sql Anweisungen hatte ich damit keine Probleme, anscheinend müssen bei mysqli die Variablennamen irgendwie anders behandelt werden. Aber wie?
Du hast vier Parameter definiert, übergeben tust Du aber nur einen einzigen: Deinen String.
Es fehlen also drei Parameter.
 
Selbst wenn ich das der Einfacheit halber nur mit einem Parameter mache, gibts Probleme. Im folgenden Beispiel werden alle Parameter statisch angegeben und alles klappt einwandfrei:

PHP:
$sql = 'INSERT INTO test (a1) VALUES (?)';
$entry = $db->prepare( $sql );
$entry->bind_param( 's', $_SESSION[a1]);
$entry->execute();

Nun ersetzte ich den Db Feldnamen (hier a1) durch eine Variable, die genau das selbe enthält:

PHP:
$dbFieldString = 'a1';

$sql = 'INSERT INTO test ($dbFieldString) VALUES (?)';
$entry = $db->prepare( $sql );
$entry->bind_param( 's', $_SESSION[a1]);
$entry->execute();

Jetzt bekomme ich die Fehlermeldung: Fatal error: Call to a member function bind_param() on a non-object

Also ich interpretiere das so, als ob PHP nun den Datenfeldnamen (a1) nicht mehr als Objekt erkennt. Die selbe Fehlermeldung erscheint auch, wenn ich irgend einen anderen Parameter (z.B. das ? hinter VALUES) durch eine Variable ersetzte. Also wie kann ich diese Parameter nicht statisch, sondern als Variabe übergeben? Anscheinend hab ich hier ein ganz dickes Brett vorm Kopf. :confused:
 
Also ich interpretiere das so, als ob PHP nun den Datenfeldnamen (a1) nicht mehr als Objekt erkennt. Die selbe Fehlermeldung erscheint auch, wenn ich irgend einen anderen Parameter (z.B. das ? hinter VALUES) durch eine Variable ersetzte. Also wie kann ich diese Parameter nicht statisch, sondern als Variabe übergeben?
Die Fehlermeldung deutet darauf hin, dass prepare eine Fehlermeldung statt eines gültigen Objektes zurückgegeben hat, was weiterhin darauf hindeutet, dass Dein SQL-Statement einen Fehler aufwirft.
Die mangelnde Fehlerbehandlung führt dann zur Fehlermeldung mit der PHP die Ausführung abbricht.

Du sollest Dir unbedingt angewöhnen Rückgabewerte auf Fehler zu untersuchen - im Grunde muss man bei jedem Funktionsaufruf davon ausgehen, dass er schief gehen kann.
Außerdem würde ein einfaches echo $sql; Dir zeigen, dass Du den Unterschied zwischen ' und " in PHP noch nicht verstanden hast.
 
Zuletzt bearbeitet:
Du sollest Dir unbedingt angewöhnen Rückgabewerte auf Fehler zu untersuchen

Da hast du recht, das sollte ich mir wirklich angewöhnen. ;)


Außerdem würde ein einfaches echo $sql; Dir zeigen, dass Du den Unterschied zwischen ' und " in PHP noch nicht verstanden hast.

Ich denke, den Unterschied hab ich schon verstanden. Der Text zwischen ' wird von PHP nicht verarbeitet, während dagegen der Text zwischen " sehr wohl verarbeitet wird.

Auch habe ich mir den Inhalt von $sql mehrfach ausgeben lassen, ohne allerdings den feinen Unterschied zu bemerken. Aber dein Tip hat da natürlich voll ins Schwarze getroffen. Ohne den Zusatz
dass Du den Unterschied zwischen ' und " in PHP noch nicht verstanden hast.
hätte ich es wahrscheinlich immer noch nicht bemerkt. Wie schon gesag: Brett vorm Kopf. Allerdings ist das auch mein Lieblingsfehler - ca. 80% meiner Fehler basieren auf diesen vermaledeiten ' und ".

So, an dieser Stelle erst mal vielen Dank an alle, die mir hier so tatkräftig mit ihren Ratschlägen geholfen haben. Es tut richtig gut in einem Forum zu sein, wo man noch echte Hilfe bekommt - nicht immer nur Verweise auf Google, Suchfunktion oder englisch sprachige Manuals.

Dudl313

P.S.: Und zum Schluß noch eine Frage "Off Topic": Wie kriege ich bei meinen Zitaten den Namen des Zitierten da mit rein?
 
Allerdings ist das auch mein Lieblingsfehler - ca. 80% meiner Fehler basieren auf diesen vermaledeiten ' und ".
Dagegen gibt es einen ganz einfachen Trick: Einfach gar keine Variablen innerhalb von Zeichenketten verwenden, sondern immer nur außerhalb.
Schon kannst Du Dich ganz auf andere Fehler konzentrieren.
 
Zurück
Oben