martin334a: Adressliste mit Namensreiter aus Datenbank erstellen

Hallo,
ich habe nun schon so viele Stunden gegoogelt... Gelesen und rumprobiert...
... es ist offensichtlich... ich komme nicht weiter.

Ich müsste aus meiner Datenbank eine Liste rausziehen mit Vor und Nachnamen die
in sowas wie Reiter reinkommen müssten.

in meiner
Datenbank
vertrigoTest(steht unter)
VORNAMEN  (und unter )
NACHNAMEN in der Tabelle -
NAMENSLISTE

Anton Kaufmann
    Alfons  Meier
    Aaron Tester
    Alois Tester
    Berta Tester
    Beate Meier
    Birgitt Meier
    Dorin Kaufmann
    Dagmar Kaufmann

ich möchte folgende Ausgabe zusammenbringen:

A:
    Anton Kaufmann
    Alfons Meier
    Aaron Tester
    Alois Tester

B:
    Berta Tester
    Beate Meier
    Birgitt Meier

D:
    Dorin Kaufmann
    Dagmar Kaufmann

(c fehlt ja in der Namensliste)
Mit Gruppenwechsel habe ich schon einiges gegoogelt und versucht... schaff es nicht, hab auch keine wirklich passende Beschreibung von Gruppenwechsel für obige Aufgabe gefunden.
Naja,
Wenn obiges mal läuft, müsste ich noch pro Namen einen Link auf den File  link.html  der in der jeweiligen Tabellen-Spalte beim Namen hinterlegt ist setzen (Spalte heißt einfach LINK).

also

  
mysql_select_db($database_vertrigoTest, $vertrigoTest);  
$query = "SELECT NACHNAMEN , VORNAMEN  , link FROM tabelle ORDER BY NACHNAMEN ";  
$recordset = mysql_query($query, $vertrigoTest) or die(mysql_error());  

Dann wäre noch der Ansatz hier:

  
$firstletter ="";  
  
$output = '<div>';  
  
while($row = mysql_fetch_assoc($recordset)) {  
    if ($firstletter != ucfirst($row['NACHNAMEN ']) )  
	{  
        if ($firstletter !="")  
          $output .= "</div>\n";  
        }  
        $output .= '<div>' . ucfirst($row['NACHNAMEN ']);  
        $firstletter = ucfirst($row['NACHNAMEN ']);  
        }  
//obiges wäre für die Überschrift mit 1 Buchstaben, aber die Ausgabe hier wäre ja 1 Wort...  
        $output .= '<div>  
                    <a href="' . $row['Link'] . '>' . $row['NACHNAMEN '] . ' ' . $row['VORNAMEN  '] . '"</a><br>  
                </div>';  
