Ankündigung

Einklappen
Keine Ankündigung bisher.

Doppelte Einträge vereinen

Einklappen

Neue Werbung 2019

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

  • Doppelte Einträge vereinen

    Hallo Leute,

    ich habe eine MySQL-Tabelle mit Inhalten gefüllt:

    Autor | Titel | ISBN
    ------------------------------
    Mustermann | Mustertitel1 | 1234
    Mustermann | Mustertitel2 |2345
    Musterfrau | Mustertitel3 |6532

    Ich möchte die Inhalte folgendermaßen ausgeben:

    Mustermann
    Mustertitel1
    Mustertitel2
    Musterfrau
    Mustertitel3

    Bei mir sieht es aber so aus:
    Mustermann
    Mustertitel1
    Mustermann
    Mustertitel2
    Musterfrau
    Mustertitel3

    PHP-Code:
    <?php
    //Die Parameter für die Datenbankverbindung festlegen
    $servername "localhost";
    $benutzer "benutzer";
    $passwort "passwort";
    $datenbank "db_name";

    //Versuchen die DB-Verbindung herzustellen
    if ($verbindung mysql_connect ($servername$benutzer$passwort)) {
     
    //   echo "die Verbindung mit der Datenbank [b]$servername[/b] wurde"
       // ." aufgebaut.

    ";
    } else {
       // echo "
    Der Verbindungsversuch zur DB ist fehlgeschalgen" .
       // mysqlerror();
        exit();

    }

    //Die Datenbank auswählen
    if (!mysql_query("
    USE $datenbank;")) {
    //echo "
    Die Datenbank [b]$datenbank[/bkonnte nicht ausgewählt werden

    ";
    exit();
    } else { 
    //echo "
    Die Datenbank [b]$datenbank[/bwurde ausgewählt

    ";

    //Die Tabelle tx_maske_main auslesen
    $anfrage = "SELECT AUTORISBNTITEL FROM tx_maske_main";


    if (!(
    $ergebnis = mysql_query($anfrage))) {
    //echo "
    Die Anfrage ist fehlgeschlagen" . mysql_error();
    } else {
    //echo "
    Die Anfrage an die Datenbank war erfolgreich.

    ";
    }

    //Alle Zeilen aus der DB holen und in die Liste einfügen
    while (
    $zeile = mysql_fetch_object($ergebnis)) 

    {
    $ersetzen = $zeile->AUTOR;
    $ersetzen = ereg_replace(" ","-",$ersetzen);
    $buch = array($zeile->TITEL=>$zeile->AUTOR);
    list(
    $key,$wert) = each($buch); 
    echo "
    <ul>[*]<a href=\"http://localhost/$ersetzen.html\">$wert</a>";
    echo 
    "
    "
    ;
    echo 
    "<ul>[*]<font size=\"1\"><a href=\"http://localhost/isbn_$zeile->ISBN.html\">$key</a></font>[/list][/list]";


          
       
    }
    //Die Verbindung zur Datenbank schließen 
        
    mysql_close($verbindung);
    }
    ?>

  • #2
    Deine Datenbank-Struktur ist dafür schon ungünstig.
    Lies dir doch mal das hier durch:
    Wikipedia: Normalisierung

    Du kannst dein Skript zwar ummodeln, ist aber nur ne "Fehlerkorrektur" der schon verhunzten Datenbank-Struktur. Probiers lieber gleich richtig zu machen.

    Kommentar


    • #3
      Zitat von Zergling
      Deine Datenbank-Struktur ist dafür schon ungünstig.
      Lies dir doch mal das hier durch:
      Wikipedia: Normalisierung

      Du kannst dein Skript zwar ummodeln, ist aber nur ne "Fehlerkorrektur" der schon verhunzten Datenbank-Struktur. Probiers lieber gleich richtig zu machen.
      Hallo Zergling,

      ich habe die Struktur sehr stark vereinfacht, in Wirklichkeit sieht sie so aus:

      uid| pid| tstamp| crdate| cruser_id| deleted| hidden| titel| autor| verlag| isbn|

      Ich bin mir nicht sicher, aber ich glaube, dass ich die Struktur nicht ändern kann, weil ich sie für eine selbstgeschriebene Erweiterung für Typo3 brauche.

      Kommentar


      • #4
        OK, dann musst du die Ergebnisse erst sammeln (oder sortieren) und dann
        ausgeben.

        Pseudocode:
        PHP-Code:
        <?php
        SELECT autor
        isbn FROM tabelle ORDER BY autor // 1
        before nobody// 2
        while (ergebnis mysql_fetch_object) {
          if (
        before != ergebnis->autor) { // 3
            
        print ergebnis->autor;
          }
          print 
        ergebnis->isbn;
          
        before ergebnis->autor// 2b
        }
        ?>
        So was passiert? Das Ergebnis wird sortiert [1], d.h. kommt ein Autor
        mehrmals vor, stehen seine Einträge wenigstens untereinander.
        Da kommt die Variable "before" [2] ins Spiel. Sie merkt sich, welcher
        Autor zuletzt ausgegeben wurde [2b]. Ist es der selbe wird nur das Buch
        ausgegeben, war es ein anderer wird noch der Name [3] ausgegeben. Du
        erhältst also das gewünscht Ergebnis.

        Du solltest dich allerdings trotzdem mit Normalisierung beschäftigen, ich
        habe gemerkt wie katastrophal es sein kann wenn man das nicht tut.
        Scheinbar einfache Erweiterungen oder Änderungen häufen dermaßen viel
        Extra Code auf, das war nicht mehr schön. Und damits nicht ewig dauert
        programmiert man Schlendrian-Code. Ein Teufelskreis.

        Kommentar


        • #5
          Danke Zergling,
          deine Erklärung ist klar und sehr übersichlich. Ich bekomme aber eine Fehlermeldung
          Parse error: parse error, unexpected T_STRING in C:\Programme\Apache Group\Apache2\htdocs\project\typo3conf\ext\page_ph p_content\pi1\class.tx_pagephpcontent_pi1.php(55) : eval()'d code on line 13
          PHP-Code:
          <?php
          $servername 
          "localhost";
          $benutzer "benutzer";
          $passwort "passwort";
          $datenbank "db_name";
          if (
          $verbindung mysql_connect ($servername$benutzer$passwort)) {
           } else {
               exit();
          }
          if (!
          mysql_query("USE $datenbank;")) {
          exit();
          } else { 
          SELECT autorisbntitel FROM tx_maske_main ORDER BY autor 
          before 
          nobody;
          while (
          ergebnis mysql_fetch_object) {
            if (
          before != ergebnis->autor) { 
              print 
          ergebnis->autor;
            }
            print 
          ergebnis->isbn;
            
          before ergebnis->autor
          }
           
          //Die Verbindung zur Datenbank schließen 
              
          mysql_close($verbindung);
          }



          ?>

          Kommentar


          • #6
            Ich habe extra Pseudocode geschrieben, damit du ein bißchen nachdenkst und das Beispiel auch verstehst.

            Kommentar


            • #7
              Zitat von Zergling
              Ich habe extra Pseudocode geschrieben, damit du ein bißchen nachdenkst und das Beispiel auch verstehst.
              Ich verstehe natürlich, dass es Sinn macht, ich muss aber gestehen, dass ich nicht weiter komme...

              PHP-Code:
              <?php
              $servername 
              "localhost";
              $benutzer "benutzer";
              $passwort "passwort";
              $datenbank "db_name";
              if (
              $verbindung mysql_connect ($servername$benutzer$passwort)) {
               } else {
                   exit();
              }
              if (!
              mysql_query("USE $datenbank;")) {
              exit();
              } else { 
              $ergebnis "SELECT autor, isbn FROM tx_maske_main ORDER BY autor before = nobody;"
              while (
              $ergebnis mysql_fetch_object) {
                if (
              $before != $ergebnis->autor) { 
                  print 
              $ergebnis->autor;
                }
                print 
              $ergebnis->titel;
                
              $before $ergebnis->autor
              }
               
              //Die Verbindung zur Datenbank schließen 
                  
              mysql_close($verbindung);
              }
              ?>
              das Laden der Seie dauert dabei ewig und schließlich kommt es zu Zeitüberschreitung.

              Kommentar


              • #8
                Heiaiai.

                PHP-Code:
                <?php
                $ergebnis 
                "SELECT autor, isbn FROM tx_maske_main ORDER BY autor ASC"// das before brauchen wir für PHP, nicht als Bedingung (!) für MySQL
                $query mysql_query($ergebnis); // das hast du auch vergessen
                while ($zeile mysql_fetch_object($query)) { // warum wolltest du $ergebnis überschreiben?
                  
                if (!isset($before) || $before != $zeile->autor) { // $before nicht gesetzt (1. Schleifendurchlauf) oder nicht der Autor der vorherigen Zeile
                    
                print $zeile->autor.'
                '
                ;
                  }
                  
                // print $zeile->titel;
                  // woher bekommst du den Titel? Du selektierst ihn in der Abfrage nicht...
                  
                print '  '.$zeile->isbn.'
                '
                // etwas eingerückt
                  
                $before $zeile->autor// sich den autor für den nächsten Schleifendurchlauf merken

                ?>
                Merk dir immer welchen Inhalt-Typ eine Variable hat (eventuell im
                Variablennamen speichern) und schau nach welche der eingesetzten
                Funktionen welche Variablentypen erwarten und zurückgeben.

                Kommentar

                Lädt...
                X