momo
Goto Top

datenbankeinträge in html-tabelle verteilen

Hallo Forum,

ich versuche eine kleine datenbankgestützte Seite für meine Freundin zu programmieren und habe ein kleines Problem.

Info: Ich bin leider kein guter Programmierer und habe nur sehr wenig Erfahrung mit php.

Ich generiere eine Tabelle per for-schleife in php. Die Zellen sind durchnummeriert.

Nun habe ich einige datenbankeinträge, in der jeder Datensatz eine eindeutige Zufallszahl enthält.
Diese Zufallszahl möchte ich gerne mit der Zahl in der Tabellen-Zelle vergleichen und dort ausgeben.

Beispiel:

Meine Tabelle:

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
.
.
101 102 103...................................................400


Nun habe ich in meinem Datensatz die zufallszahl "16" und in einem anderen Datensatz die Zufallszahl "102" stehen.

Nun möchte ich gerne, dass die zufallszahl anstelle der Variablen $i der for-Schleife und zwar an der Stelle von $i (z.B. 16 und 102) stehen soll.

Wie mache ich das ? In meinem Code ist irgendwo ein kleiner Fehler. Ich sitze nun seit Wochen daran diesen Fehler herauszufinden aber leider ohne Erfolg.

Anbei mein Code:

<?php 
$db_host = "localhost";  
$db_user = "xxx";  
$db_pass = "yyy";  
$db_name = "sternenhimmel";  

$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );  
if ($conID)
{
    mysql_select_db( $db_name, $conID );
}


$sql = "SELECT * FROM sternchen where sternchen>=0 or sternchen<401 order by sternchen";  
$ergebnis = mysql_query( $sql, $conID ) or die(mysql_error());

$datensatz = mysql_fetch_array($ergebnis);

$img1 = $datensatz['stern_img1'];  
$img2 = $datensatz['stern_img2'];  
$name = $datensatz['name'];  


?>
<html>
<head>
<title></title>
<style type="text/css">  
   table { width:305px; }
   td { border: 1px solid red; }
  </style>
</head>
<body >
<!--background="bg_stars1.gif"-->  
<table align="center">  
<?php 

$tr="<tr>";  
$etr="</tr>";  
$td="<td>";  
$etd="</td>";  

?>


<?php
echo $tr;
for ($i=0; $i<401; $i++) {

  echo $td;

      echo $i; 
      $sternchen=Array();
      while ($datensatz = mysql_fetch_array($ergebnis)) {
      $sternchen=$datensatz['sternchen'];  
       $sternchen = 1;

      echo '<a href="zeige_sternchen.php?sende_id='.$sternchen.'">  
      <img border="0" title="'.$datensatz['name'].'" name="stern_img1" id="stern_img1" src="../';  
      echo $img2; // <--Der Pfad zu dem Bild
      echo '"></a>';  


  }
    echo $etd;
  
if (($i % 20 == 0) && ($i != 0)) {

  echo $etr;
  echo $tr;
  }

}
?>

</td>
</tr>
</table>

Ein weiteres Problem ist, dass ich aus irgendeinem Grund die erste Zeile aus meiner Tabelle nicht auslesen kann.

Ich würde mich sehr freuen, wenn Ihr mir zu meinem Ziel verhelfen würdet.

Besten Dank und viele Grüße aus Köln.

momo

Änderungen:
[EDIT masterG 16.02.2008 09:36]:
Ich hab mir erlaub den Code in einen Codeblock zu packen

Content-Key: 80882

Url: https://administrator.de/contentid/80882

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: Cubic83
Cubic83 16.02.2008 um 11:46:33 Uhr
Goto Top
Hallo,

Mir ist nicht ganz klar warum Du oben schon den ersten Eintrag rausnimmst?

$datensatz = mysql_fetch_array($ergebnis);

$img1 = $datensatz['stern_img1'];  
$img2 = $datensatz['stern_img2'];  
$name = $datensatz['name'];  
So springt ja der Zeiger des Resultats auf die Reihe 1 (2te Reihe). Logischerweise beginnt der Zähler dann bei der Reihe 1 unten:

while ($datensatz = mysql_fetch_array($ergebnis)) {
      $sternchen=$datensatz['sternchen'];  
      $sternchen = 1;
      ...
}
      

Wenn ich Recht verstehe sieht deine Tabelle so aus:

