• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

LIMIT ohne limit

Guido

New member
Moin!

Ich möchte die Ausgabe einer Ergebnismenge limitieren (30 pro Seite) ohne die LIMIT-Krücke von mySQL! Ich will also eine Anzeige erstellen wie sie z.B. unter den Threads steht - sofern sie mehr als 15 Posts enthalten (oder 20, oder was ihr eingestellt habt).
Bis hier hin bin ich schon gekommmen:
PHP:
$query = "SELECT COUNT(*) AS total FROM lehrer";
$db->query($query);
$db->next_record();
$gesamtzahl = $db->f("total");
$limiter = "30";
$seitenanzahl = $gesamtzahl / $limiter;
Aber was mache ich dann damit??? ;)
Wie bekomme ich die Anzeige hin???

Ade
Guido

edit: ich benutze PHPLIB, deshalb die anderen Befehle.
db->query == mysql_query
db->next_record == mysql_fetch_array (?)
 
Zuletzt bearbeitet:
Hallo!

ALso ich halte das LIMIT von MYSQL nicht für ne Krücke den ohne dem wäre das Seiten blättern im VBULLTETIN Board auch nicht möglich, bzw umständlich.

Normalerweise wirds so gemacht(von mir wirds halt so gemacht :)):

Zwei Variablen für Anzahl und Startwert:

PHP:
$anzahl = 100;  //Also 100 Datensätze pro Seite
if(!$low)$low = 0;
$query = "SELECT * FROM lehrer LIMIT $low,$anzahl";

Da du die Anzahl der Seiten ja schon hast(Würd ich noch aufrunden -> $seitenanzahl)

kannst du dann in einer for Schleife die Links für 1 2 3 4 usw generieren, wobei bei diesen Links einfach immer ein demäntsprechendes $low mitgegeben wird:

PHP:
for($x=1;$x<=$seitenanzahl;$x++)
{
    echo "<a href=\"",$PHP_SELF,"?low=",$anzahl * $x,"\">",$x,"</a>";
}
So auf die Art mach ich das immer.Du kannst das ganze natürlich auch mit PHP machen indem du auch ein low mitgibtst und einfach nextRecord machst wie low groß ist, in diesem Fall geht aber die DB-Abfrage langsamer und PHP hat auch noch etwas mehr zu tun
 
überflieg...
Du kannst das ganze natürlich auch mit PHP machen indem du auch ein low mitgibtst und einfach nextRecord machst wie low groß ist, in diesem Fall geht aber die DB-Abfrage langsamer und PHP hat auch noch etwas mehr zu tun
Dann kann ich es also ohne das LIMIT machen? Und wie genau? - bin grad etwas deppig! Limit ist deshalb eine Krücke, da ich es evtl. auf andere DBs portieren muss die evtl., oder bestimmt kein Limit unterstützen?
Danke soweit
 
Also dem LIMIT ist schon eine Krücke, denn es funktioniert ausschliesslich im mySQL. Für Plattform übergreifende DB-Programmierung ist es also Null geeignet, da es nicht im SQL Standard enthalten ist!!

Aber das heißt nicht, daß man zum Blättern eine Schleife programmieren muß, die erstmal alle Datensätze verbrennt, bevor es die aktuelle Seite anzeigt. (;))
In der PHPlib, wie auch versteckt in den einzelnen DB Funktionen, gibt es die Funktionen num_rows und seek. Mit ihrer Hilfe kann man die Gesamtanzahl der Datensätze eines Cursors ermitteln und an eine gewünschte Position fahren, ohne alle Datensätze mühsam übertragen zu müssen. Der Cursor in der Datenbank wird dabei zwar trotzdem immer komplett aufgebaut (im Gegensatz zu LIMIT, wo die DB schon gleich weiß, ich möchte nur n Datensätze haben...), aber es sollte ein gewisser Geschwindigkeitsvorteil gegenüber dem "Verbrennen" von Datensätzen sein.

