Navigation in Recordset (next/previous)

Elminster

Grünschnabel
Problem gelöst...

Kurz zusammengefasst war das Problem, das Ergebnis einer SQL-Abfrage auf mehrere Spalten nebeneinander und Zeilen untereinander zu verteilen - Mini-Beispiel oben im Code zur Veranschaulichung :)

Nicht ganz so komfortable wie in ASP mit Recordset.Next und Recordset.Previous, aber was soll's :)

PHP:
<!-- ---------------  begin MULTI-COLUMNS-TABLE ---------------  -->
<?php
/* 
Script zum erzeugen mehrer Spalten nebeneinander aus einer Abfrage
bzw. einem Recordset.

Bsp.:

         |  Spalte 1     |  Spalte 2     |   Spalte X
-------------------------|---------------|---------------
Zeile1   |  Toyota<br>   |  Honda<br>    |   Fiat<br>
         |  140 PS       |  50 PS        |   30 PS
         |  ...          |  ...          |   ...
-------------------------|---------------|---------------
Zeile2   |  BMW<br>      |  Mercedes<br> |   .....
         |  100 PS       |  10 PS        |
         |  ...          |  ...          |
-------------------------|---------------|---------------
Zeile3   |     ...       |  ...          |   ....

*/

// SQL-Krams
$sql = "SELECT Stufen, PHP_Tauglichkeit FROM Planlos";
$mc_result = mysql_query($sql) or die("Couldn't execute query." );
$num_rows = mysql_num_rows($mc_result);

// Die wichtigen Sachen
$columns =3;		// Anzahl gewünschter Spalten (außer 1... )
$i = 0; 				// Counter
// nächstgrößere Ganzzahl aus Division
$rows = ceil($num_rows / $columns);
// wieviel leere Zellen stehen am Ende?
$emptyCells = ($rows*$columns) - $num_rows;

// Wenn so wenig Datensätze da sind, dass sie alle in eine Reihe
// passen, dann brauchen wir keine leeren Zellen am Ende (um 
// HTML-Konform gleich viele Zellen wie Spalten zu haben)
if ($rows = 1) {
	$emptyCells = ($columns - $emptyCells);
}

// Unsere Tabelle
echo ("<table width=\"100%\">\n<tr>\n\t<th colspan=\"" . $emptyCells . "\">Server-Info</th>\n</tr>");

// Jeden Datensatz abklappern und Zeilen schreiben
while($row = mysql_fetch_array($mc_result)) { 
	// Wenn wir noch einen Datensatz haben und alle Spalten der 
	// Zeile "voll" sind: Neue Zeile starten
	if($i != $rows && ($i%$columns == 0)) { 
		echo ("<tr>\n"); 
	}
  echo ("\t<td>");
  // HIER FOLGT DER ZELLENINHALT
	echo ("Deine Planlosigkeitsstufe: " .$row["Stufen"] . " ergibt deine PHP-tauglichkeit: " .$row["PHP_Tauglichkeit"]);
  // ENDE ZELLENINHALT
  echo ("\t</td>\n");
	// Wenn wir nicht beim ersten Datensatz sind und die letzte 
	// Spalte durchhaben, dann Zeile schließen
	if($i != 0 && $i%$columns == 0) { 
		echo ("</tr>\n");
	// Nicht erster Datensatz UND es ist der letzter Datensatz UND 
	// leere Zellen >0<Spaltenzahl 
	// -> verbleibende Zellen schreiben und HTML-Konform sein...
	} elseif ($i != 0 && $i+1 == $num_rows && $emptyCells != 0  && $emptyCells < $columns) {
		echo ("\t<td colspan=\"" . ($emptyCells) . "\"></td>\n"); 
	}
	
	// Der i-te Datensatz ist durch... auf zum nächsten
	$i++;
}

// Schließen der Tabelle
echo ("</tr>\n</table>\n");

?>
<!-- ---------------  end MULTI-COLUMNS-TABLE ---------------  -->
 
