JavaScript [AJAX / PHP] Kann man Ajax auf einer php Webseite anwenden?

technik_toni

Ensign
Registriert
Sep. 2008
Beiträge
250
Hy ich hab mal eine Frage an die php, ajax Fraktion.

Also ist ajax bei einer mit php erstellten Webseite sinnvoll?
Bzw. wie würdet ihr fogendes Beispiel lösen?

Nehmen wir an es gibt eine Datenbank mit z.B. 10000 Datensätzen. Die eigentliche Webseite ist mit php geschrieben und User können sich anmelden und haben dann einen eigenen Userbereich.
Wenn jetzt z.B User_X die suche benutzt und bekommt meinetwegen 500 Ergebnisse. Wie kann ich die Ausgabe mit ajax realisieren. Ich will quasi in einem großen DIV 20 kleine DIV's unterbringen, deren Inhalt mittels ajax geladen werden soll. Wenn der User dann auf einen Link bzw. Button klickt dann soll der Inhalt der 20 kleinen DIV's mit den nächsten 20 Datensätzen seiner Suche gefüllt werden. Es sollen immer nur die Inhalte der 20 kleinen DIV's neu geladen werden und nicht die gesamte Seite von daher dachte ich an ajax. Oder wie soll ich das machen?

Wie z.B. die google Bildersuche. Da werden die Bilder ja auch dynamisch nachgeladen. Wie machen die das?

Gruß technik_toni
 
Indem die PHP Webseite nicht nur PHP ausliefert sondern eben auch Javascript und xmlhttprequest nutzt. Und damit eben das Buzzword "AJAX".
 
Um mal ein einfaches praktisches Beispiel zu geben:

Bei deiner Seite gibst du dem Div in das die anderen Divs geladen werden sollen, eine eindeutige id.
Also z.B.
<div id="content" />

Den Inhalt den du normalerweise mit PHP darein rendern würdest, lässt du an dieser Stelle weg und erstellst erstmal eine weitere php-File, die dir nur das ausgibt, was vorher in dem Div war. Beispielsweise als ajax/getdata.php .
Und dann rufst du die Daten mit folgendem JQuery-Schnipsel, das du in deine Hauptseite einbettest und z.B. per Button aufrufst, ab:

$.ajax({
url: "ajax/getdata.php",
cache: false
}).done(function( html ) {
$("#content").htmtl(html);
});

Hierfür musst du JQuery natürlich einbinden, es geht auch ohne aber dann würde der Code hier auswändiger.

Anschließend wirst du der getdata.php dann noch Parameter übergeben müssen, um an die nächsten 20 Einträge zu bekommen. Siehe dazu den Eintrag von Daaron (Restful API etc). Ach und vergiss nicht, dass die getdata.php den Nutzer auch nochmal prüft (Session ID etc).
 
Erstmal danke für eure Anregungen.

Ich hatte auch vor für die ganze Ajax Geschichte jquery zu nutzen. Für den Datenaustausch zwischen Client und Server wollte ich dann JSON nehmen.

Da habe ich aber nochmal ein paar Fragen. Ohne Ajax hätte ich ja eine PHP-Datei (nennen wir sich suchen.php) in der ein Formular eingebettet ist, und dort kann dann der User die Suche ausführen. Je nach eingabe führe ich dann einen SQL-Request an die Datenbank aus, die mir dann die 500 Ergebnisse zurückgibt. Diese würde ich dann mittels php in die Divs einbinden.

Wenn ich ajax nutzen möchte, lagere ich die SQL-Abfrage zur Datenbank in eine andere PHP-Datei aus (z.B. getdata.php). Doch wie geht es dann weiter?
So stelle ich mir die Funktionalität mit ajax vor:
(Bitte korrigiert mich wenn ich falsch liege.)

1. Die Formulardaten würde ich mit ajax an die getdata.php schicken. Diese führt dann den SQL-Request an die Datenbank aus. Jetzt kann ich die Ergebnisse dieses Requests mit JSON zurück an die suchen.php senden und dann dort in die DIV's einsetzen.

Nehmen wir an ich habe 500 Ergebnisse und will immer 20 anzeigen lassen. Jetzt würde ich mit php 25 Links erzeugen die mir dann die 500 Ergebnisse anzeigen.
(in einer Linkleiste z.B. [<<][<][1][2][3][4][5][..][25][>][>>])

