Ankündigung

Einklappen
Keine Ankündigung bisher.

sql abfrage variables feld

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • sql abfrage variables feld

    Hallo, ich versuche gerade eine sql update zu machen mit einem variablen Feld. Leider funktioniert es nicht.

    PHP-Code:
    $query1 "UPDATE `sus` SET '.$i.' = '5' WHERE id = '$_GET[susID]' AND tan = '$_POST[tan]'"

    In $i steht immer eine Zahl.
    Wie kann ich das Feld als Variable angeben?

    Gruß

  • #2
    1. Felder durchzunummerieren ist keine gute Idee.
    2. Wie meinst du Feld als Variable? $i ist doch bereits eine. (Allerdings ist auch das keine so gute Idee, du solltest wissen welches Feld du updaten willst.)

    Außerdem: Warum nicht einfach echo $query1?

    Kommentar


    • #3
      Es geht nicht ums durchnummerieren. Es geht darum, dass das Feld variable ist. dh. es kann sein, dass es in die Spalte "name" oder in die spalte "vorname" soll.

      Es scheint, als dürfe $i keine Zahl sein. Wenn ich es nun aber mit Buchstaben machen, funktioniert es auch nicht.

      Die frage ist halt, wie ich '.$i.' = '5' korrekt schreiben kann, sodass kein Fehler entsteht.


      Kommentar


      • #4
        Vier Stichwörter, die du dir unbedingt anschauen solltest: String Concatenation, Kontextwechsel, SQL Injections, Validation.

        Kommentar


        • #5
          Wie sehr hilfreich du bist.

          Kommentar


          • #6
            Oh, ich hoffe die Ironie ist rüber gekommen...

            Kommentar


            • #7
              Wenn Variablen wie $i unter doppelten Anführungszeichen ("") verwendest, werden diese interpoliert. Du versuchst mit den Punkten zwei Strings zu verbinden, hast aber nur einen. Der daraus resultierende Feldname ist daher z.B. `.name.` (die Punkte sind Teil des Bezeichners).

              Wie gesagt, lass dir den Query ausgeben. Chris. hat außerdem schon viele wichtige Stichwörter geliefert.

              Kommentar


              • #8
                Zitat von CHRIS Beitrag anzeigen
                Hallo, ich versuche gerade eine sql update zu machen mit einem variablen Feld. Leider funktioniert es nicht.

                Sei froh. Du hast nun die Chance, das alles zu überdenken. Es ist Mist.
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von CHRIS Beitrag anzeigen
                  Wie sehr hilfreich du bist.
                  Dazu ein Zitat aus den Forenrichtlinien:

                  Zitat von Sei sozial
                  Wir haben kein Interesse daran, kostenlos Deine Skripte zu schreiben oder zu reparieren, da das sehr viel Zeit und Mühe kosten kann. Akzeptiere also, dass sich unsere Motivation eventuell von Deiner unterscheidet und wir daher nur Hilfe zur Selbsthilfe geben. Wir sind nicht die Wohlfahrt und akute Programmierprobleme keine Notlagesituation.
                  Aber wir wollen nicht so sein ...

                  Prepared Statements: Verwende Prepared Statements, um dich vor SQL Injections zu schützen. Prepared Statements sind als Template für Queries zu verstehen, die mit "Placeholdern" für später zu bindenden Werten versehen sind. Grund dafür ist, dass das DBMS (Datenbank Management System) bereits vor Ausführung des Queries einen Plan erstellen kann, wie ein Query am besten zu verarbeiten ist. Resultat ist, dass man vor SQL Injections geschützt ist und ein Query grundsätzlich bestmöglich ausgeführt werden kann. Prepared Statements sind einfach zu nutzen und sehr effektiv - sie sind daher sehr zu empfehlen (Weitere Informationen: http://en.wikipedia.org/wiki/Prepared_statement - Eng. Wikipedia, da dieser Artikel im Deutschen nicht sehr ausführlich behandelt wird).

                  Wichtig ist an diesem Punkt zu erwähnen, dass Feldnamen, wie sie hier benötigt werden, nicht mit Placeholdern gesetzt werden können. Grund: Das Datenbank Management System muss bereits die Tabelle, das Feld etc. kennen, um mit dem "prepared" Query einen Plan für die spätere Ausführung erstellen zu können. Du musst also den Feldnamen bereits manuell einfügen und dann den Query "preparen". Wichtig ist, dass du auch bereits bei diesem Schritt das Thema SQL Injections nicht vergisst und bereits hier maskierst (bspw. PDO::quote()).

                  SQL Injections: So nennt man die Veränderung eines Queries durch Benutzereingaben. Ein Query wird folglich nicht mehr nach Wünschen des Entwicklers ausgeführt, sondern nach Wünschen des Benutzers, der die Applikation mit den Benutzereingaben füttert. Folgen können vielseitige Attacken auf das eigene System sein, wobei auch die Benutzer deiner Applikation zu schaden kommen können und nicht nur die Applikation. Auf das Thema, wie man sich vor SQL Injections grundsätzlich schützen kann werde ich nicht eingehen, da ich bereits Prepared Statements behandelt habe und es unzählige Beiträge dazu im Netz zu finden gibt. Daher einfach mal etwas "Research" betreiben, falls weitere Informationen zur Funktionsweise von SQL Injections benötigt werden.

                  Kontextwechsel: Es muss der Applikation zu jeder Zeit klar sein, wann ein Zeichen behandelt werden muss und wann ein Zeichen unbehandelt bleiben sollte. Beim PHP-Parser kommen hier Hochkommata zum Einsatz. Diese Thematik bildet auch die Hauptursache für SQL Injections. Es empfiehlt sich daher SQL und PHP entweder Single-Quote oder Double-Quote zuzuweisen. Ich selbst verwende Double-Quotes für Stringbegrenzer in SQL Queries und Single-Quotes für den PHP-Parser. Hat auch mit der Verarbeitung von Single- und Double-Quotes vom PHP-Parser zu tun. Aber darauf werde ich nun nicht weiter eingehen. Dafür kannst du das PHP Manual durchsuchen.

                  String Concatination: Es gibt mehrere Wege, Strings zu verbinden. Ich finde jedoch, es gibt nur einen ordentlichen Weg dies zu tun. Zwischen Strings und Variablen, die verbunden werden sollen, sollten immer Punkte gesetzt werden. Beispiel:

                  PHP-Code:
                  echo 'Name: ' $name ' Age: ' $age PHP_EOL
                  Validation: Bevor man Daten in eine Datenbank einträgt bzw. in der eigenen Applikation verwendet, sollte man diese validieren (= überprüfen). Hier kommt das EVA(S)-Prinzip zum Einsatz. Bevor wir Daten verwenden, überprüfen wir diese. Im von dir geposteten Query verwendest du sowohl POST- als auch GET-Daten, ohne diese zuvor zu validieren. Dies stellt ein Sicherheitsrisiko dar und sollte daher schnellstens behoben werden. Im Generellen gilt: Keine POST-/GET-Daten direkt in einen Query einsetzen!

                  Zum Vorhaben: Die Verwendung von variablen Feldnamen zeugt in den meisten Fällen von einem schlechten Datenbankdesign. Hast du die Thematik Datenbank-Normalisierung komplett beachtet? Was hast du denn vor? Wieso benötigst du variable Feldnamen? Variable Feldnamen stellen i.d.R. Gefahren dar und sollte wenn möglich vermieden werden. Man verwendet oftmals bei variablen Feld- bzw. Tabellennamen daher bereits Whitelists. Eine Aufklärung zum Vorhaben wäre daher hilfreich.

                  Kommentar

                  Lädt...
                  X