PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben
ebody
- php
- sql
Hallo,
in einem PHP Script möchte ich u.a. Spaltennamen als Parameter an eine Funktion übergeben, die diese dann in einen SQL Befehl übernimmt.
$new_SqlFunctions->sqlCommandInsertInto("tbl_name", "Spalte1,Spalte2,Spalte3", "'Wert1','Wert2','Wert3'");
…
public function sqlCommandInsertInto ($sqlTableName, $sqlColumns, $sqlValues){
$sqlQueryInsertInto = "INSERT INTO $sqlTableName ($sqlColumns) VALUES ($sqlValues)";
$this->mysqli->query($sqlQueryInsertInto);
}
Es gibt aber immer eine Fehlermeldung:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '0) VALUES...
Ich vermute, dass es daran liegt, dass die Spaltennamen als ein String übergeben werden und der Code dann so "aussieht"...
INSERT INTO tbl_name ("Spalte1,Spalte2,Spalte3") oder INSERT INTO tbl_name ("Spalte1","Spalte2","Spalte3")
...die Spaltennamen aber ohne Anführungszeichen dort stehen müssen
INSERT INTO tbl_name (Spalte1,Spalte2,Spalte3)
Ich habe die " ersetzt, aber das hat nichts gebracht.
Wie kann ich die Spaltenamen richtig übergeben?
Gruß ebody
Tach!
Ich vermute, dass es daran liegt, dass die Spaltennamen als ein String übergeben werden und der Code dann so "aussieht"...
Du musst nicht (nur) vermuten, du kannst prüfen. Lass dir einfach das Ergebnis ausgeben, also den Inhalt der Variable $sqlQueryInsertInto
Wie kann ich die Spaltenamen richtig übergeben?
Besser wäre, nicht Teile des Statements anderenorts vorzubereiten, sondern die Namen und Werte einzeln (oder als Array) zu übergeben und das Zusammenbauen innerhalb der Funktion vorzunehmen. Separation of Concerns nennt man das. Der Rest des Programms muss nicht wissen, dass es da ein SQL-Statement gibt und wie dessen Syntax ist.
dedlfix.
Moin,
Darf ich dezent darauf hinweisen, dass hier eventuell ein Scheunentor für SQL-injections gebaut wurde? Besser, wenn man die mysqli-Erweiterung nutzt, ist es, pepeared-Statements zu verwenden. Zumindest sollte die Funktion, so es denn eine Methode ist, entsprechend gekapselt werden. So wie sie da steht ist es m.E.n. eine Sicherheitslücke.
Gruß Bobby
Hallo bobby,
grundsätzlich ein berechtigter Hinweis.
Wie ist das bei prepared Statements mit den Spaltentypen? Kann ich grundsätzlich alles als String übergeben und MySQL parsed daraus Zahlen, Datümer und sonstiges? Oder muss ich zwingend typgerecht binden? Dann wäre ein Auto-Prepare nämlich mühsam, und du fängst an, ein ORM zu bauen.
Rolf
Moin,
Bei mysqli kannst du in der prepare-Methode den Typ angeben:
$stmt->bind_param(‚iss‘, $pId, $pVorname, $pNachname);
Bei PDO ähnlich wo bei erstmal alles als PDO::PARAM_STR behandelt werden.
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
Allerdings wir bei PDO der Typ automatisch erkannt, wenn man die Variablen direkt beim execute bindet wenn ich das richtig verstanden habe:
$params = array(1, 21, 63, 171);
$sth->execute($params);
Gruß Bobby