Doch ich müsste ja vorher eine Anfrage stellen wieviele Ergebnisse gefunden wurden um dann die richtige Anzahl an Links zu generieren. Stelle ich dann eine Anfrage mit ajax an die getdata.php wieviele Ergebnisse gefunden wurden?

Wie teile ich dann die Ergebisse auf? Ich müsste ja quasi eine Ajax-Anfrage aus der Datei suchen.php an die getdata.php machen -> Schick mir bitte die Ergebnisse 0-20. Wenn der User dann auf den Link [2] klickt, sende ich wieder eine Ajax-Anfrage schick mir die Ergebnisse 21-40. Wenn der User auf Link [3] klickt sende mir Ergebnisse 41-60 usw.

Doch dann würde ich doch jedesmal einen neuen SQL-Request an die Datenbank auslösen der wieder die 500 Ergebnisse ermitttelt? Oder kann ich das irgendwie bewerkstelligen, dass ich nur einmal einen SQL-Request ausführe?
 
Als Prinzipiell musst du schon jedes Mal die Datenbank abfragen. Das müsstest du aber auch, wenn es keine AJAX-Seite wäre. Ich würde dann eine feste Anzahl von Einträgen wählen, wie du ja schon vorgeschlagen hast ( 20 ) und dann die SQL Abfrage immer per "LIMIT STARTWERT,20" begrenzen. Dann machst du halt noch eine zweite Abfrage um die Gesamtzahl der Einträge zu ermitteln und packst die Zahl direkt mit in deine JSON Struktur. Auf dem Client baust du aus den Daten deine Divs auf und aus der Zahl die Seitennavigation.
Andere Möglichkeit: Die Divs und die Navigationslinks schon komplett auf dem Server zusammenbauen und auf dem Client nur noch anzeigen.

Die Links für die Seitennavigation müssten in etwa so aufgebaut sein:

<a href="javascript:getData(3)">Zu Seite 3</a>

und in deiner Funktion nimmst du den Parameter und sendest ihn als Teil des Requests zum Server. Irgendwo musst du den Wert dann noch um 1 verringern und mit 20 multiplizieren (Entweder noch auf dem Client oder auf dem Server). Dann kannst du den Wert als STARTWERT für die SQL-Anfrage verwenden.

Code:
function getData(page){
   page = typeof page !== 'undefined' ? page : 1;  //Falls page nicht gesetzt ist, davon ausgehen, dass Seite 1 geladen werden soll
   var start = (page - 1) * 20;
   $.ajax({
     url: "ajax/getdata.php",
     data: "start=" + start,   
     cache: false
     }).done(function( html ) {
        $("#content").html(html);
     });
}
 
technik_toni schrieb:
Nehmen wir an ich habe 500 Ergebnisse und will immer 20 anzeigen lassen. Jetzt würde ich mit php 25 Links erzeugen die mir dann die 500 Ergebnisse anzeigen.
(in einer Linkleiste z.B. [<<][<][1][2][3][4][5][..][25][>][>>])

Sowas nennt man übrigens eine Pagination.
 
Ok vielen Dank erstmal für euer Hilfe.

Ist zwar ein bischen doof das ich dann quasi jedesmal eine Datenbankabfrage machen muss aber ok.
Ich werde das ganze mal ausprobieren und wenn ich noch Fragen habe melde ich mich nochmal.

Gruß technik_toni
 
Du musst nicht unbedingt jedesmal eine SQL-Abfrage starten. Je nach Verwendbarkeit ist der Einsatz von Caching-Mechanismen, wie APC oder Memcache, in Betracht zu ziehen. Zumal APC oder Memcache nicht nur Bytecode-Caches für PHP Scripte bieten, sondern auch "User-Cache".
 
...nur, dass APC bei Shared Hostern nicht läuft, die verwenden üblicherweise suPHP oder mpm_itk. In beiden Fällen gibts keine persistenten Prozesse. Das spart dem Hoster ne ganze Stange Speicher und erhöht die Sicherheit enorm. Nachteil is halt, dass keinerlei Persistenz gibt, weder für MYSQLi-Verbindungen noch für Bytecode-Caches wie APC.

Jedes Mal eine Datenbank-Abfrage zu machen ist performanter. Bei 200 Datensätzen kann man vielleicht alle 200 laden und nur die interessanten 20 anzeigen. Bei 20.000 Einträgen hätte man dann aber einen monströsen Speicher-Overhead und entsprechende Performance-Einbußen. Außerdem reißt einem der Hoster den Kopf ab.
 
Zurück
Oben