Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Doppelte Datensätze anzeigen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Doppelte Datensätze anzeigen

    Hallo allerseits,

    ich habe ein Problem mit meinem Deutsch Griechisch Lexikon. Und zwar möchte ich alle Datensätze aus der Datenbank auslesen und dann mit html_entity_decode und strcmp kontrollieren, ob es Datensätze gibt, die doppelt vorkommen. Problem ist nämlich, dass einige Daten mit einem anderen charset gespeichert wurden.

    Folgenden Ansatz habe ich bereits. Allerdings ist es mir schleierhaft wie man jeden einzelnen Eintrag mit den anderen verlgeichen muss.

    PHP-Code:
    $ask"SELECT griechisch FROM word WHERE griechisch LIKE '%&#x%'";
    $remysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
    while (
    $datensatzmysql_fetch_array($re)) {
    $test html_entity_decode($datensatz["griechisch"]);
    $ask2"SELECT griechisch FROM word WHERE griechisch LIKE '%&#9%'";
    $re2mysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
    while (
    $datensatz2mysql_fetch_array($re2)) {
    $vergleich strcmp($datensatz["griechisch"], $datensatz2["griechisch"]); 
    PS: Das Griechisch LIKE soll bezwecken, dass er nach der bestimmten Kodierung sucht. Also alle Einträge mit der einen Kodierung beinhalten %#x und die anderen &#9. Nun sollen alle ausgewählt und miteinander verglichen werden. Gibt es Übereinstimmungen sollen diese angezeigt werden.


    Kann mir jemand behilflich sein?

    Dank im Vorraus,

    Goreo


  • #2
    Du kannst zwei Arrays auch einfach mit if($arr1 == $arr2) vergleichen, strcmp() ist ja für einen Stringvergleich wie der Name schon sagt.... (string compare)

    Kommentar


    • #3
      Fehler

      Mit folgendem Code
      PHP-Code:
      $ask"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#x%'";
      $remysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
      while (
      $datensatzmysql_fetch_array($re)) {
      $test html_entity_decode($datensatz["griechisch"]);
      $ask2"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#9%'";
      $re2mysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
      while (
      $datensatz2mysql_fetch_array($re2)) {
      $test2 html_entity_decode($datensatz2["griechisch"]);

      if(
      $test == $test2)) { echo " | ".$test2.""; }}} 
      bekomm ich ein Maximum execution time of 30 seconds exceeded


      Was mache ich falsch?

      Kommentar


      • #4
        Also so wie du den Code gepostet hast müsstest du eigentlich einen Parse Error bekommen, siehe doppelte Klammer am ende vom if

        Kommentar


        • #5
          Ups, das hatte ich falsch hierhineinkopiert, sorry.
          Also, das steht in der Datei ohne zweite Klammer da. Und dann bekomm ich halt die Maximum execution time of 30 seconds exceeded.

          Beziehungsweise er fängt an, mir die ersten ca. 500 Datensätze anzuzeigen und dann bricht er ab wegen Maximum execution time of 30 seconds exceeded. Aber die Datensätze, die er ausgibt, sind auch nicht richtig, also er gibt nicht die doppelten Datensätze aus, sondern einfach die ersten 500.

          Kommentar


          • #6
            Habe mir mal die Mühe gemacht, den Code lesbar zu formatieren, damit Leute, die nach mir kommen, schneller sehen, was los ist.
            PHP-Code:
            $ask"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#x%'";
            $remysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());

            while (
            $datensatzmysql_fetch_array($re)) {
                
            $test html_entity_decode($datensatz["griechisch"]);
                
            $ask2"SELECT griechisch, deutsch FROM word WHERE griechisch LIKE '%&#9%'";
                
            $re2mysql_query($ask) or die('Abfrage fehlgeschlagen'mysql_error());
                while (
            $datensatz2mysql_fetch_array($re2)) {
                    
            $test2 html_entity_decode($datensatz2["griechisch"]);
                    
                    if (
            $test == $test2) {
                        echo 
            " | ".$test2."";
                    }
                }

            Also dass du eine Execution Time Error bekommst, liegt daran, dass du viele Einträge hast und jeden einzeln aufwändig bearbeitest. Du hast ja sogar noch einen SQL-Query innerhalb der Schleife.
            Das alles hat zu Folge, dass das Skript sehr lange braucht und dann nach 30 Sekunden abbricht.

            Vielleicht hilft dir ein JOIN, das ganze schneller zu gestalten. Etwa wie der:
            Code:
            SELECT a.griechisch AS griechisch_1, a.deutsch AS deutsch_1, b.griechisch AS griechisch_2, b.deutsch AS deutsch_2
            FROM word a
            FULL OUTER JOIN word b
            WHERE a.griechisch LIKE '%&#x%' OR b.griechisch LIKE '%&#9%';
            Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

            Kommentar


            • #7
              Danke Manko10,

              aber ich kriege die Fehlermeldung Abfrage fehlgeschlagenYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN word b WHERE a.griechisch LIKE '%�%' OR b.griechisch LIKE '%�'

              Kommentar


              • #8
                Tatsächlich, habe ich doch einen wesentlichen Bestandteil vergessen...

                1.) ON-Klausel fehlte (Asche über mein Haupt - das kommt davon, wenn man das aus dem Kopf schreibt)
                2.) MySQL unterstützt doch gar kein OUTER JOIN. Ein INNER JOIN sollte es aber letztendlich auch tun.

                Code:
                SELECT a.griechisch AS griechisch_1, a.deutsch AS deutsch_1, b.griechisch AS griechisch_2, b.deutsch AS deutsch_2
                FROM word a
                INNER JOIN word b
                ON a.griechisch = b.griechisch
                WHERE a.griechisch LIKE '%&#x%' OR b.griechisch LIKE '%&#9%';
                An sich würde auch es auch ein impliziter JOIN tun:
                Code:
                SELECT a.griechisch AS griechisch_1, a.deutsch AS deutsch_1, b.griechisch AS griechisch_2, b.deutsch AS deutsch_2
                FROM word a, word b
                WHERE a.griechisch LIKE '%&#x%' OR b.griechisch LIKE '%&#9%' AND a.griechisch = b.griechisch;
                Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                Kommentar


                • #9
                  Der lädt die Seite jetzt schon seit ca. 15 Minuten...

                  Kann das solange dauern bei 16000 Datensätzen?

                  Kommentar


                  • #10
                    Kann, ja. Sollte natürlich nicht. Komisch, dass das Skript noch nicht abgebrochen wurde.
                    JOINs sind nicht unbedingt schnell, aber oft die einzige Möglichkeit. Wenn du dazu noch Schleifen in PHP verwendest, kann so eine Skriptlaufzeit durchaus zustande kommen.
                    Ich kenne ja auch nicht dein ganzes Skript und ebenso wenig den Aufbau deiner Datenbank.
                    Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                    Kommentar


                    • #11
                      Also ich hatte sowas ähnliches und hab mir dann einfach den Tabelleninhalt in ein Array geladen. Das geht schneller, braucht aber bei vielen Datensätzen auch viel Ram und PHP hat mir dann irgendwann gesagt das ich meine allowed memory size überschritten habe, hab die dann einfach in der php.ini höher gesetzt xD

                      Kommentar


                      • #12
                        @Manko10: Das ist das ganze Script.

                        Ich glaub, ich werde erstmal das Script einfach eine Stunde lang versuchen mit dem Browser zu öffnen, vielleicht passiert ja irgendwas...

                        Das mit dem Array hab ich nicht ganz verstanden, mein Tabelleninhalt wird doch auch in ein Array geladen? In $datensatz.

                        Kommentar

                        Lädt...
                        X