weitere Datensätze per Klasse nachladen

Purdey

Erfahrenes Mitglied
Hallo Leute,

ich habe eine Klasse gebastelt, welche mit Ergebnisse auf eine bestimmte Abfrage übermittelt (als Tabellarische Liste)
nun könnte ich somit also alle Vorgänge mit ausgeben, es kann jedoch seien das ich hier mehrere hundert Datensätze erhalte.

Daher würde ich lieber nur die ersten X Datensätze ausgeben (bspw. 25) bis dato ja auch kein Problem, entspricht je einfach nur einem Limit im SQL Befehl (bspw. LIMIT 25).

Nun die spannende Frage, wie kann ich mittels einer Klasse realisieren das nur 25 angezeigt werden dann aber so lange es noch Datensätze gibt ein mehr Button kommt, welcher wiederum die kommenden 25 Datensätze holt und anzeigt.

Das ganze sollte so lang geschehen bis keine Datensätze mehr vorhanden sind.

Ich hoffe ihr konntet in etwa verstehen was ich gerne realisieren möchte.

Der Klassenaufruf erfolgt folgendermaßen:

show_table($header, $headertitle, $headertag, $header_column, $sql)

Ich übergebe header (true / false), den Titel , welcher html tag den Titel umklammert, ein Array aus den Spaltennamen + den SQL

Ich freue mich auf eure Antworten.
 
Allgemein kann man festhalten, dass du somit zwei SQL-Anfragen brauchst: einerseits eine Anfrage, wie viele Datensätze dir geliefert werden können, andererseits die erste Anfrage nach den ersten x Datensätzen. Und dann kannst du immer abgleichen, ob du schon alle Datensätze geladen hast oder nicht.
 
Okay vielen dank einfach nur crack.
Aber ist das ganze dann noch schnell und performant?

Wie würdest du die beiden abfragen miteinander vergleichen?

Kannst das mal grob anreisen?
 
Moin,

Wie würdest du die beiden abfragen miteinander vergleichen?

Was vergleichen?
In Prinzip: 2 Abfragen, eine Abfrage die die Anzahl der vorhanden Datensätze errechnet (mit COUNT(*) zum Beisbiel).
Und die andere Abfrage die jeweils die 25 Datensätze holt.


Die Frage "Aber ist das ganze dann noch schnell und performant?" wird die niemand beantworten können ohne zu wissen was du vor hast.

Nach meiner Ansicht, ist es vorteilhafter 2 Abfragen zu machen, als 100 Datensätze auszulesen.
Einmal mit der Anzahl der gesamten Datensätze und die 2. mit den gewünschten Datensätzen.

Für mich hört sich auch nach keiner großen Dimension an.
 
Purdey, ich kann nur Dimension danken, denn er hat meine Idee verdeutlicht. Abgesehen davon ist dieses Lazy Loading die Art, mit der beispielsweise Ruby on Rails arbeitet – und die wissen, was sie da anstellen. Ansonsten gilt weiterhin: du solltest selber genau wissen, was du vor hast, damit du eine performante Art für dein Problem findest.
 
Zum Thema Performant:
Performance-Verbesserungen sind keine eindeutige und einfache Sache. Es ist ein testen und heran tasten. Auswerten von Explainplans, SQL umschreiben - ggf. total umschreiben, weiter testen, Anzahl Datensätze der Tabelle vergleichen, ggf. Subqueries machen um die Datenmenge so früh wie möglich klein zu kriegen etc.
Also, so einfach *schnipp*und ein SQL ist schnell - das kannst du vergessen. Diese ganzen Punkte die ich aufgezählt habe gehen auch nicht einfach so mit im Forum hin und her schreiben. Lies dich in das Thema ein. Verscuh es zu verstehen. Und dann setz dich hin und probier dich durch.

Meine Messung auf meine Perf-Test-Tabelle

SQL:
SELECT COUNT(*) FROM perf_test;
-- Resultat: 63104
-- Messung: /* 0 rows affected, 1 rows found. Duration for 1 query: 0.000 sec. */