// das mit dem Link klappt nicht... es wird kein Name in den href geschreiben...?  
}  
$output .= "\n</div>";  
?>  
//dies wäre die Ausgabe der Namen mit dem Link zur Datei...  

  1. Tach!

    Mit Gruppenwechsel habe ich schon einiges gegoogelt und versucht... schaff es nicht, hab auch keine wirklich passende Beschreibung von Gruppenwechsel für obige Aufgabe gefunden.

    Eine Gruppe wechselt immer bei Änderung des Kriteriums. Bei dir ist das Kriterium der groß geschriebene erste Buchstabe vom Nachnamen.

    // das mit dem Link klappt nicht... es wird kein Name in den href geschreiben...?

    "Klappt nicht" hilft beim Fehlersuchen nicht weiter. Setz doch mal als erstes das error_reporting auf E_ALL (und display_errors auf on). Dann nimm var_dump(), um dir die Inhalte der verwendeten Variablen anzuzeigen. Du musst so zurückverfolgen, was das Programm wirklich macht und das mit deiner Intention vergleichen. Die Abweichung ist dann der Fehler. Wenn du die gefunden hast, und dann nicht weißt, wie sie zustande kommt, dann frag bitte nochmal konkret nach.

    In dem Fall mit dem nicht klappenden Link hilft auch ein Blick in das erzeugte Ergebnis, sprich: die Quelltextansicht des Browsers.

    dedlfix.

    1. "Klappt nicht" hilft beim Fehlersuchen nicht weiter. Setz doch mal als erstes das error_reporting auf E_ALL (und display_errors auf on). Dann nimm var_dump(), um dir die Inhalte der verwendeten Variablen anzuzeigen. Du musst so zurückverfolgen, was das Programm wirklich macht und das mit deiner Intention vergleichen. Die Abweichung ist dann der Fehler. Wenn du die gefunden hast, und dann nicht weißt, wie sie zustande kommt, dann frag bitte nochmal konkret nach.

      error_reporting auf E_ALL (und display_errors auf on)
           ...hab ich erledigt

      DAs mit dem  var_dump()   hab' ich noch nie gesetzt.
      Wo soll ich das hinschreiben??

      lg
      und DANKE!

      1. Tach!

        error_reporting auf E_ALL (und display_errors auf on)
             ...hab ich erledigt

        Das ist nur für das Testen. Auf dem Produktivsystem solltest du zumindest display_errors auf off gestellt haben.

        DAs mit dem  var_dump()   hab' ich noch nie gesetzt.
        Wo soll ich das hinschreiben??

        Erstmal Handbuch lesen, was diese Funktion macht! Sie gibt u.a. die Inhalte von Variablen aus. Also schreibst du das überall dort hin, wo du dir zur Kontrolle den Inhalt von Variablen anzeigen lassen willst. echo geht auch, ist aber ungenau bei Dingen wie booleschen Werten und versagt bei Arrays und Objekten. Diese Kontrollausgaben muss man machen, um sich die Wirklichkeit anzeigen zu lassen, damit man diese mit dem eigenen Wunsch vergleichen kann.

        dedlfix.

        1. Hi,
          Aufgabe gelöst:

            
          $query = "SELECT Unterkunftsname, Unterkunftstyp,Ordner, Detailinfo FROM ferienwohnungen ORDER BY Unterkunftsname";  
          $recordset = mysql_query($query, $Vertrigo) or die(mysql_error());  
          $firstletter ="";  
          	$output = '<div id="Accordion1" class="Accordion" tabindex="0">';  
          		   while($row = mysql_fetch_assoc($recordset))  
          	{  
          		if ($firstletter != $row['Unterkunftsname'][0] )  
          		{  
          			if ($firstletter !="")  
          			{  
          	$output .= "</div>\n";$output .= "</div>\n";  
          			}  
          			$output .= '<div class="AccordionPanel">';  
          				$output .= '<div class="AccordionPanelTab">';  
          					$output .= ucfirst($row ['Unterkunftsname'][0]). "\n";  
          						$output .= '<div class="hier_klicken">  
          						<img src="hier-klicken-hand.png" alt="hier klicken" align="right" width="29" height="21">  
          						</div>' . "\n";  
          				if ($firstletter != $row['Unterkunftsname'][0])  
          				{  
          					$firstletter = $row['Unterkunftsname'][0];  
          					$output .= "</div>";  
          				}  
          				$output .= '<div class="AccordionPanelContent">';  
          				}  
          				{  
          					  
          					  $output .= '<a href="' ;  
          						$output .= ($row ['Ordner']). "/". ($row ['Detailinfo']). "\n";  
          						$output .= '">';  
          					  $output .= ucfirst($row ['Unterkunftsname']). "\n";  
          					  $output .= ucfirst($row ['Unterkunftstyp']). "</a>" ."</br>";  
          				}  
          						}  
          			$output .= "</div>";	  
          			$output .= "</div>";  
          			$output .= "</div>";  
          ?>  
            
          
          
          1. Noch eine Frage zur Sortierung:

            $query = "SELECT Unterkunftsname, Unterkunftstyp,Ordner, Detailinfo FROM ferienwohnungen ORDER BY Unterkunftsname";  
            
            

            Obige Sortierung ist nach A-Z .
            Nun möchte ich aber unter A alle Einträge die in der Spalte PARTNER eine 1 haben zuoberst gereiht nach A-Z wieder sortiert...
            Geht das?

            Erklärung:

            Unterkunftstyp   -    Unterkunftsname     Partner

            Apartment               Post              0
            Apartment               Almosen           1
            Apartment               Bitumen           0
            Apartment               Zeppelin          1

            Die Ausgabe müsste nun so Aussehen:

            A
            Almosen  Apartment   (=Partner mit 1)
            Zeppelin Apartment   (=Partner mit 1)
            Bitumen  Apartment   (=Partner mit 0)
            Post     Apartment   (=Partner mit 0)

            Kann man so eine Mischung machen????

  2. Wenn obiges mal läuft, müsste ich noch pro Namen einen Link auf den File  link.html  der in der jeweiligen Tabellen-Spalte beim Namen hinterlegt ist setzen (Spalte heißt einfach LINK).

    $query = "SELECT NACHNAMEN , VORNAMEN  , link FROM tabelle ORDER BY NACHNAMEN ";

    <a href="' . $row['Link'] . '>' . $row['NACHNAMEN '] . ' ' . $row['VORNAMEN  '] . '"</a><br>

    Wie jetzt, "link", "Link" oder "LINK"?

    Feldnamen in MySQL sind übrigens nicht case-sensitive - der Schlüssel im Array der von PHP verarbeitet werden soll aber schon.

  3. Ich habe einiges nun doch noch geschafft...
    der erste Buchstabe wird nun korrekt geschrieben.
    ... in der Datenbank sind manchmal die Namen klein geschrieben, manchmal groß
    das Problem  und nur 1 Buchstaben ausgeben ist hier drinn:

      
    mysql_select_db($database_vertrigoTest, $vertrigoTest);  
    $query = "SELECT nachname, vorname, link FROM tabelle ORDER BY nachname";  
    $recordset = mysql_query($query, $vertrigoTest) or die(mysql_error());  
    $firstletter ="";  
    $output = '<div class="AccordionPanel">';  
    	while($row = mysql_fetch_assoc($recordset))  
    	{  
    		if ($firstletter != ucfirst($row['nachname'][0]) )  
    		{  
    			if ($firstletter !="")  
    			  $output .= "</div>\n";  
    			}  
    			$output .= '<div class="AccordionPanelTab">' . ucfirst($row['nachname'][0]);  
    			$firstletter = ucfirst($row['nachname'][0]);  
    			  
    			$output .= '<div id="hier_klicken"> <img src="hier-klicken-hand.png" alt="hier klicken" align="right" width="29" height="21">  
    					</div>';  
    		 }  
    		  $output .= '<div class="AccordionPanelContent">' .($row['nachname']) .($row['vorname']);  
    						  
    					  
    		$output .= "\n</div>";  
    ?>  
      
    
    
    1. mysql_select_db($database_vertrigoTest, $vertrigoTest);
      $query = "SELECT nachname, vorname, link FROM tabelle ORDER BY nachname";
      $recordset = mysql_query($query, $vertrigoTest) or die(mysql_error());
      $firstletter ="";
      $output = '<div class="AccordionPanel">';
      while($row = mysql_fetch_assoc($recordset))
      {
      if ($firstletter != ucfirst($row['nachname'][0]) )
      {
      if ($firstletter !="")
        $output .= "</div>\n";
      }
      $output .= '<div class="AccordionPanelTab">' . ucfirst($row['nachname'][0]);
      $firstletter = ucfirst($row['nachname'][0]);

        	$output .= '<div id="hier_klicken"> <img src="hier-klicken-hand.png" alt="hier klicken" align="right" width="29" height="21">  
        			</div>';  
         }  
          $output .= '<div class="AccordionPanelContent">' .($row['nachname']) .($row['vorname']);  
        				  
        			  
        $output .= "\n</div>";  
      

      ?>

        
        
      Ich habe etwas rumgebastelt...  
      soweit sieht es gut aus, ABER...  
        
      Leider werden die Eizelnen Einträge eines Buchstabens nicht  
      Zeile für Zeile in ein Div geschrieben, sonder  
      in dieser Art:  
        
      A  
      Aal Martin  
        
      A  
      Abend Hintz  
        
      A  
      Arm Klaus  
        
      B  
      Brand Rudi  
      ...  
      Wo ist mein Fehler???  
        
      Hier die aktuelleste Version...:  
      ~~~php
        
      $query = "SELECT nachname, vorname, link FROM tabelle ORDER BY nachname";  
      $recordset = mysql_query($query, $vertrigoTest) or die(mysql_error());  
      $firstletter ="";  
      $output = '<div class="AccordionPanel">';  
      	while($row = mysql_fetch_assoc($recordset))  
      		{  
      		if ($firstletter != ucfirst($row['nachname'][0]) )  
      			{  
      			$output .= '<div class="AccordionPanelTab">' . ucfirst($row['nachname'][0]);  
      			$output .= '<div id="hier_klicken">  
      			            <img src="hier-klicken-hand.png" alt="hier klicken" align="right" width="29" height="21">';  
      			$output .= "\n</div>";  
      			$output .= "\n</div>";  
      		 }  
      		   $output .= '<div class="AccordionPanelContent">' .ucfirst ($row['nachname']);			  
      			$output .= ucfirst($row ['vorname']);			  
      			$output .= "\n</div>";  
      		}  
      ?>  
        
      
      
      1. Tach!

        Wo ist mein Fehler???

        Fehlersuche beim Programmieren geht immer über debuggen, wenn man den Fehler nicht im Code sieht. Anscheinend ist deine Bedingung nicht erfüllt. Also lass dir die beteiligten Werte ausgeben.

        var_dump($firstletter, ucfirst($row['nachname'][0]));

        dedlfix.

        1. > > Wo ist mein Fehler???

          Fehlersuche beim Programmieren geht immer über debuggen, wenn man den Fehler nicht im Code sieht. Anscheinend ist deine Bedingung nicht erfüllt. Also lass dir die beteiligten Werte ausgeben.

          var_dump($firstletter, ucfirst($row['nachname'][0]));

          Hallo!

          bei>     var_dump($firstletter .=ucfirst($row['nachname'][0]));
          kommt:

          string 'AhornA' (length=6)

          string 'AhornAAnhaltA' (length=13)

          string 'AhornAAnhaltAAnsatzA' (length=20)

          string 'AhornAAnhaltAAnsatzACehornC' (length=27)

          string 'AhornAAnhaltAAnsatzACehornCCemanC' (length=33)

          ...raus

          1. ...und so wie ich sie drinn stehen hab...  (also mit !=ucfirst...)

            var_dump($firstletter !=ucfirst($row['nachname'][0]));

            boolean true

            boolean true

            boolean true

            boolean true

            boolean true

            1. Tach!

              ...und so wie ich sie drinn stehen hab...  (also mit !=ucfirst...)
              var_dump($firstletter !=ucfirst($row['nachname'][0]));
              boolean true
              boolean true
              boolean true
              boolean true
              boolean true

              Das ist das Ergebnis des Vergleichs. Das hat man ja schon so erwartet, weil das if entsprechend verzweigt. Die Frage ist, warum das jedes Mal falsch ist, und dazu gibt man sich die Variablen einzeln (oder mit Komma getrennt) mit var_dump() aus, um festzustellen, dass in $firstletter nicht der gewünschte erste Buchstabe steht. Dann verfolgt man, wie der Inhalt von $firstletter zustande kommt und findet so irgendwann den Fehler.

              dedlfix.

          2. Tach!

            bei>     var_dump($firstletter .=ucfirst($row['nachname'][0]));
            kommt:
            [was ungewünschtes]
            ...raus

            Warum gibst du denn das mit .= aus? Hast du das irgendwo so in deinem Code stehen? Wenn ja, dann ist dein Code an der Stelle falsch (und weicht ab, von dem was du bisher gezeigt hast), weil er nicht das bringt, was du erhoffst. Es geht nicht darum, Zeug an die Merkvariable anzuhängen, sondern sich nur das bisherige Gruppenkriterium zu speichern, um es mit dem des aktuellen Datensatzes vergleichen zu können. Wenn das ungleich wird, dann kommt nach den nötigen Maßnahmen zur optischen Darstellung des Gruppenwechsels das neue Kriterium in die Merkvariable.

            dedlfix.

      2. Hi,

        $query = "SELECT nachname, vorname, link FROM tabelle ORDER BY nachname";
        $recordset = mysql_query($query, $vertrigoTest) or die(mysql_error());
        $firstletter ="";
        $output = '<div class="AccordionPanel">';
        while($row = mysql_fetch_assoc($recordset))
        {
        if ($firstletter != ucfirst($row['nachname'][0]) )
        {
        $output .= '<div class="AccordionPanelTab">' . ucfirst($row['nachname'][0]);
        $output .= '<div id="hier_klicken">
                    <img src="hier-klicken-hand.png" alt="hier klicken" align="right" width="29" height="21">';
        $output .= "\n</div>";
        $output .= "\n</div>";
        }
           $output .= '<div class="AccordionPanelContent">' .ucfirst ($row['nachname']);
        $output .= ucfirst($row ['vorname']);
        $output .= "\n</div>";
        }
        ?>

          
        $firstletter ist immer der Leerstring. Es wird ja nur einmal (vor der Schleife gesetzt).  
        Jeder erste Nachname-Buchstabe unterscheidet sich also von $firstletter.  
          
        (Wenn der Nachname doch leer ist, was ergibt dann das [0]?)  
          
        Ach ja, Du erzeugst ungültiges HTML - alle Deine divs um das hier-klicken-hand.png erhalten dieselbe ID.  
          
        Und Dein Einrückungsstil ist ziemlich unübersichtlich.  
          
        cu,  
        Andreas
        
        -- 
        [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
        [O o ostern ...](http://ostereier.andreas-waechter.de/)  
          
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
        
        
        1. $firstletter ist immer der Leerstring. Es wird ja nur einmal (vor der Schleife gesetzt).
          Jeder erste Nachname-Buchstabe unterscheidet sich also von $firstletter .

          (Wenn der Nachname doch leer ist, was ergibt dann das [0]?)

          Das Feld Nachname ist nie leer - ohne [0] wird der ganze Name reingeschrieben.
          Will ja nur den ersten Buchstaben im Accordeon Pannel stehen haben.

          Für mich sieht das ja alles schon ok aus, aber leider werden eben nicht die einzelnen
          Namen mit A in dem Div drunter zusammengefasst, sondern alles einzelnn ausgegeben.
          Da liegt ja mein Problem.
          ...bin eher beim Aufgeben... schon 2 Tage nun an der Lösung drann und es will einfach nicht klappen..
          :-(

          Ach ja, Du erzeugst ungültiges HTML - alle Deine divs um das hier-klicken-hand.png erhalten dieselbe ID.

          ..DANKE... hab ne .classe draus gemacht! Super Hinweis!

          Und Dein Einrückungsstil ist ziemlich unübersichtlich.

          ist ja nur ein bisserl code... als nicht .phpler  ist das noch ganz ok für mich...