Je bent een soort van verwarrende rollen: PHP draait serverside, het retourneert de gegevens die je aan de client toont, meestal volwaardige HTML die de browser direct laat zien, maar het kan ook alleen gegevens in verschillende formaten retourneren, zoals json of xml wanneer je het gebruikt als een provider voor RPC , wat een mooie manier is om een functie aan te roepen door middel van het php-bestandseindpunt en met het retourneren van de gegevens.
Als u wilt manipuleren hoe de client-side (meestal een webbrowser) samenwerkt met de gebruiker, moet u code schrijven die in die specifieke context wordt gebruikt. De uniforme manier om dit voor browsers te doen is door JavaScript .
Met JavaScript kun je je pagina (inter) actief maken op verschillende manieren, zoals elke X seconden een routine aanroepen, door setInterval .
var cMR;
function callMyResults(){
}
window.onload = function(){
cMR = setInterval('callMyResults',5000);
}
;
om uw code automatisch te laten oproepen wanneer de pagina is geladen, voegen we een functie toe aan de onLoad event handler, dit zal alles uitvoeren in de functie die eraan is toegewezen, in ons geval zal het een interval van 5000 milliseconden instellen waarop het de CallMyResults() functie elke keer zal uitvoeren. Het resultaat van setInterval wordt globaal in de cMR opgeslagen, zodat het later kan worden gebruikt om de code die op het interval wordt uitgevoerd, indien nodig te stoppen.
Dus op dit moment doet deze code niets. Javascript kan andere pagina's oproepen en zo gegevens ophalen met iets dat nu uniform wordt aangeduid als AJAX Oorspronkelijk was dit bedoeld om XML-documenten op te halen waarop u vervolgens hebt gereageerd (of gewoon schreef in het momenteel weergegeven document). Later is dit geëvolueerd naar het gebruik van json omdat dit een JavaScript-native element retourneert, waardoor het gemakkelijker te gebruiken is en over het algemeen kleiner in omvang is om via de netwerkverbinding over te dragen, wat de pagina's overzichtelijker maakt.
Er zijn veel bibliotheken om dit eenvoudig te doen, een van de meest populaire is jQuery , maar je kunt ook gewoon je eigen oproepen schrijven met het XMLHttpRequest -object (de basis van AJAX). U vindt hier tal van voorbeelden van op het web, zoals deze voor json-gegevens ophalen .
Over het algemeen wordt aanbevolen om een gevestigde bibliotheek te gebruiken, voor gebruiksgemak, uw eigen verstand en gewoon veel leukere en gemakkelijk toegankelijke codering.
Eindelijk aan de PHP-kant verzamel je gewoon je gegevens zoals gewoonlijk, maar je print het een beetje anders, ofwel als xml in je eigen gespecificeerde formaat of door het als json te retourneren met json_encode . Dat kan zo simpel zijn als het volgende:
<?php
$pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1',$user,$password);
$result = $pdo->query('SELECT * FROM msgs');
print json_encode($result->fetchAll());
Merk op dat ik PHP Data Objects (gewoonlijk aangeduid als BOB, heb gebruikt ) om toegang te krijgen tot de database, biedt dit een uniforme manier om databases te benaderen, voor het geval u ooit naar een ander RDBMS dan degene die je momenteel gebruikt (mysql). Het ding dat je in dat geval zou moeten aanpassen, zou de DSN-string zijn die je aan je PDO -object wanneer u het instantieert. Het andere grote voordeel van PDO is dat het u beschermt tegen SQL-injectie door methoden aan te bieden waarmee u eenvoudig kunt maken een voorbereide verklaring waarop u parameters die automatisch worden geciteerd (en dus beschermd); de mysql_ * functiefamilie wordt niet langer aanbevolen voor gebruik: gebruik PDO of gebruik mysqli.
Dus, om u een werkend voorbeeld te geven:
we hebben 1 clientpagina: display.html en 2 server side-pagina's voor het genereren en retourneren van de gegevens (fillList.php en retrieveList.php)
fillList.php
<?php
//we work with the following table
// create table list_data (`when` DATETIME NOT NULL);
//make sure to adapt these settings to yours, including username and password
$pdo = new PDO('mysql:dbname=scratch;host=localhost','username','password');
$pdo->exec('INSERT INTO list_data VALUES (NOW())');
hierdoor wordt een nieuwe waarde ingevoegd in de kolom when
van de tabel list_data
retrieveList.php
<?php
//make sure to adapt these settings to yours, including username and password
$pdo = new PDO('mysql:dbname=scratch;host=localhost','scratch','scratch');
print json_encode($pdo->query('SELECT `when` FROM list_data
ORDER BY `when` DESC'
)->fetchAll(PDO::FETCH_ASSOC)
);
haalt alle gevonden waarden in de tabel list_data geordend op in aflopende volgorde en retourneert de resulterende associatieve array als een json-object.
Ik heb besloten om u een voorbeeld van een clientpagina te laten zien met jQuery, zorg ervoor dat u de nieuwste jQuery-1.7 downloadt .2.js en plaats het in dezelfde map als dit bestand.
display.html
<html><head><title>Refreshing List</title>
<script src="http://localhost/jquery-1.7.2.js" />
</head>
<body>
this list refreshes every 5 seconds, a new value is inserted every 2 seconds
<script>
function fillList(){
//we insert a new value in the database by calling fillList.php
$.get("http://localhost/fillList.php");
}
function refreshList(){
/*
we retrieve the json encoded data returned by retrieveList.php
and process it in our anonymous function
*/
$.getJSON("http://localhost/retrieveList.php",function (data){
var items = [];
// loop through the returned array
$.each(data,function(key,val){
//we passed an associative array so we can use the columnname: 'when'
items.push("when: " + val['when'] + "");
});
//clear the list and append the data to it
$("#toRefresh").empty();
$("#toRefresh").append(items.join(''));
});
}
// jQuery uses .ready() instead of window.onload = function(){}
$(document).ready(function (){
//retrieve the data every 5 seconds
setInterval(function(){refreshList();},5000);
//insert additional new data every 2 seconds
setInterval(function(){fillList();},2000);
//we fill the list with its initial values
refreshList();
});
</script>
</body>
</html>
Zoals u kunt zien, biedt jQuery u een eenvoudige manier om deze bewerkingen uit te voeren. Voer de pagina display.html uit en u ziet een altijd groeiende en opfrissende lijst van MySQL-datum/tijd-waarden.