Also, mach dir mal keine Sorgen. Die DB ist gemacht um solche Funktionen über Millionen von Zeilen abzusetzen...
 
Zuletzt bearbeitet von einem Moderator:
Also ich löse solche Dinge gern recht einfach! Hier mal ein Beispiel, welches ich dann erkläre :

PHP:
         /**
	 * Hole die Daten
	 * 
	 * @param integer $start
	 * @param integer $stop
	 */
	public function getUserData($start=0, $stop=0){
		//Limit vorbereiten
		$limit="";		
		if($stop!=0){
			$limit="LIMIT {$start}, {$stop}";
		}
		//------------------------------------------
		$stmt=$this->dbh->dbh->prepare("SELECT u_id, u_vname, u_nname, u_active, u_reg_date FROM b_receiver ORDER BY u_id ASC {$limit}");
		$stmt->execute();
		$stmt->bind_result($id, $vname, $name, $activ, $date);
		$i=1;
		while($user=$stmt->fetch()){
			$this->user[$i]=array('userid' => $id, 'vname' => $vname, 'name' => $name, 'activ' => $activ, 'date' => $date);
			$i++;
		}
		$stmt->close();
	}

Das ist eine Funktion meiner Klasse - wie zu sehen ist, kann man hiermit entweder ALLE Daten der Tabelle lesen - daher die Vordefinition im Funktionsaufruf mit $start=0, $stop=0 oder aber, man kann die Daten anhand LIMIT begrenzen. Ich speichere diese Daten gern in einem Array, wie zu sehen sein sollte;)

Am Anfang des Scriptes schreibe ich die Vordefinitionen von $start und $stop sowie ne Seitenabfrage:

PHP:
$start=0;
$stop=10;
//Könnte man auch mit POST machen
if(isset($_GET['page'])){
	$page=$_GET['page'];
	$start=($stop*($page-1));
}else{
	$page=1;
}

$stop=10; definiert hier die Begrenzung, der Menge und unter der Ausgabe schreibe ich mir die Seitenberechnung:

PHP:
//ermittle die Anzahl der vohandenen Datensätze
$anz=$kats->getAnzPerKat($kat, 1);
		//ermittle die Anzahl der Seiten
		$pages=ceil($anz/$stop);
		$ausgabe.="<hr>Seite: ";
		for($a=1; $a<=$pages; $a++){
			if($page==$a){
				$ausgabe.=" <b>{$a}</b> ";
			}else{
                                //Hier könnte man zum Beispiel, ne Form ausgeben lassen, damit man Buttons erhält
				$ausgabe.="<a href=\"$projekturl/?mod=ebook-sortiment&kat=$kat&page={$a}\">{$a}</a> ";
			}
		}

So lassen sich recht einfach, auch größere Mengen, der Daten verwalten und abrufen!
 
Hallo und vielen Dank euch allen, bzgl. der Anzahl kann ich halt nicht genau sagen aktuell sind es 3000 Datensätze aber es werden ja mehr.

Das Beispiel hat mir geholfen, ich frage mich jedoch wie ich einen more Button realisiere.
Eine Pageination ist hier vielleicht einfacher aber der mehr Button schicker. In diesem Moment arbeite ich dann ja aber nicht mehr mit $start und $stop oder?
 
Achso, du möchtest also nen Button unterhalb, auf den du klickst und die nächsten xx Einträge erscheinen?

Hier bekommst du dann schon eher Performance Probleme, da du hier das Problem hast, dass du vorab ALLE Daten auslesen musst. Jedenfalls fällt mir, dazu spontan nichts ein...

MySqli macht schon was her, aber wenn du nachher ne Datenbank hast mit was weiß ich 45.000 Einträgen wo du dann pro Eintrag 25 Spalten hast, wo du auslesen musst - sehr schwierig!
 
Nicht ganz. Wenn du mit Ajax arbeitest, kanns du jederzeit X weitere Datensätze auslesen und hinzufügen
 
Zurück