Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme bei Anordnung der Ergebnisse

Einklappen

Neue Werbung 2019

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

  • Probleme bei Anordnung der Ergebnisse

    Hallo nochmals.

    Hab ein kleines Prob und hoffe dass es eine easy Lösung dafür gibt.

    Und zwar frage ich über PHP meine SQL Datenbank hab, klappt super. Ich möchte die Abfrage ergebnisse nun in einer "unsichtbaren" Tabelle anzeigen, damit ein bissl Ordnung reinkommt. Und zwar soll es nicht so aussehen:

    XXXX XXXX XXXXXXXXX XXXXXXXXXXX
    XXXXXX XXXXX XXXXXX XXXXXXXXXX
    XX XXXXXXXXX XXXXXXXXXXXXXX XXXXXXX
    sondern halt so:

    XXXX XXXX XXXX XXXX
    XXXX XXXX XXXX XXXX
    XXXX XXXX XXXX XXXX
    geht das irgendwie ohne kompliziert zu werden?

  • #2
    Lösung:

    Du verwendest für die Ausgabe eine Tabelle:

    Code:
    $q=mysql_query("SELECT feld FROM tabelle WHERE 1 ORDER BY irgendwas");
    $spalten=4;
    $anzahl=mysql_num_rows($q);
    $durchlaeufe=$anzahl+$spalten-($anzahl%$spalten);
    echo "<table border=\"0\">";
    for($i=0;$i<$durchlaeufe;$i++) {
        if(!(list($feld)=mysql_fetch_row($q)))
            $feld="";
        if(!($i%$spalten))
            echo "<tr>";
        echo "<td>$feld</td>";
        if(($i%$spalten)==($spalten-1))
            echo "</tr>";
    }
    echo "</table>";
    $spalten definiert die Anzahl der Spalten, die angezeigt werden sollen.
    Die Schleife muss in der Häufigkeit $spalten*x durchlaufen, in diesem Fall also 4 mal, 8 mal, 12 mal etc., damit abschließende <tr>-Tags gewährleistet sind.

    Ungetestet!

    Kommentar


    • #3
      puuh. die Art der Programmierung ist mir schon arg schwer. vielleicht seh ich den Fehler auch nicht, und es wäre nett, wenn ihr mich drauf hinweist.

      Bisher sieht mein Code so aus:
      Code:
      <?
        mysql_connect("localhost",
        "root","") or die
        ("Keine Verbindung moeglich");
        mysql_select_db("songtexte") or die
        ("Die Datenbank existiert nicht");
        
        $abfrage = "SELECT * FROM lyrics";
        $ergebnis1 = mysql_query($abfrage);
      
        while($row = mysql_fetch_object($ergebnis1))
          {
          
          echo $row->name;
          echo $row->vor;
          echo ''.$row->titel.'';
          echo $row->album;
          echo "<h2></h2>";
                  
          }
      
      ?>
      ...und re gibt mir alles aus was in meiner datenbank drin ist, unterteilt in 4 spalten. wie bringen ich diesen code nur in zusammenhang mit diesem:

      Code:
      <?
       mysql_connect("localhost",
        "root","") or die
        ("Keine Verbindung moeglich");
        mysql_select_db("songtexte") or die
        ("Die Datenbank existiert nicht");
      
      
      $q=mysql_query("SELECT * FROM lyrics"); 
      $spalten=4; 
      $anzahl=mysql_num_rows($q); 
      $durchlaeufe=$anzahl+$spalten-($anzahl%$spalten); 
      echo "<table border=\"0\">"; 
      for($i=0;$i<$durchlaeufe;$i++) { 
          if(!(list($feld)=mysql_fetch_row($q))) 
              $feld=""; 
          if(!($i%$spalten)) 
              echo "<tr>"; 
          echo "<td>$feld</td>"; 
          if(($i%$spalten)==($spalten-1)) 
              echo "</tr>"; 
      } 
      echo "</table>"; 
       
      ?>
      hab schon rumgespielt, aber was bringt es wenn ich noch nicht versteh.

      Kommentar


      • #4
        Damit es erstmal wie gewünscht funktioniert, ist lediglich folgendes zu sagen:

        Wende niemals ein "SELECT *" an, sondern gib die Felder komma-separiert an, die du erhalten möchtest: "SELECT feld1, feld2, ... FROM tabelle..." Das hat überzeugende Gründe und keine Nachteile. Nehmen wir an, du möchtest aus deiner Tabelle den Vor- und Nachnamen jedes Datensatzes haben. Das bewerkstelligst du so:
        Code:
        SELECT vorname, nachname FROM tabelle
        mysql_fetch_row() liefert dir nach dem Query bei jedem Aufruf einen weiteren Datensatz, genau so wie mysql_fetch_object(), nur in der Form eines Arrays. In unserem Fall steht an erster Stelle im Array der Vorname, an zweiter Stelle der Nachname, ganz wie die Reihenfolge im SELECT. list() überträgt die einzelnen Elemente eines Arrays auf Variablen. In unserem Fall bewirkt
        Code:
        list($vorname, $nachname)=mysql_fetch_row($q);
        , dass in $vorname der Vorname steht, in $nachname der Nachname.

        Mit diesen Variablen kannst du dann in deiner Schleife arbeiten, sie z.B. ausgeben. Das sind die einzigen Unterschiede zu deiner Vorgehensweise, die Daten aus der Datenbank zu holen. Der Rest ist das dynamische Aufbauen einer Tabelle und das Darstellen der Datenbankinhalte.

        Kommentar


        • #5
          hmm, das is mir schon soweit klar. er zeigt mir aber bei folgemdem code:
          Code:
          <?
           mysql_connect("localhost",
            "root","") or die
            ("Keine Verbindung moeglich");
            mysql_select_db("songtexte") or die
            ("Die Datenbank existiert nicht");
          
          
          $q=mysql_query("SELECT vor, name, titel, album FROM lyrics"); 
          $spalten=4; 
          $anzahl=mysql_num_rows($q); 
          $durchlaeufe=$anzahl+$spalten-($anzahl%$spalten); 
          echo "<table border=\"0\">"; 
          for($i=0;$i<$durchlaeufe;$i++) { 
              if(!(list($feld)=mysql_fetch_row($q))) 
                  $feld=""; 
              if(!($i%$spalten)) 
                  echo "<tr>"; 
              echo "<td>$feld</td>"; 
              if(($i%$spalten)==($spalten-1)) 
                  echo "</tr>"; 
          } 
          echo "</table>"; 
           
          ?>
          nur die vornamen verteilt über die verschiedenen spalten an, mehr nicht.

          Meine DB ist so aufgebaut:
          Vorname Name Titel Text Album

          bei der Abfrage sollen alle spalten abgefragt werden und auch so wie sie in der DB sind wieder in der Tabelle angezeigt werden (ausser TEXT), sortiert nach dem NAMEN. bloss in dem Code den du mir gegeben hast, ist eine wichtige Funktion meines Codes verloren gegangen die ich unbedingt brauche:

          und zwar das der Titel als LINK erscheint, der bei Klick den TEXT öffnet.

          Mann, bin ich doof

          Kommentar


          • #6
            Zitat von Edgecombe
            hmm, das is mir schon soweit klar. er zeigt mir aber bei folgemdem code:[...Code...]
            Entscheidend ist diese Stelle:
            Code:
                if(!(list($feld)=mysql_fetch_row($q)))
            Diese liefert dir momentan nur den Vornamen. Ändere wie folgt:
            Code:
                if(!(list($vorname, $name, $titel, $text, $album)=mysql_fetch_row($q)))
            Leuchtet das noch nicht ein? Das sind die Felder, die du im SELECT definiert hast, also liefert sie dir mysql_fetch_row() zurück. Nun verwende diese Variablen in der Schleife.

            Die Verlinkung kannst du wie in deinem eigenen Beispiel setzen. Das Ding musst du halt umbauen:
            Code:
            echo ''.$row->titel.'';  // dein vorheriger Code

            Kommentar


            • #7
              Code:
              <?
               mysql_connect("localhost",
                "root","") or die
                ("Keine Verbindung moeglich");
                mysql_select_db("songtexte") or die
                ("Die Datenbank existiert nicht");
              
              
              $q=mysql_query("SELECT vor, name, titel, album FROM lyrics"); 
              $spalten=4; 
              $anzahl=mysql_num_rows($q); 
              $durchlaeufe=$anzahl+$spalten-($anzahl%$spalten); 
              echo "<table border=\"0\">"; 
              for($i=0;$i<$durchlaeufe;$i++) { 
                  if(!(list($vor, $name, $titel, $album)=mysql_fetch_row($q))) 
                      $feld=""; 
                  if(!($i%$spalten)) 
                      echo "<tr>"; 
                  echo "<td>$vor, $name, $titel, $album</td>"; 
                  if(($i%$spalten)==($spalten-1)) 
                      echo "</tr>"; 
              } 
              echo "</table>"; 
               
              ?>
              soweit gehts, DANKE. Nur wollte ich nicht alle Informationen einer Zeile in einer Spalte unterbringen, sondern Stück für Stück. Die Vornamen in eine Spalte, dann die Nachnahmen in eine usw.

              Ich weiss ich nerve, weiss aber nicht wenn ich sonst fragen kann... DANKE

              Kommentar


              • #8
                Zitat von Saraneus
                Wende niemals ein "SELECT *" an, sondern gib die Felder komma-separiert an, die du erhalten möchtest: "SELECT feld1, feld2, ... FROM tabelle..." Das hat überzeugende Gründe und keine Nachteile.
                Aha ?!? Na dann schiess ma los. Ich hab mich mit dem Problem noch nich sonderlich tiefgreifend auseinandergesetzt, bin ma neugierig... #
                Was ist validität?

                Kommentar


                • #9
                  @fantast

                  Nachteile:

                  1. Veränderungen der Tabellenstruktur ziehen manuelle Veränderungen im Skript nach sich. Schon bei einer kleineren Skriptmenge ist das sehr aufwändig. Außerdem bei häufig fehlenden Dokumentationen sehr unüberschaubar.
                  2. Aus größeren Tabellen will man meistens nicht alles zurückgeliefert bekommen. Damit leidert die Performance je nach Datenbankfülle.

                  Das sollte reichen

                  Kommentar


                  • #10
                    Zitat von Edgecombe
                    soweit gehts, DANKE. Nur wollte ich nicht alle Informationen einer Zeile in einer Spalte unterbringen, sondern Stück für Stück. Die Vornamen in eine Spalte, dann die Nachnahmen in eine usw.

                    Ich weiss ich nerve, weiss aber nicht wenn ich sonst fragen kann... DANKE
                    Falls du inzwischen einmal versucht hast, den Code zu verstehen, sollte dieser Ansatz genügen, selbst Initiative zu ergreifen und die Logik anzuwenden. Wenn du einen Programmierer brauchst, stehe ich gegen Entgelt gerne zur Verfügung

                    Kommentar


                    • #11
                      danke danke danke.

                      hab's SOweit geschafft:
                      Code:
                      <?
                       mysql_connect("localhost",
                        "root","") or die
                        ("Keine Verbindung moeglich");
                        mysql_select_db("songtexte") or die
                        ("Die Datenbank existiert nicht");
                      
                      
                      $q=mysql_query("SELECT vor, name, titel, album FROM lyrics"); 
                      $spalten=1; 
                      $anzahl=mysql_num_rows($q); 
                      $durchlaeufe=$anzahl+$spalten-($anzahl%$spalten); 
                      echo "<table border=\"0\">"; 
                      for($i=0;$i<$durchlaeufe;$i++) { 
                          if(!(list($vor, $name, $titel, $album)=mysql_fetch_row($q))) 
                              $feld=""; 
                          if(!($i%$spalten)) 
                              echo "<tr>"; 
                          echo "<td>$name, $vor</td>"; 
                          echo "<td>$titel</td>";
                          echo "<td>$album</td>";
                          if(($i%$spalten)==($spalten-1)) 
                              echo "</tr>"; 
                      } 
                      echo "</table>"; 
                       
                      ?>
                      die ergebnisse bei der ausgabe sehen jetzt SO aus:

                      XXXXX XXXXX XXXXX
                      XXXXX XXXXX XXXXX
                      XXXXX XXXXX XXXXX

                      ich hätte es aber gern so, dass zwischen den einzelnen spalten etwas mehr platz ist als nur ein feld. Ist das einfach möglich?


                      vielen dank im voraus.

                      Kommentar


                      • #12
                        Zitat von Edgecombe
                        ich hätte es aber gern so, dass zwischen den einzelnen spalten etwas mehr platz ist als nur ein feld. Ist das einfach möglich?
                        Das hat nun nichts mehr mit PHP zu tun. Im HTML-Forum bist du damit besser aufgehoben. Bevor du aber gleich rüberrennst, lege ich dir google und SELFHTML ( http://selfhtml.teamone.de ) ans Herz.

                        Kommentar


                        • #13
                          Hi,

                          normalerweise mit simplem HTML:
                          Code:
                          <table border="0" cellpadding="3" cellspacing="3">
                          cellpadding gibt den "Spielraum" in den einzelnen Zellen an, cellspacing den um die Zellen herum.
                          Mit dieser Methode ändert sich allerdings auch der Abstand zwischen den einzelnen Zeilen. Lösung: CSS (cascading style sheet):
                          In jeder Zelle sollte dann stehen:

                          Code:
                          <td style="padding-right:3px;">
                          Natürlich nun wieder mit <table border="0"> , ohne cellpadding und cellspacing. padding-right erzeugt für jede Zelle einen Spielraum von 3 Pixel (natürlich belibig änderbar, Angabe auch in cm,...)

                          Für CSS und Co gibts sicher ausführlichere Infos im Netz oder Bücher.

                          Hoffe ich konnte helfen.

                          Franz

                          Kommentar


                          • #14
                            da das HTML ist muss das ja vor meinen <? ?> code setzen. Dann hat es aber absolut keine Auswirkungen auf die Ausgabe. Wenn ich komplett in HTML mit vorgebenen Werte das ganze mache, klappts.

                            Aber wie integriere ich meine PHP Code da rein? Kann mir jemand bitte helfen, bin so kurz davor......

                            Kommentar


                            • #15
                              autsch, du solltest dich mal mit PHP grundlegend beschäftigen, z.B. wie der Parser arbeitet.

                              zum Thema:
                              Code:
                              echo "<html-element style=\"padding:3px;\">";
                              So funktioniert das.

                              Kommentar

                              Lädt...
                              X