ebody: PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben

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

akzeptierte Antworten

  1. 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.

  2. 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

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. 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

      --
      sumpsi - posui - clusi
      1. 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

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)