Ankündigung

Einklappen
Keine Ankündigung bisher.

Spalte einer DB nach mehreren Werten durchsuchen

Einklappen

Neue Werbung 2019

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

  • Spalte einer DB nach mehreren Werten durchsuchen

    Tagchen allerseits! Ich komme im Moment leider überhaupt nicht weiter und würde mich deshalb freuen, wenn mir der eine oder andere vielleicht weiterhelfen könnte.

    Zu meinem Problem: Über ein Formular sollen Daten eingegeben werden, die dann anschließend mit einer Tabelle aus der Datenbank abgeglichen werden sollen. Es soll festgestellt werden, welche der übermittelten Daten bereits in der Datenbank angelegt sind.

    meine Tabelle sieht quasi wie folgt aus:
    | id | wert |
    ========
    | 1 | AAA |
    | 2 | BBB |
    | 3 | CCC |
    | 4 | DDD |

    über das Post formular (textarea) werden die Daten eingegeben, z.B. 'AAA', 'DDD' und 'XXX'. Jetzt will ich herausfinden, welche der Eingaben bereits in der Spalte "wert" vorhanden sind. In dem Beispiel sollte mir also angezeigt werden, dass 'AAA' und 'DDD' vorhanden sind, 'XXX' aber nicht. Hierfür habe ich folgendes sql Statement:
    PHP-Code:
    $sql "SELECT id, wert FROM tabelle WHERE wert IN ('".$_POST['formular']."')"
    Leider ist dann die Ausgabe immer leer, obwohl die Daten, die ich eingebe in der DB vorhanden sind. Was mache ich falsch? Wär super, wenn einer helfen könnte.


  • #2
    Zitat von hans_dieter Beitrag anzeigen
    Was mache ich falsch?
    Du hast die Syntax des IN-Operators nicht verstanden.

    Und du hast die Problematik SQL Injection vernachlässigt.)

    Kommentar


    • #3
      Das kommt drauf an WAS exakt in $_POST['formular'] drinnen steht! Lass dir doch mal $sql ausgeben, dann siehst du vielleicht ob da ein Fehler vorliegt.

      Außerdem solltest du die Daten escapen, denn sonst ist SQL Injection bei dir möglich! Und wenn du sie escapest dann musst du per PHP die einzelnen Werte die eingegeben worden sind aus dem Text extrahieren und einzeln in die Abfrage einbauen.

      Kommentar


      • #4
        Zitat von Flor1an Beitrag anzeigen
        Das kommt drauf an WAS exakt in $_POST['formular'] drinnen steht!
        Also da drin steht quasi 'AAA', 'DDD', 'XXX'

        Zitat von Flor1an Beitrag anzeigen
        Außerdem solltest du die Daten escapen, denn sonst ist SQL Injection bei dir möglich!
        Danke für den Hinweis bzgl. mysql_real_escape, das hatte ich schon berücksichtigt, aber der Einfachheit halber hier nicht erwähnt.

        Kommentar


        • #5
          Zitat von hans_dieter Beitrag anzeigen
          Also da drin steht quasi 'AAA', 'DDD', 'XXX'
          Und wie sieht deine Query damit aus ...?

          Danke für den Hinweis bzgl. mysql_real_escape, das hatte ich schon berücksichtigt, aber der Einfachheit halber hier nicht erwähnt.
          Das macht die Diskussion des Problem keineswegs einfacher.
          Wenn du das hier falsch anwendest, vergrößerst du dein Problem damit nämlich noch.

          Also, zeig uns bitte den Code, den du tatsächlich verwendest;
          und sage uns, was dir bei obiger Debug-Ausgabe auffällt.

          Kommentar


          • #6
            Zitat von ChrisB Beitrag anzeigen
            Du hast die Syntax des IN-Operators nicht verstanden.
            Könntest du mir bitte sagen, wie die Syntax lauten muss?

            Komischerweise funktioniert es, wenn ich die Werte direkt eingebe.
            PHP-Code:
            $sql "SELECT id, wert FROM tabelle WHERE wert IN ('AAA', 'DDD', 'XXX')"
            Aber sobald ich die Daten per Post eingebe, klappt es nicht mehr
            PHP-Code:
            $sql "SELECT id, wert FROM tabelle WHERE wert IN ('".$_POST['formular']."')"

            Kommentar


            • #7
              Bitte befolge die Hinweise, die du bekommen hast.

              Kommentar


              • #8
                Zitat von ChrisB Beitrag anzeigen
                Bitte befolge die Hinweise, die du bekommen hast.
                Hey Chris, sorry, ich hatte deinen Post gerade erst gesehen.
                Hier, was ich bisher geschrieben hab:
                PHP-Code:
                    $formular explode("\n"$_POST['invitation']);
                    for(
                $i 0$i count($formular); $i++)
                        {
                        
                $formular[$i] = mysql_real_escape_string($formular[$i]);
                        }
                    
                $query implode("', '"$formular);
                    echo 
                $query;


                $sql "SELECT
                            id, wert
                        FROM
                            tabelle
                        WHERE
                            wert
                        IN 
                            ('
                $query')";
                        
                $result mysql_query($sql);
                        
                $match = array();
                        while(
                $row mysql_fetch_array($result))
                            {
                            
                array_push($match$row['wert']);
                            } 
                Da die Daten per Zeilenumbruch eingetragen werden sollen, hab ich am Anfang erstmal per explode die einzelnen Werte in ein array gepackt. Anschließend hab ich mit einer for schleife mysql_real_escape_string angewendet. Danach wird wieder alles zusammengepackt in $query und anschließend landet $query dann im sql statement. Jeder Datensatz, der bereits in der DB enthalten ist wird dann per array_push in das array $match gepackt. Aber irgendwie klappt das nicht richtig.

                Kommentar


                • #9
                  Zitat von hans_dieter Beitrag anzeigen
                  Aber irgendwie klappt das nicht richtig.
                  Dann lass dir jetzt bitte endlich die Query zur Kontrolle ausgeben, und schau sie dir an!

                  Kommentar


                  • #10
                    Wenn ich mir das array ausgeben lasse, dann ist da immer höchstens ein Wert drin. Es schein so, als würde nur die letzte Eingabe des Formulars berücksichtigt wrden.
                    Wenn der letzte Wert der formulareingabe tatsächlich in der DB existiert, dann besteht das array nur aus diesem Wert. Wenn der letzte Wert der formulareingabe nicht in der DB existiert, dann ist das array leer.

                    Kommentar


                    • #11
                      Lässt du jetzt bitte endlich verflixt noch mal $sql mal per echo ausgeben?

                      Kommentar


                      • #12
                        echo liefert:
                        PHP-Code:
                        SELECT user_idemail FROM user WHERE email IN ('AAA\r''DDD\r''XXX'
                        ok, danke für den tip. Ich hatte erst nicht gewusst, was du genau meinst.
                        Jedenfalls scheint es wohl so, dass dieses "\r" das Problem ist, oder?

                        Kommentar


                        • #13
                          tja .. im Textarea werden die User wohl die Enter-Taste benutzen, um die Eingabe auf unterschiedliche Zeilen zu bringen (schön untereinander) - die musst du nach deinem aufteilen ins Array zusätzlich entfernen ...

                          das geht zum Beispiel mit $text = rtrim($text, "\r");
                          "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                          Kommentar


                          • #14
                            Zitat von hans_dieter Beitrag anzeigen
                            Jedenfalls scheint es wohl so, dass dieses "\r" das Problem ist, oder?
                            Sieht wohl so aus, hm?
                            http://de.wikipedia.org/wiki/Zeilenu...Zeilenumbruchs

                            Kommentar


                            • #15
                              Hey ChrisB und eagle275, danke für die Tipps. Ich hab's jetzt so gemacht, dass die Daten nicht per Zeilenumbruch eingegeben werden, sondern durch Kommata getrennt. Das erleichtert mir die ganze Sache. Danke!

                              Kommentar

                              Lädt...
                              X