*******************
**  sternchen    **
*******************
**  stern_img1   **
**  stern_img2   **
**  name         **
**  sternchen    **
*******************

wobei das Feld sternchen in der Tabelle dann Deine Zufallszahl ist?

Weiterhin sagst Du

while ($datensatz = mysql_fetch_array($ergebnis)) {
      $sternchen=$datensatz['sternchen'];  
      $sternchen = 1;

Warum arbeitest Du nicht direkt mit $datensatz und ersparst dir den Umweg über $sternchen = $datensatz?

while ($datensatz = mysql_fetch_array($ergebnis)) {
         $sternchen=$datensatz['sternchen'];  
         echo '<a href="zeige_sternchen.php?sende_id='$datensatz['sternchen'].'">';  
         echo '<img border="0" title="'.$datensatz['name'].'" name="stern_img1" id="stern_img1" src="../'.$datensatz['stern_img2'].'">';  
      echo '</a>';  

Bei Dir ist $img2 ja immer das Bild aus dem 1ten Datensatz (Reihe 0 von oben).

Wozu dient das $sternchen = 1? Zum einem greifst Du ja nicht direkt darauf zu und zum anderen überschreibst Du ja damit das erste Feld deines Datensatzes.


mfG
Mitglied: Momo
Momo 16.02.2008 um 13:27:31 Uhr
Goto Top
Hi!

Den code habe ich jetzt so abgeändert, sodass ich nur noch auf
$datensatz['sternchen'];  
zugreife.

$img1 wird zunächst noch nicht verwendet. Daher greife ich auch noch nicht auf diese Spalte zu.

Der Code sieht nun so aus:

      while ($datensatz = mysql_fetch_array($ergebnis)) {
      
      echo '<a href="zeige_sternchen.php?sende_id='.$datensatz['sternchen'].'">  
      <img border="0" title="'.$datensatz['name'].'" name="stern_img1" id="stern_img1" src="../';  
      echo $img2; // <--Der Pfad zu dem Bild
      echo '"></a>';  


  }

Ehrlich gesagt weiss ich nicht, warum immer der erste Datensatz ausgelassen wird.
Ich bin bisher noch nicht darauf gekommen. Wäre sehr nett, wenn Du mir zeigen würdest, wo und was ich ändern muß.

Meine Tabelle soll so aussehen:


  • sternchen (Zufallszahl) *
  • name (titel des Bildes) *


Die generierte Tabelle hat durchnummerierte Zellen. Durch eine for-Schleife erhält also jede Zelle eine nummer . Diese Nummer soll nun mit der Zufallszahl verglichen werden.

Gibts einen Treffer, soll der Datensatz mit der getroffenen Zufallszahl in der richtigen Zelle der generierten Tabelle angezeigt werden.

Alle anderen Zellen, zu denen es keine Treffer gab, sollen dennoch angezeigt werden, sodass die Tabelle komplett bestehen bleibt.

Wäre schön, wenn Du mir ein Paar Tipps geben könntest. Für eine Lösung wäre ich dir sehr dankbar.

Viele Grüße

Momo
Mitglied: Cubic83
Cubic83 16.02.2008 um 20:58:20 Uhr
Goto Top
Es ist ja so, dass die Query Dir einzelne Datensätze heraus gibt. Sie sucht Dir also alle Zeilen heraus die der Anfrage entsprechen. Intern wird der Zeiger auf 0 gesetzt.

Dadurch dass Du gleich zu Beginn die erste Zeile ansprichst springt der Zähler auf den 2ten Datensatz.

$datensatz = mysql_fetch_array($ergebnis);

$img1 = $datensatz['stern_img1'];  
$img2 = $datensatz['stern_img2'];  
$name = $datensatz['name'];  

Nach dieser Zeile steht der Zähler auf dem zweiten Datensatz. In deiner For-Schleife beginnst Du also mit dem 2ten Datensatz. Lass diese Zeilen oben weg.

Der Vergleich geht dann so:

 if ($i == $datensatz['sternchen']) {  
    ...
 }

mfG
Mitglied: Momo
Momo 17.02.2008 um 01:35:24 Uhr
Goto Top
Ok, dass habe ich endlich verstanden.
Dankeschön. Ich hätte mich sonst tot gesucht. face-smile

Nun habe ich den Vergleich innerhalb der While-Schleife gemacht.
Das Ergebnis ist, dass ich eine durchnummerierte (leere) Tabelle zurückgeliefert bekomme.

Mache ich den Vergleich ausserhalb der While-Schleife, also um die While-Schleife herum, dann bekomme ich alle meine images aus
$datensatz['stern_img2'];   
in der Zelle mit der Nummer "0" zurück.

Die Datensätze stehen also alle in der selben Zelle.

So sieht der Code innerhalb der While-Schleife aus:

echo $tr;

for ($i=0; $i<401; $i++) {

  echo $td;

      echo $i; 

  while ($datensatz = mysql_fetch_array($ergebnis)) {
    if ($i == $datensatz['sternchen']) {  
      echo '<a href="zeige_sternchen.php?sende_id='.$datensatz['sternchen'].'">  
      <img border="0" title="'.$datensatz['name'].'" name="stern_img1" id="stern_img1" src="../';  
      
      echo $datensatz['stern_img2']; // <--Der Pfad zu dem Bild  
      echo '"></a>';   
      }
    }
 
  echo $etd;
  
  if (($i % 20 == 0) && ($i != 0)) {
      echo $etr;
      echo $tr;
  }

}

Und so sieht er ausserhalb der While-Schleife aus:

echo $tr;

for ($i=0; $i<401; $i++) {

  echo $td;

      echo $i; 
if ($i == $datensatz['sternchen']) {  
  while ($datensatz = mysql_fetch_array($ergebnis)) {
    
      echo '<a href="zeige_sternchen.php?sende_id='.$datensatz['sternchen'].'">  
      <img border="0" title="'.$datensatz['name'].'" name="stern_img1" id="stern_img1" src="../';  
      
      echo $datensatz['stern_img2']; // <--Der Pfad zu dem Bild  
      echo '"></a>';   
      }
    }
 
  echo $etd;
  
  if (($i % 20 == 0) && ($i != 0)) {
      echo $etr;
      echo $tr;
  }

}

Was läuft falsch? Warum werden die gefundenen Datensätze nicht in den richtigen Tabellenzellen angezeigt.

Ich verstehe es leider nicht richtig.

Es wäre klasse, wenn Du mir noch einen Tipp geben könntest.

Besten Dank!

Viele Grüße

Momo
Mitglied: Cubic83
Cubic83 17.02.2008 um 10:12:44 Uhr
Goto Top
Ausserhalb der While-Schleife kann nicht funktionnieren, da $datensatz['sternchen'] nicht definiert ist. Ich gehe jetzt mal davon aus, dass Du die 3 besagten fetch_array Zeilen oben heraus genommen ist.

Prinzipiel kannst Du die Ausgabe testen mit:

 

echo '<pre>';  
print_r($datensatz);
echo '</pre>';  

Ich würde diese 3 Zeilen gleich hinter die mysql_fetch_array($ergebnis) setzen. So siehst Du wierklich was in jedem Datensatz gespeichert ist.


Es ist so, dass wenn Du einmal durch die While Schleife gelaufen bist, der Zähler bei der letzten Zeile aus deinem $ergebnis angekommen ist. Und da bleibt er auch, es sei denn Du setzt in zurück.

Probier doch mal die While Schleife gegen eine For-Schleife auszubauen.

for ($i=0;$i<401;$i++) {

     for ($j=0;$j<mysql_num_rows($ergebnis);$j++) {

          if ($i == mysql_result($ergebniss, $j, 'sternchen')   

             ... 

          }

     }

}



mfG
Mitglied: Guenni
Guenni 17.02.2008 um 11:46:54 Uhr
Goto Top
@Momo

Hi,

Was läuft falsch?

Kann ich dir sagen.
Du eröffnest eine for-Schleife, um eine Tabelle zu konstruieren.
Und im ersten Durchlauf rufst du bereits alle Datensätze ab.
Die for-Schleife kannst du weglassen, und statt dessen die
Tabelle gleich mit der while-Schleife erstellen.

Folg. Code stellt eine Tabelle mit den Vornamen einer
Adress-DB dar, zu jedem Vornamen wird die Zellennummer
angezeigt.


<?
$query="select * from tabelle2";  
$result=mysql_query($query);
$i=1;
echo "<table>";  
echo "<tr>";  
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
/*
Hier den Code zur Überprüfung $i == Sternchen einfügen
*/
 echo "<td> %i - Deine Ausgabe </td>";  
 if($i%10==0){
  echo "</tr><tr>";  
 }
 $i++;
}
echo "</tr></table>";  
?>
Gruß
Günni
Mitglied: Momo
Momo 17.02.2008 um 12:23:35 Uhr
Goto Top
Hi Günni!

Zunächst vielen Dank für Deinen Beitrag.
Leider funktioniert das nicht so ganz bei mir. Vielleicht habe ich ja irgendwo einen Fehler eingebaut, ohne es zu wissen.

Ich bekomme mit folgendem Code eine leere Seite zurück.

So sieht jedenfalls mein Code aus.

<?php 
echo '<table align="center">';  
echo '<tr>';  
  while ($datensatz = mysql_fetch_array($ergebnis, MYSQL_ASSOC)) {
  if ($i == $datensatz['sternchen']) {  
      echo '<a href="zeige_sternchen.php?sende_id='.$datensatz['sternchen'].'">  
      <img border="0" title="'.$datensatz['name'].'" name="stern_img1" id="stern_img1" src="../';  
      
      echo $datensatz['stern_img2']; // <--Der Pfad zu dem Bild  
      echo '"></a>';   
      }
        
  if (($i % 20 == 0) && ($i != 0)) {
      echo $etr;
      echo $tr;
  }
$i++;
}
echo "</tr></table>";  
?>

Siehst du etwas, was ich übersehen habe? Wenn ja, wäre es klasse, wenn Du mir verraten würdest, was ich falsch gemacht habe.
Mitglied: Cubic83
Cubic83 17.02.2008 um 12:58:31 Uhr
Goto Top
Verlass dich nicht darauf was Du siehst. Du musst den Quelltext deiner Seite öffnen (z.b über REchtsklick ins Dokument -> "Quelltext anzeigen".

Dort müsstest Du bei diesem Code etwas sehen wie:

<table align="center"><tr></tr></table>  

Probier doch mal meine Variante mit den beiden FOR Schleifen.

mfG
Mitglied: Momo
Momo 17.02.2008 um 13:03:09 Uhr
Goto Top
Jo, das mach ich sofort. Muß grad was essen, sonst gibts haue von Frau face-wink.

Werds gleich probieren. Das andere ging schneller aber Deine Variante werd ich mir gleich zu gemüte führen.

Meld mich gleich wieder.

Bis gleich!

Gruß Momo
Mitglied: Guenni
Guenni 17.02.2008 um 13:59:55 Uhr
Goto Top
@Momo

Hi,

Siehst du etwas, was ich übersehen habe.

Wenn du mit if… prüfst, mußt du auch eine
Alternative mittels else formulieren, falls mit
if keine Übereinstimmung gefunden wird.
Nochmal mein Beispiel:

Wenn zahl(bei dir sternchen) mit $i übereinstimmt, wird ein Link
ausgegeben, ansonsten der Spalteninhalt.
<?
include("net-comm/inc/session.inc.php");  
$query="select * from tabelle2";  
$result=mysql_query($query);
$i=1;
echo "<table>";  
echo "<tr>";  
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
 if($i==$row[zahl]){ // zahl ist bei dir Sternchen
  $treffer="<td>$i - <a href=\"link.php?id=$row[id]\">OK</a></td>";  
 }else{
 			 $treffer="<td>$i - $row[Vorname]</td>";  
 			 }
			 echo $treffer;
 if(($i % 5 == 0) && ($i != 0)){
  echo "</tr><tr>";  
 }
 $i++;
}
echo "</tr></table>";  
?>
Gruß
Günni
Mitglied: Momo
Momo 17.02.2008 um 14:26:24 Uhr
Goto Top
Hi Cubic83!

ES FUNKTIONIERT!!!!!!! face-big-smile

Allerdings habe ich das Problem mit dem ersten Datensatz wieder.
Der erscheint wieder nicht. Der Platzhalter für das Sternchen erscheint zwar aber das Sternchen selber leider nicht. Woran könnte das nun liegen?

Hast Du noch ne Idee?

Viele Grüße

Momo
Mitglied: Cubic83
Cubic83 17.02.2008 um 15:18:42 Uhr
Goto Top
Schreib mal den ganzen Code raus, so wie du ihn jetzt vor dir hast.
Mitglied: Momo
Momo 17.02.2008 um 15:36:57 Uhr
Goto Top
Hi!

Anbei der Code, wie er jetzt aussieht:

<?php

echo $tr;

for ($i=0; $i<401; $i++) {

  echo $td;

      echo $i; 

  for ($j=0;$j<mysql_num_rows($ergebnis);$j++) {

    if ($i == mysql_result($ergebnis, $j, 'sternchen')) {  
$datensatz = mysql_fetch_array($ergebnis);
      echo '<a href="zeige_sternchen.php?sende_id='.$datensatz['sternchen'].'">  
      <img border="0" title="'.$datensatz['name'].'" name="stern_img1" id="stern_img1" src="../';  
      
      echo $datensatz['stern_img2']; // <--Der Pfad zu dem Bild  
      echo '"></a>';   
    }

  }
  echo $etd;
  if (($i % 20 == 0) && ($i != 0)) {
      echo $etr;
      echo $tr;
   }
}

?>

Eine Info noch:

Für den erste Datensatz wird nur der Platzhalter ohne Bild angezeigt. Zudem wird in dem Link auch die generierte Zufallszahl nicht angezeigt.

Woran liegt das?
Mitglied: Cubic83
Cubic83 17.02.2008 um 15:50:11 Uhr
Goto Top
Nimm die Zeile

$datensatz = mysql_fetch_array($ergebnis);

ganz rause. Die brauchst Du nicht. Indem Du mit mysql_result($erg, $j, 'sternchen') arbeitest gibts Du den Zähler selbst an. $j bestimmt welche Zeile ausgelesen wird.

Die Variable $datensatz gibts dann natürlich auch nicht mehr und muss über mysql_result() angesprochen werden.

<?php

echo $tr;

for ($i=0; $i<401; $i++) {

      echo $td;
      echo $i; 

      
      for ($j=0;$j<mysql_num_rows($ergebnis);$j++) {

           if ($i == mysql_result($ergebnis, $j, 'sternchen')) {  
          
              echo '<a href="zeige_sternchen.php?sende_id='.mysql_result($ergebnis, $j, 'sternchen').'">  
                       <img border="0" title="'.mysql_result($ergebnis, $j,'name').'" name="stern_img1" id="stern_img1" src="../';  
              echo mysql_result($ergebnis, $j, 'stern_img2)) ; // <--Der Pfad zu dem Bild  
              echo '"></a>';   
         }

     }
     echo $etd;
     if (($i % 20 == 0) && ($i != 0)) {
       echo $etr;
       echo $tr;
     }
}

?>

Ich würde die letzte IF Abfrage so formulieren:

 
    if (($i % 20 == 0) && ($i != 0)) echo $etr.$tr; 

mfG
Mitglied: Momo
Momo 17.02.2008 um 16:27:17 Uhr
Goto Top
Wirklich super!

Ich danke Dir recht herzlich.

Es funktioniert genauso wie ich es mir vorgestellt habe.

Die ganze Aktion habe ich für meine Frau gemacht.

Wir hatten bis Ende letzten Jahres 6 Jahre lang einen Hund, der leider verstorben ist.
Da dachte ich mir, ich baue eine Art Forum bei dem es möglich ist, den verstorbenen Hund als "Stern am Himmel" darzustellen. Für jeden der ein Foto und ein paar Sätze in einer Eingabemaske hochlädt, erscheint ein Stern am Himmel. Geht man mit der Maus über den Stern, erscheint in einer Sprechblase der Name und das Foto des Hundes.
Klickt man auf den Stern, erscheint ein Profil des Hundes.

Als Hintergrund für das Profil habe ich ein Bild mit einem hellblauen Himmel und einem Regenbogen hinterlegt. Dort erscheint eine Tabelle mit dem Profil.

Besucht man die Seite, kann man in einer Suchmaske den Namen und das (bekannte) Geburtsdatum des Hundes eingeben und erhält als Ergebnis in einer Liste den Link, der zum "Stern am Himmel" führt.

Über eine Admin-Seite kann man Korrekturen machen oder Einträge löschen.

Es ist wirklich nicht schlecht geworden.

Besten Dank für Deine / Eure Hilfe!

Es kann natürlich sein, dass ich nochmal auf Eure Hilfe zurückgreifen werde.

Falls Ihr dann immernoch Lust und Zeit habt, dann würde ich mich sehr freuen, wenn mir nochmal geholfen wird.

Viele Grüße aus Köln

Momo