Zuletzt bearbeitet:
PHP:
while ($row=mysql_fetch_array($MyQuery))
holt Dir ja in jedem Durchgang nur eine Reihe, daher musst Du bis zum naechsten Durchgang warten.
Hast Du immer 4 Reihen, oder koennen das auch mehr sein?
Wenn ja, wie geht es weiter?

So?

row1/col1 | row2/col1
row3/col2 | row4/col2
row5/col3 | row6/col3
row7/col4 | row8/col4

Oder wie?
 
reptiler hat gesagt.:
[...] holt Dir ja in jedem Durchgang nur eine Reihe [...]

Genau das ist quasi das Problem - ich bräuchte in jedem Durchgang 2 Reihen (so einfach kann man's formulieren :)).

Demnach ist deine Annahem auch richtig, dass die HTML-Zeilen unbestimmt fortgesetzt würden (also auch mehr als 4).
 
Dann koenntest Du vielleicht sowas nutzen:
PHP:
$x=1;
$col=1;
echo '<tr>';
while ($row=mysql_fetch_array($MyQuery))
 {
  echo '<td>'.$row['Spalte'.$col].'</td>';
  if ($x%2==0)
  {
   $col++;
   echo '</tr><tr>';
  }
  $x++;
 }
echo '</tr>';

Bin jetzt nicht sicher ob's laeuft. Ist spontan getippt, und das beim Telefonieren. ;)
 
Zuletzt bearbeitet:
Naja er will sicher auch wissen, wie das ganze funktioniert.
Mit if ($x%2==0) fragt er ab, ob $x geteilt durch 2 gleich den Restwert 0 ergibt, sprich: ob $x teilbar durch 2 ist.

Diese Bediengung wird also bei jedem 2. Schleifendurchlauf erfüllt.
Aber was soll das $col machen?
Wird nach jedem 2. mal eins erhöht. Für was?
 
Vielen Dank für eure Antworten :)

Nach ewiger Zeit und viel verlorenen Nerven hab ich's nu hingekriegt. Die Lösung hab ich an den Anfang des Beitrags gepackt - vielleicht kann's ja noch mal jemand brauchen (ich hab mich jedenfalls ziemlich totgesucht). Hab's auch etwas totkommentiert für den nächsten Laien meiner Gattung :-)

Cool wäre es natürlich, wenn man einfach den ganzen Code auslagern könnte und dann per include an beliebiger Stelle einfügen könnte um solche Tabellen zu schreiben. Vorm inlcude müßte man dann nur $mc_result und $columns initiieren und dann losschreiben.

Also so:
PHP:
$mc_result = mysql_query($sql);
$columns =3;

// (alles bis zum Kommentar HIER FOLGT DER ZELLENINHALT)
include multiCol_Top.inc  

// Mein Zelleninhalt - also das was sich wirklich ändert
echo ("Deine Planlosigkeitsstufe: " .$row["Stufen"] . " ergibt deine PHP-tauglichkeit: " .$row["PHP_Tauglichkeit"]);

// (alles bis zum Kommentar ENDE ZELLENINHALT)
include multiCol_Bottom.inc

aber leider ned, weil's mitten in nem While-Loop auseinandergerissen würde. Wenn da jemand noch nen simple Möglichkeit / "Trick" kennt... :)

Wirklich geschnallt hab ich aber noch ned wie das mit dem mysql_fetch_array($result) . Wieso geht sowas nicht:

PHP:
$row1 = mysql_fetch_array($result)
$row2 = mysql_fetch_array($result)

Funktioniert diese Zuweisung wie bei nem Pointer (ned das ich wirklich wüßte worüber ich hier rede - nur schemenhaft)?

@reptiler:
Deine Lösung würde , wenn man nur eine Zeile pro Recordset schreiben wollte - wahrscheinlich habe ich deine Nachfrage da mißverstanden. Wie's gedacht war siehst du oben im Code :)

@Irgendjemand_1:
Das nennt man Modulo, aber danke für die Mühe einer Erläuterung :) ;)
 
Zurück