shordy: Kontextwechsel - Sichere queries in SQLite3

Hallo,

ich wollte Benutzereingaben sicher machen. Für den Fall, dass User ' (Hochkomma) eingeben wollte ich den String durch addslashes() formatieren. Ok, maskiert. Irgendwo habe ich gelesen, dass die Maskierung durch den \ ebenfalls für SQL gültig ist. Allerdings anscheinend nicht für SQLite3?!?

Hier habe ich dann von der nativen Funktion escapeString gelesen. Die ist jetzt so nett und macht aus ' ein ". Und was, wenn der User jetzt Lil' John heisst?

Gibt es da irgendeine Lösung? Funktioniert das escapen der Hochkommas in MySQL?

Liebe Grüße

  1. Hi!

    ich wollte Benutzereingaben sicher machen. Für den Fall, dass User ' (Hochkomma) eingeben wollte ich den String durch addslashes() formatieren. Ok, maskiert. Irgendwo habe ich gelesen, dass die Maskierung durch den \ ebenfalls für SQL gültig ist. Allerdings anscheinend nicht für SQLite3?!?

    Standard ist wohl eine Verdopplung. (MySQL kann auch '.) Und addslashes() kannst du vergessen, solange es etwas systemspezifisches gibt.

    Hier habe ich dann von der nativen Funktion escapeString gelesen. Die ist jetzt so nett und macht aus ' ein ".

    Macht sie das? Ich würde ja annehmen, dass sie '' aus einem ' macht.

    Und was, wenn der User jetzt Lil' John heisst?

    Dann macht die Funktion genau das richtig für das SQL-Statement. Hast du Angst, dass deine Daten verfälscht werden? Dann lies bitte nochmal die Einleitung vom Kontextwechsel-Artikel, denn dann hast du das Prinzip nicht verstanden.

    Gibt es da irgendeine Lösung? Funktioniert das escapen der Hochkommas in MySQL?

    Wenn man es richtig macht, funktioniert alles.

    Lo!

    1. Macht sie das? Ich würde ja annehmen, dass sie '' aus einem ' macht.

      Yeah. Richtig. Hab ich etwas verspätet festgestellt.

      Und was, wenn der User jetzt Lil' John heisst?

      Dann macht die Funktion genau das richtig für das SQL-Statement. Hast du Angst, dass deine Daten verfälscht werden? Dann lies bitte nochmal die Einleitung vom Kontextwechsel-Artikel, denn dann hast du das Prinzip nicht verstanden.

      Diesen Artikel habe ich ja schon drei mal gelesen. Er ist ja das Problem :) Dort wird nur mySQL behandelt. Das wäre ja schön, wenn das ' funktionierte... Naja. Gut. Jetzt habe ich einen Query wie

      $query = "INSERT INTO sometable (id, bla, tollername) values ('23', 'nothing', 'Lil'' John')";  
      
      

      Ist das das angestrebte Ziel?

      Gibt es da irgendeine Lösung? Funktioniert das escapen der Hochkommas in MySQL?

      Wenn man es richtig macht, funktioniert alles.

      Ich möchte es ja richtig machen. Ist mal wieder ein super Beispiel. Das Internet ist voll mit Tutorials und alle erzählen den gleichen Scheiss. Kreiere eine db, erstelle eine Tabelle mit Hunden oder dergleichen Sinnvollem und erzeuge einen Datensatz. 1Mio solcher Beispiele, wo eins vollkommen reichen würde. Anstatt es mal ein _Einsteiger_-tutorial geben würde, wo es um den (gleichzeitig von allen Profis geforderten) sicheren Umgang mit Datenbanken und Abfragen und co geht... Nix. Genau das gleiche, als ich OOP gelernt habe. Die wichtigen Infos muss man sich dann mühsam zusammenklauben. Naja,

      Vielen Dank für Deine Hilfe soweit...
      Grüße
      shory

      1. Mahlzeit shordy,

        Und was, wenn der User jetzt Lil' John heisst?

        Dann macht die Funktion genau das richtig für das SQL-Statement. Hast du Angst, dass deine Daten verfälscht werden? Dann lies bitte nochmal die Einleitung vom Kontextwechsel-Artikel, denn dann hast du das Prinzip nicht verstanden.

        Diesen Artikel habe ich ja schon drei mal gelesen. Er ist ja das Problem :)

        Der Artikel ist in keinster Weise das Problem - er ist im Gegenteil in nahezu 99,999% aller hier auftretenden Fälle der erste Schritt auf dem Weg zur Lösung.

        Ein Problem ist höchstens Dein Verständnis dieses Artikels.

        Dort wird nur mySQL behandelt.

        Ja, und? Ist das bisschen Transferleistung zu viel verlangt?

        Ich gehe mal davon aus, dass Du PHP benutzt - richtig?

        1.) http://php.net/ aufrufen.

        2.) Nach "real_escape_string" suchen (schließlich haben wir ja kein MySQL, sondern irgendwas anderes - aber eine ähnlich klingende Funktion für SQLite sollte es ja geben).

        3.) Auf der Ergebnisseite "sqlite_escape_string" finden und denken: Mensch, das könnte doch was sein - klicke ich doch einfach mal an ...

        4.) http://de2.php.net/manual/de/function.sqlite-escape-string.php lesen, verstehen und aufhören zu jammern[1].

        Das wäre ja schön, wenn das ' funktionierte... Naja. Gut. Jetzt habe ich einen Query wie

        $query = "INSERT INTO sometable (id, bla, tollername) values ('23', 'nothing', 'Lil'' John')";

        
        >   
        > Ist das das angestrebte Ziel?  
          
        Nur, wenn das das Ergebnis ist, was z.B. hinten aus der o.g. Funktion herauskommt.  
          
          
        
        > Anstatt es mal ein \_Einsteiger\_-tutorial geben würde, wo es um den (gleichzeitig von allen Profis geforderten) sicheren Umgang mit Datenbanken und Abfragen und co geht... Nix.  
          
        1\.) Es gibt den Artikel zum Thema "Kontextwechsel" bei SELFHTML (für Dein konkretes Problem).  
          
        2\.) Es steht Dir frei, irgendjemanden dafür zu bezahlen, dass er Dir die von Dir benötigten Kenntnisse beibringt (ob in Buchform, als Kurs, Schulung, Seminar o.ä.).  
          
        3\.) Du kannst natürlich auch versuchen, besser zu suchen und dann kostenlose Informationen zu erhalten. Aber zu erwarten, dass es diese ja geben \*müsse\*, ist in meinen Augen ziemlich ... nunja ... dreist.  
          
          
        
        > Genau das gleiche, als ich OOP gelernt habe. Die wichtigen Infos muss man sich dann mühsam zusammenklauben.  
          
        Nein, \*muss\* man nicht.  
          
          
        [1] Sorry, aber irgendwie klingen alle Deine Postings in diesem Thread ganz extrem danach.  
          
          
        MfG,  
        EKKi  
        
        -- 
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        
        1. 3.) Auf der Ergebnisseite "sqlite_escape_string" finden und denken: Mensch, das könnte doch was sein - klicke ich doch einfach mal an ...

          4.) http://de2.php.net/manual/de/function.sqlite-escape-string.php lesen, verstehen und aufhören zu jammern[1].

          Sind die sqlite_*-Funktionen für SQLite2-Datenbanken gedacht? Ich vermute mal, dem OP ist mit einem Hinweis auf die SQLite3::escapeString-Methode mehr geholfen.

          1. Mahlzeit Lasbo,

            Sind die sqlite_*-Funktionen für SQLite2-Datenbanken gedacht? Ich vermute mal, dem OP ist mit einem Hinweis auf die SQLite3::escapeString-Methode mehr geholfen.

            Das mag sein - aber ich wollte eigentlich nicht das *komplette* Denken für ihn übernehmen:

            1.) Ich programmiere ja in PHP, vielleicht sollte ich mal ins Handbuch schauen.

            2.) Ich suche eine Funktion - und spezielle eine, die irgendwas mit Datenbanken zu tun hat.

            3.) Ich nutze SQLite3.

            4.) Ich will Zeichenketten maskieren ... Heureka!

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Das mag sein - aber ich wollte eigentlich nicht das *komplette* Denken für ihn übernehmen:

              s.o: dein *komplettes* Denken habe ich wohl somit bereits gedenktet, da ich bereits im OP der Funktion gewahr war, wa?

              Schönes Wochenende.

              1. Mahlzeit shordy,

                Das mag sein - aber ich wollte eigentlich nicht das *komplette* Denken für ihn übernehmen:

                s.o: dein *komplettes* Denken habe ich wohl somit bereits gedenktet, da ich bereits im OP der Funktion gewahr war, wa?

                Ganz offensichtlich nicht, da Dir - im Gegensatz zu mir - offensichtlich überhaupt nicht klar war, was die Funktion eigentlich tut, wie man sie benutzt und was es mit dem Thema "Kontextwechsel" im Gesamten überhaupt so auf sich hat.

                Schönes Wochenende.

                Danke, Dir ebenfalls!

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        2. Ein Problem ist höchstens Dein Verständnis dieses Artikels.

          bis

          lesen, verstehen und aufhören zu jammern[1].

          Vielen Dank für die minuziöse Dokumentation, wie ich die Funktion finden könnte. Leider hast Du darüber wohl übersehen, dass ich bereits in Besitz der Funktion escapeString war, was wohl das selbe übernimmt, wie sqlite_real_escape_string

          zu [1]: Alles was ich ansprach, war eine Sache, die durchaus verbesserungswürdig ist, obwohl ich mir bewußt bin, dass das alles kostenlos und durch viel Engagement entstanden ist und wahnsinnig viel hilft und so weiter.

          3.) Du kannst natürlich auch versuchen, besser zu suchen und dann kostenlose Informationen zu erhalten. Aber zu erwarten, dass es diese ja geben *müsse*, ist in meinen Augen ziemlich ... nunja ... dreist.

          Hoffe, die * sind nicht Deine Zitierzeichen.

          Grüße

  2. Hier habe ich dann von der nativen Funktion escapeString gelesen. Die ist jetzt so nett und macht aus ' ein ". Und was, wenn der User jetzt Lil' John heisst?

    HA!

    Die Funktion macht _nicht_ aus ' ein ". Es sind zwei ' in kurzem Abstand. Das habe ich in dieser Ansicht nicht bemerkt. Sorry.

    Allerdings: was soll daran jetzt sicher sein?

    Zur Erklärung:
    der query für die Funktion wird gebastelt aus zwei Arrays $keys und $vals:

      
    $query_keys = " (".implode(",", $keys).")";  
    $query_vals = " VALUES(".implode(" , ", $vals).")";  
    $query = "INSERT INTO '$table'".$query_keys.$query_vals;
    

    Die Funktion escapeString wird _vorher_, beim Bau der Arrays auf alle Elemente angewendet, um die ', die ja auch im Query vorkommen, zu maskieren.

    1. Hi,

      Die Funktion macht _nicht_ aus ' ein ". Es sind zwei ' in kurzem Abstand. Das habe ich in dieser Ansicht nicht bemerkt. Sorry.

      Allerdings: was soll daran jetzt sicher sein?

      D'oh! http://www.sqlite.org/faq.html#q14

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      1. D'oh! http://www.sqlite.org/faq.html#q14

        Juut. Und wenn ich dann mal die Daten raushole sowas:

        $string = str_replace("''", "'", $string);

        ? Oder bin ich auf dem Holzweg?

        Grüße

        shordy

        1. Hi,

          D'oh! http://www.sqlite.org/faq.html#q14

          Juut. Und wenn ich dann mal die Daten raushole sowas:

          $string = str_replace("''", "'", $string);

          ? Oder bin ich auf dem Holzweg?

          Ja, bist du.
          Warum, erklärt der Artikel, auf den dedlfix gerade erneut hingewiesen hatte.
          Auch wenn das dort geschriebene nicht speziell auf SQLite bezogen ist, so ist doch das *Prinzip* genau das selbe. Also bemühe dich bitte, das jetzt langsam mal zu verstehen.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. Auch wenn das dort geschriebene nicht speziell auf SQLite bezogen ist, so ist doch das *Prinzip* genau das selbe. Also bemühe dich bitte, das jetzt langsam mal zu verstehen.

            Ach, ChrisB, wenn Du zu den Leuten gehören würdest, die sich in die Denkweise von Personen, die es _noch nicht_ verstanden haben reinversetzen können, dann wärst du a) eine größere Hilfe und b) nicht so schnippisch. Aber das kenne ich ja schon von Dir.

            1. Hi,

              Auch wenn das dort geschriebene nicht speziell auf SQLite bezogen ist, so ist doch das *Prinzip* genau das selbe. Also bemühe dich bitte, das jetzt langsam mal zu verstehen.

              Ach, ChrisB, wenn Du zu den Leuten gehören würdest, die sich in die Denkweise von Personen, die es _noch nicht_ verstanden haben reinversetzen können, dann wärst du a) eine größere Hilfe und b) nicht so schnippisch.

              Das, wonach du hier vorher gefragt hast, hättest du auch erst mal selber *ausprobieren* können.

              Und wenn du den Artikel mit Verstand durchgelesen hättest, dann hätte dir das eigentlich auch schon klar sein sollen. Vermutlich hast du ihn nur überflogen ...?

              Aber das kenne ich ja schon von Dir.

              Du erarbeitest dir hier ja auch gerade eine Bekanntheit für ein bestimmtes Verhalten.

              MfG ChrisB

              --
              RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
              1. Das, wonach du hier vorher gefragt hast, hättest du auch erst mal selber *ausprobieren* können.

                Mein OP enthielt die Fehlannahme, dass ich ein " erhalten habe, wofür ich mich entschuldigt habe.

                Und wenn du den Artikel mit Verstand durchgelesen hättest, dann hätte dir das eigentlich auch schon klar sein sollen. Vermutlich hast du ihn nur überflogen ...?

                Was meinst Du? Die Info, die ich dann noch gebraucht habe war, dass die '' nicht in die Datenbank eingehen, sondern nur ein einfaches '. Darauf hat mich Vincent Mai hingewiesen. Im Artikel "Kontextwechsel" steht dazu nix.

                Aber das kenne ich ja schon von Dir.

                Du erarbeitest dir hier ja auch gerade eine Bekanntheit für ein bestimmtes Verhalten.

                und zwar?

                Grüße
                shordy

                1. Mahlzeit shordy,

                  Was meinst Du? Die Info, die ich dann noch gebraucht habe war, dass die '' nicht in die Datenbank eingehen, sondern nur ein einfaches '. Darauf hat mich Vincent Mai hingewiesen. Im Artikel "Kontextwechsel" steht dazu nix.

                  Das ist nicht korrekt. Ich zitiere (Abschnitt "Programmcode und Daten", drittes Beispiel):

                  -----8<-----

                  $text = "Der Computer sagte: \"Meine Batterie ist alle.\" Dann schaltete er sich selbst aus.";

                  Der Backslash maskiert das zweite Anführungszeichen. Es wird nun nicht mehr als Stringbegrenzer angesehen. [...] Maskierungen (englisch Escaping) sind nur für die richtige Interpretation von Zeichen beim Lesen eines Dokuments oder Datenstroms notwendig. Die interne Verarbeitung wird meistens mit den Rohdaten stattfinden, denn Maskierzeichen sind meist auch nur normale Zeichen und dürfen bei der Stringverarbeitung (zum Beispiel Zeichen zählen) nicht berücksichtigt werden. Die Maskierzeichen werden beim Lesevorgang entfernt. Im Speicher steht der Wert also wieder als:

                  Der Computer sagte: "Meine Batterie ist alle." Dann schaltete er sich selbst aus.

                  ----->8-----

                  Ich wüsste nicht, was daran missverständlich ist: die Maskierung sorgt lediglich dafür, dass die Daten richtig interpretiert und gespeichert werden - in den gespeicherten Daten sind die Maskierungszeichen nicht vorhanden.

                  Jetzt wieder ein bisschen Transferleistung:

                  Wenn die *Maskierung* von einfachen Anführungszeichen (') in SQLite durch verdoppeln derselben geschieht - wieviele Anführungszeichen werden dann wohl in die Datenbank geschrieben?

                  [ ] Keins, da sich die Zeichen gegenseitig aufheben.

                  [ ] Eins, da das andere Anführungszeichen lediglich der Maskierung dient.

                  [ ] Beide, da alles so gespeichert wird wie es in der Zeichenkette steht.

                  MfG,
                  EKKi

                  --
                  sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                  1. Ich wüsste nicht, was daran missverständlich ist: die Maskierung sorgt lediglich dafür, dass die Daten richtig interpretiert und gespeichert werden - in den gespeicherten Daten sind die Maskierungszeichen nicht vorhanden.

                    Sag mal, was ist denn hier los. Ich arbeite seit drei Jahren mit php und ich kann dir versichern, dass ich mir vollkommen bewußt bin, was es mit kontextwechsel und der maskierung von zeichen auf sich hat.

                    Missverständlich war daran lediglich, dass es sich mit dem Backslash bei sqlite nunnmal nicht machen lässt. OK?

                    Aus meinem OP, dass Du vielleicht schonmal gelesen hast:

                    Irgendwo habe ich gelesen, dass die Maskierung durch den \ ebenfalls für SQL gültig ist. Allerdings anscheinend nicht für SQLite3?!?

                    Die Fehlannahme, der ich erlag konnte duch den Artikel "Kontextwechsel" nicht ausgeräumt werden.

                    Weiter habe ich die von mir bereits entdeckte Funktion escapeString falsch beobachtet.

                    Die ist jetzt so nett und macht aus ' ein ".

                    Diese Beobachtung stimmte nicht, sie machte aus ' ein '', was ich bis zu meinem ersten Post nicht sah, weil die Ausgabe im Browser identisch aussieht.

                    Dies und die Info, dass dies die "Maskierung" für SQLite3 darstellt, war der Schlüssel zum ERfolg. Auch Dein Zitat ändert nichts an der Tatsache, das meine Verständnislücke nicht im Artikel besprochen wird.

                    Vielen Dank und lass mal gut sein jetzt.

                2. Hi,

                  Was meinst Du? Die Info, die ich dann noch gebraucht habe war, dass die '' nicht in die Datenbank eingehen, sondern nur ein einfaches '. Darauf hat mich Vincent Mai hingewiesen. Im Artikel "Kontextwechsel" steht dazu nix.

                  Doch, genau das ist dort erklärt.

                  MfG ChrisB

                  --
                  RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            2. Hi!

              Ach, ChrisB, wenn Du zu den Leuten gehören würdest, die sich in die Denkweise von Personen, die es _noch nicht_ verstanden haben reinversetzen können, dann wärst du a) eine größere Hilfe und b) nicht so schnippisch. Aber das kenne ich ja schon von Dir.

              Das ist nun ein bißchen arrogant von Dir, sorry! ChrisB hat hier schon unzähligen Leuten geholfen, *weil* er die Leute fordert und wieder fordert und nochmals auffordert mitzudenken[sic]!
              Dafür gebührt ihm Dank.

              Wenn Du eine (kostenlose) größere Hilfe als seine suchst, bist Du auf einem morschen Holzweg unterwegs.

              Schnippisch bist Du doch auch gerade. ChrisB ist aber auf Deine Expertise nicht angewiesen. Du solltest überdenken, ob Du auf seine verzichten willst - ich würde das nicht wollen.

              Es ist nicht das Ziel dieses Forums 100% der Fragesteller glücklich zu machen -  die "Glücklichgemachten" bleiben aber nicht selten dem Forum treu und werden dann manchmal zu 'Regulars', die dann andere auch nicht immer glücklich machen.

              Anders gesagt: welche Hilfe wollte man denn, wenn nicht die dieses Forums?

              off:PP

              --
              "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
              1. Das ist nun ein bißchen arrogant von Dir, sorry! ChrisB hat hier schon unzähligen Leuten geholfen, *weil* er die Leute fordert und wieder fordert und nochmals auffordert mitzudenken[sic]!
                Dafür gebührt ihm Dank.

                Danke, ChrisB, für Deine Hilfe.

                Ist nicht so, dass ich es nicht anerkenne. Ich habe große Achtung vor dem gesamten Forum von Selfhtml. Ich versuche mich an die Charta zu halten. Ich benutze erst google, dann poste ich. Ich versuche mich deutlich auszudrücken, was mir bestimmt nicht immer gelingt. Ich achte auf meine Rechtschreibung, weil es hier gern gesehen wird.

                Wenn Du eine (kostenlose) größere Hilfe als seine suchst, bist Du auf einem morschen Holzweg unterwegs.

                Ja, anscheinend. Nur kann ich ja eine andere Philosophie des Lehrens vertreten. Ich zum Beispiel gebe auf anderen technischen Gebieten seit Jahren Tutorien (Geoinformationssoftware). Meine Philosophie ist es, sich in einen absoluten Newbie reinzuversetzen und niemals auf seine Verständnisprobleme herabzusehen. Ich sehe durch Motivation und Verständnis mehr Aussicht auf Erfolg und Spass bei der Sache. Es ist eine hohe Kunst jemandem etwas beizubringen. Es bedeutet mehr, als Experte zu sein. Es bedeutet, dass man sich selbst (Wissen und Ego) zurückstellt.

                Schnippisch bist Du doch auch gerade. ChrisB ist aber auf Deine Expertise nicht angewiesen. Du solltest überdenken, ob Du auf seine verzichten willst - ich würde das nicht wollen.

                Ok. Ich würde nur gerne darauf verzichten, wenn dies die einzige Antwort ist:

                Ja, bist du.
                Warum, erklärt der Artikel, auf den dedlfix gerade erneut hingewiesen hatte. Auch wenn das dort geschriebene nicht speziell auf SQLite bezogen ist, so ist doch das *Prinzip* genau das selbe. Also bemühe dich bitte, das jetzt langsam mal zu verstehen.

                Diese bringt mir nichts, weil gerade der Bezug zu SQLite das Problem darstellte, nicht die Thematik. Ansonsten bedanke ich mich hiermit für alle Hilfe durch dieses Forum!

                Grüße

        2. Hallo,

          D'oh! http://www.sqlite.org/faq.html#q14

          Juut. Und wenn ich dann mal die Daten raushole sowas:

          $string = str_replace("''", "'", $string);

          Nein, kannst Du weglassen. In der DB landet nur ein einziges einfaches Anführungszeichen. Die Verdoppelung ist eine Transportmaskierung, die von SQLite selbstverständlich entfernt wird.

          ? Oder bin ich auf dem Holzweg?

          Ja. Für das Auslesen ist keine Transportmaskierung erforderlich. Du erhältst die Daten, die Du gespeichert hast. Das ist etwas anderes als das, was im SQL-Statement steht. *Dort* ist das Anführungszeichen einzig und allein für den Transport maskiert.

          Freundliche Grüße

          Vinzenz

          1. Nein, kannst Du weglassen. In der DB landet nur ein einziges einfaches Anführungszeichen. Die Verdoppelung ist eine Transportmaskierung, die von SQLite selbstverständlich entfernt wird.

            Alles klar. Vielen Dank:

            ich verwende jetzt SQLite3::escapeString, was mir erstmal aus meinem ' ein doppeltes macht '', von denen aber nur eins in der Datenbank landet.

            Vielen Dank an alle.

            1. Mahlzeit shordy,

              ich verwende jetzt SQLite3::escapeString, was mir erstmal aus meinem ' ein doppeltes macht '', von denen aber nur eins in der Datenbank landet.

              Mensch, ist denn das die Möglichkeit? Das funktioniert dann ja genauso, wie es im Artikel "Kontextwechsel" beschrieben wird ... da staunt der Fachmann und der Laie wundert sich.

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    2. Hallo,

      Hier habe ich dann von der nativen Funktion escapeString gelesen. Die ist jetzt so nett und macht aus ' ein ". Und was, wenn der User jetzt Lil' John heisst?

      Allerdings: was soll daran jetzt sicher sein?

      Das einfache Anführungszeichen begrenzt in SQL Zeichenketten. Doppelte Anführungszeichen begrenzen in SQL normalerweise *keine* Zeichenketten, sondern Bezeichner wie zum Beispiel Tabellen- oder Spaltennamen. MySQL in der Standardkonfiguration macht etliche Ausnahme vom SQL-Standard.

      der query für die Funktion wird gebastelt aus zwei Arrays $keys und $vals:

      sowas:

      $query_keys = " (".implode(",", $keys).")";
      $query_vals = " VALUES(".implode(" , ", $vals).")";
      $query = "INSERT INTO '$table'".$query_keys.$query_vals;

        
      solltest Du \*nicht\* machen :-)  
        
      a) Dein SQL-Statement ist syntaktisch nicht korrekt.  
         Wenn Du den Tabellennamen in Anführungszeichen packst, dann in  
         doppelte Anführungszeichen (ANSI-Quotes).  
        
      b) Gleiches gilt für Deine Spaltennamen, die Du \*hmmm\* etwas ungewöhnlich  
         als "keys" bezeichnest.  
        
      c) Die Spalteninhalte sind mit [escapeString](http://www.php.net/manual/de/sqlite3.escapestring.php) zu behandeln.  
         Dein Code sieht \*keine\* Begrenzer für Deine Werte vor.  
         Bei Zeichenketten benötigst Du zwingend das einfache Anführungszeichen  
         als Begrenzer. Nein, dieses Begrenzerzeichen ist \*nicht\* Bestandteil  
         des Wertes.  
         Bei NULL darfst Du keine Begrenzer verwenden.  
        
      Fazit:  
      So einfach kannst Du Dir nicht eine Funktion zusammenstricken, die ein  
      beliebiges INSERT-Statement erzeugt.  
        
      Ich fürchte, Du hast dedlfix' Kontextwechselartikel noch nicht so recht verstanden :-(  
        
        
      Freundliche Grüße  
        
      Vinzenz