Ankündigung

Einklappen
Keine Ankündigung bisher.

schlanke Abfrage

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

  • schlanke Abfrage

    Hallo liebe Leute,

    ich habe folgendes query und frage mich ob man es nicht eleganter lösen kann?
    PHP-Code:


    $sql 
    "SELECT `id_An` 

    FROM `anmeldung` 

    WHERE (

    `Tran`                      LIKE '"
    .$wert."' OR


    `Transponder_ID`      LIKE '"
    .$wert."' OR


    `Tran2`                     LIKE '"
    .$wert."' OR 


    `Transponder_ID_2`   LIKE '"
    .$wert."' OR  


    `Tran3`                     LIKE '"
    .$wert."' OR 


    `Transponder_ID_3`   LIKE '"
    .$wert."' OR 


    `Tran4`                     LIKE '"
    .$wert."' OR 


    `Transponder_ID_4`   LIKE '"
    .$wert."' 


    ) AND `id_rennen`     LIKE '%"
    .$wert2."%'


    "



  • #2
    Ordentlich einrücken :>
    Tabelle normalisieren.
    "=" benutzen, wenn du für das LIKE eh keine wildcards nutzt.

    Wahrscheinlich ist das auch eine Einladung für SQL-Injection.
    Es ist seltsam, dass du ausgerechnet für die id_rennen Wildcards in der Klausel nutzt.
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Stay fit

    Kommentar


    • #3
      Zitat von VPh Beitrag anzeigen
      Ordentlich einrücken :>
      Tabelle normalisieren.
      "=" benutzen, wenn du für das LIKE eh keine wildcards nutzt.

      Wahrscheinlich ist das auch eine Einladung für SQL-Injection.
      Es ist seltsam, dass du ausgerechnet für die id_rennen Wildcards in der Klausel nutzt.
      Die Optic war nicht das Problem, aber am Rande die Einrückungen sind nicht übernommen worden. LIKE ganz einfach weil LIKE die schreibweise egalisiert und der Name `id_rennen` mag etwas irritierend sein, denn hier sind nur keine ID im herkömmlichen Sinne, sondern nur floates aus einer anderen Tabelle, DIe Frage war ob es eine elegante oder schmalere Lösung gibt

      Kommentar


      • #4
        Redundanzen sind auch nicht möglich, aber um den Service für den Kunden zu erhöhen, will ich vorher abfragen ob die Transponder ID bereits irgendwo anders in entsprechender Veranstaltung verwendet wird und das dann vor Abspeichern als Warnung ausgeben.

        Kommentar


        • #5
          Datenbankdesign ist Müll. Korrigiere das, dann wird auch die Abfrage einfacher.

          Kommentar


          • #6
            Zitat von Cyclestores Beitrag anzeigen
            aber am Rande die Einrückungen sind nicht übernommen worden.
            Dann korrigiert man das eben, notfalls per Hand, aber uns das jedes mal so zu präsentieren ist schon frech, zumal es nicht das erste mal ist, das wir dich darauf hinweisen. Ich habe das mal für dich gemacht, damit du siehst wie einfach das dann für uns zu lesen ist
            PHP-Code:
            $sql "
            SELECT
                  `id_An`
            FROM
                  `anmeldung`
            WHERE (
                    `Tran`            LIKE '"
            .$wert."' OR
                    `Transponder_ID`  LIKE '"
            .$wert."' OR
                    `Tran2`           LIKE '"
            .$wert."' OR
                    `Transponder_ID_2`LIKE '"
            .$wert."' OR  
                    `Tran3`           LIKE '"
            .$wert."' OR
                    `Transponder_ID_3`LIKE '"
            .$wert."' OR
                    `Tran4`           LIKE '"
            .$wert."' OR
                    `Transponder_ID_4`LIKE '"
            .$wert."'
                  )
                  AND
                    `id_rennen`       LIKE '%"
            .$wert2."%'
            "

            Und man sieht auf einen Blick, dass wenn du mit dem gleichen Wert mehrere Spalten abfragst, es wohl nicht anders geht. Ob das nun sinnvoll ist oder nicht, werde ich hier nicht hinterfragen, da deine deine ganze Tabellenstruktur schon komisch ist, wie man aus anderen Threads weiss. Ich hatte damals schon prophezeit
            Aber da musst du ran, du kennst deine Daten und weisst was du ändern musst, so kannst du das jedenfalls nicht lassen und lerne SQL und deine Datenbank richtig kennen, sonst hast du immer nur Ärger.
            Sieht man ja jetzt wieder.

            Kommentar


            • #7
              ich habe es gelöst, zwar hätte ich immer noch gerne eine schlankere Lösung aber es geht auch so.
              PHP-Code:
              $query "SELECT `id_An` 
                        FROM `anmeldung` 
                          WHERE 
                                  (
                                  `Transponder_ID`       = ? OR

                                  `Transponder_ID_2`    = ? OR     

                                  `Transponder_ID_3`    = ? OR    

                                  `Transponder_ID_4`    = ?
                                   )
                                   AND 
                                   `id_rennen` LIKE  ? 
                                  "
              ;
                          
              /** Daten abfragen*/ 

              Kommentar


              • #8
                Zitat von Cyclestores Beitrag anzeigen
                LIKE ganz einfach weil LIKE die schreibweise egalisiert
                Wenn du damit case-insensitiv meinst, dass ist bei Mysql i.d.R. auch bei = gegeben. (Kollation die auf ci endet)

                Zitat von Cyclestores Beitrag anzeigen
                ich habe es gelöst, zwar hätte ich immer noch gerne eine schlankere Lösung aber es geht auch so.
                Der Original Code ging ja auch. Wenn du rumtricksen willst kannst du auch mit IN arbeiten. Alternativ würde sich ein VIEW anbieten, der das ganze in Normalform überführt. Das hätte noch die Vorteil, du kannst das Schritt für Schritt in eine vernünftige Form bringen.

                Kommentar


                • #9
                  Die Abfrage in #7 ist etwas anderes als die ursprüngliche.
                  Geheimtrick: Wenn Transponder_ID_ 2 bis 4 nicht mehr abfragst, wird die Abfrage nochmal schlanker. Und eleganter

                  Als tatsächlichen Tipp: Ohne Wissen über die Daten und dein Ziel kann man selten sinnvolle Vorschläge machen. Wie z.B. hätten wir darauf kommen können, dass du "Tran"x gar nicht abfragen musst?
                  Relax, you're doing fine.
                  RTFM | php.de Wissenssammlung | Datenbankindizes | Stay fit

                  Kommentar


                  • #10
                    Zitat von VPh Beitrag anzeigen
                    Die Abfrage in #7 ist etwas anderes als die ursprüngliche.
                    Geheimtrick: Wenn Transponder_ID_ 2 bis 4 nicht mehr abfragst, wird die Abfrage nochmal schlanker. Und eleganter

                    Als tatsächlichen Tipp: Ohne Wissen über die Daten und dein Ziel kann man selten sinnvolle Vorschläge machen. Wie z.B. hätten wir darauf kommen können, dass du "Tran"x gar nicht abfragen musst?
                    guten Morgen, da hast du Recht. Also der Hintergrund ist, es können je Datensatz verschiedene Transponder ID eingetragen werden. Entweder vom System (bei Mietlösung) oder vom User selbst, wenn er einen persönlichen verwendet. Diese ID ist nicht in unserer DB. Dies ID sendet der jeweilige Transponder an Decoder X z.B. . Nun war der Ansatz, abzufragen welche Transponder verwendet werden. 4 verschiedene deshalb weil, bis zu 4 Teilnehmer ein Team bilden, bei einzelnen Events. Soweit die User bei uns bereits gelistet sind, ist es kein Problem, da dann jeder User über seine pers. ID auch den Transponder gelistet hat. Manchmal aber verleihen sie untereinander ihre Transponder. Im Verein, unter Freunden usw. Also unendlich viele Varianten. Ich hatte es vorher etwas anders gelöst und normal mit mysqli abgefragt. Aber man versucht sich ja zu verbessern. Die derzeitige Abfrage läuft aber ganz gut.

                    Kommentar


                    • #11
                      Zitat von Cyclestores Beitrag anzeigen
                      .. 4 verschiedene deshalb weil, bis zu 4 Teilnehmer ein Team bilden ..
                      Was ist das für eine Logik?

                      "Hallo ich habe hier 30 Spalten für Artikel einer Warengruppe, weil es bis zu 30 verschiedene Artikel in einer Warengruppe sein können, aber nun habe ich ein Problem .."

                      Tabellen zeichen sich dadurch aus, dass sie besonders einfach um Datensätze, weniger einfach um Spalten erweitert werden können.
                      Deshalb legt man ganz gerne alles was mehr als 1 werden kann nicht in Spalten ab, sondern in Zeilen.

                      Das mal als ganz einfache Gedankenstütze beim Anlegen von Tabellen, wenn man mit Worten wie Normalisierung nichts zu tun haben will.

                      Nimm's nicht persönlich, jeder wie er mag, aber ich würde wetten, dass Du viel weniger Probleme hättest, wenn Du diese Themen mehr berücksichtigen würdest.




                      Kommentar


                      • #12
                        Zitat von Cyclestores Beitrag anzeigen
                        Die Optic war nicht das Problem, aber am Rande die Einrückungen sind nicht übernommen worden.
                        Optik? Das Problem tritt nur auf wenn Du Tabs statt Leerzeichen als Einrückung verwendest. Da man das ohnehin nicht machen sollte weist Du ja wo Du korrigieren must damit es beim nächsten mal besser wird!

                        Kommentar

                        Lädt...
                        X