Allerdings muß ich noch eine Einschränkung machen: für Oracle gilt das leider nicht. :(
Hier bietet PHP soweit ich sehen kann keine Funktion an, demzufolge ist in der PHPlib auch nur das "Springen" zum aktuellen und zum zuletzt gelesenen (und gecachten) Datensatz möglich, was hier leider nicht hilft.
Die einzigste Alternative wäre die Oracle Verbindung über ODBC zu machen, bzw. hier die Funktion seek der PHPLib zu ergänzen, wie der Kommentar an der entsprechenden Stelle vorschlägt....
 
Hallo!

Ach das hast du mit Krücke gemeint.

Dann mußt es eben so machen wie Albu es vorgeschlagen hat, andere Möglichkeiten seh ich hier auch nicht bis auf die alternative alle Datensätze abzufackeln.
 
sorry

Gerade Besuch bekommen...
Ich werde die Lösung alsbald posten. Hab gerade anderes zu tun. Aber Danke für die erschöpflichen Antworten - damit lässt sich was hinbasteln! Danke!

Ade
Guido

P.S.: Und habt euch wieder lieb! ;)
Peace and love and unity this is what we need in the entire community.
 
Besuch noch da, aber ich hab mich in der Nacht schnell mal an den Compi gesetzt.
ALSO:
Comets Version funktioniert; ich hab daraus gemacht:
PHP:
<?
$db = new projekt_DB;
$query = "SELECT COUNT(*) AS total FROM lehrer";
$db->query($query);
$db->next_record();
$gesamtzahl = $db->f("total");
$limiter = 25;
$seitenanzahl = $gesamtzahl / $limiter;
// $seitenanzahl = ceil($seitenanzahl);

if (!$low) $low = 0;
$query = "SELECT * FROM lehrer LIMIT $low,$limiter";
$db->query($query);
echo "Seiten: ";
for ($x=0;$x<=$seitenanzahl;$x++){
$y = $x+1;
	if ($low == ($x * $limiter)) {
		echo "<span class=\"rot\">[<a href=\"".$PHP_SELF."?low=".$limiter * $x."\">".$y."</a>] </span>";
	} else {
		echo "[<a href=\"".$PHP_SELF."?low=".$limiter * $x."\">".$y."</a>] ";
	}
}
echo "<br>";
?>
@Albu
hab mich egrade noch mal in die PHPLIB-Anleitung vertieft: Für die Portierung auf Oracle ist da ja überhaupt nichts zu tun... ausser deine Variante (die ich nicht völlig peile, aber fast). Ich glaube wir brauchen einen anderen Host - haben auch schon Gespräche mit dem Förderverein laufen.

P.S.: Und habt euch wieder lieb! ;)
Peace and love and unity this is what we need in the entire community.
@comet
Habe dich mit Birdy verwechselt... und Albu und Birdy sollten sich lieb haben ;)

Ade
Guido
 
mit dem Verbrennen oder Abfackeln der Datensätze meinen wir eigentlich nur, daß Du hierbei manuell next_record ausführen mußt (bzw. eine optimiertere Version, die Du Dir aus der next_record Funktion der Oracle Klasse abschaust) und zwar solange, bis Du an der bei seek angegebenen Position angekommen bist.
Das Vorgehen ist ja dabei i.d.R. folgendes:
1. select * from table
2. seek ($curPage * $pageSize)
3. for $i = 0 to $pageSize do echo $entries

für mysql funktioniert der Pseudo Code schon so, und wenn Du die das "Abfackeln" in der seek Funktion der Oralce Klasse unterbringst, dann kannst Du mit dem selben Code zwischen mysql und Oracle switchen.....
 
@albu
:D Danke danke danke, aber ich glaub, wenn das so leicht geht... da hake ich morgen nochmal nach und sage, dass wir UNBEDINGT MySQL brauchen. ;)
Hab schlichtweg keinen Bock mehr immer wieder rumzufummeln und zu wurschteln, wenn es doch sooo einfach sein könnte - wir hatten das schon mal: mit den Windmühlen und so :rolleyes:
Und MySQL ist einfach super angepasst an die typischen Bedürfnisse und warum dann nicht nutzen? Die fünfzehn Euro pro Monat, daran wirdst wohl nicht scheitern.
 
Zuletzt bearbeitet:
Zurück
Oben