select count php ajax

frenkytribe

Utente Attivo
17 Gen 2013
87
0
0
Ciao a tutti,
premetto che ajax l'ho cominciato a studiare da pochissimo e non ci capisco ancora molto, quello che chiedo è un esempio di stampa in real-time.

Ho un db mysql e una tabella con i seguenti campi: id, msg, data, letto. (letto verifica se il msg è stato letto o no 0/1)

la query sarà "SELECT count(*) AS tot_msg FROM tabella WHERE letto=0 ORDER BY data DESC"

qualcuno potrebbe farmi un esempio su come stampare il numero totale di messaggi non letti dentro un div?
 
P.S. L'order by non c'entra niente mi sono sbagliato, comunque io ho provato una cosa del genere, ma non funziona in real-time, devo ricaricare per forza la pagina.

index.php
Codice:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>titolo</title>
<script type="text/javascript">
var myRequest = null;
var the_box = null;

function CreateXmlHttpReq(handler) {
 	var xmlhttp = null;
	try {
    	xmlhttp = new XMLHttpRequest();
  	}catch(e){
    try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  xmlhttp.onreadystatechange = handler;
  return xmlhttp;
}

function aggiornamento() {
	e = document.getElementById(the_box);
    if (myRequest.readyState == 4 && myRequest.status == 200) {
        e.innerHTML = myRequest.responseText;
    }
}

function prova(url,id_box) {
	the_box = id_box;
	 var r = Math.random();
	if(url.indexOf("?")==-1)
		url = url + "?rand="+escape(r);
	else
		url = url + "&rand="+escape(r);
   
    myRequest = CreateXmlHttpReq(aggiornamento);
    myRequest.open("GET",url);
    myRequest.send(null);
}
</script>
</head>
<body>
<div id="box"></div>
<script type="text/javascript">prova('query.php','box');</script>
</body>
</html>

query.php
PHP:
<?php
require 'files/config.php';
$res=mysql_query("SELECT count(id) as tot_msg FROM tabella WHERE letto=0");
$result = mysql_fetch_array($res);
$tot=$result['tot_msg'];
						
echo $tot;
?>
 
Ultima modifica:
Ciao, puoi utilizzare la funzione setInterval() per richiamare la funzione ogni tot secodni
Codice:
setInterval(function(){
     prova('query.php','box');
},1000); // ogni secondo
 
Di nulla, calcola però che in questo modo, finchè la pagina è aperta, esegui una query sul database ogni secondo e se gli utenti che hanno aperto la stessa pagina sono 50 eseguirai 50 query ogni secondo, stressando notevolmente il database.
calcola se ne vale la pena
 
Io lo farei aggiornare solo al bisogno con un immagine o un button
HTML:
<input type="button" onclick="prova('query.php','box');" value="aggiorna"/>
edit:
50 query al secondo cmq non sono molte per un database relazionale, dovresti calcolarti quanti utenti e per quanto tempo accedono a quella pagina
 
Ultima modifica:
Beh ti spiego, il codice che avevo scritto era solo un esempio, in realtà quello che sto cercando di fare è un'icona posta in alto (in qualsiasi pagina del sito, tramite un include) che segnala se ci sono notifiche, quindi sarà visibile appunto su ogni pagina.
Ad esempio su Fb le notifiche appaiono subito senza ricaricare pagina, ci saranno milioni di utenti connessi contemporaneamente su Fb, vengono eseguite milioni di query al secondo? Non credo..
Cosa potrei fare?
 
vengono eseguite milioni di query al secondo?
credo proprio di si
metti 10 secondi e indicizza bene la tabella, non dovresti avere problemi
 
Grazie mille, per quanto riguarda l'indicizzazione della tabella io ho: id(int) , destinatario(varchar 50), msg(varchar 150) e data(timestamp). (letto sto pensando di eliminarlo perché se leggono le notifiche le elimino dal db direttamente)

Dato che si tratta di piccole cifre mi basta usare INDEX?
 
Visto che la query va a contare gli'id
Codice:
SELECT count(id) as tot_msg
metti un indice sul campo id, risparmi un bel po di microsecondi ( ho appena provato )
mi pare che la sintassi sia questa
Codice:
ALTER TABLE tabella ADD INDEX ( campo )
altrime in phpmyadmin c'è l'icona per aggiungere un indice
 
Facebook credo che abbia un altro metodo che è molto più efficace in quei casi.
Non l'ho mai testato ma so che esiste; si basa sul design pattern MVC:
Di solito è il controller che va a prendere i dati dal model e li da in pasto alla view dopo delle modifiche ma in alcuni casi (come ad esempio nel caso dell'Observer) viene sfruttato il legame lasco che va dal model alla view che invia ad essa una notifica che indica un cambiamento nel model stesso e quindi la view si attiva (con l'aiuto del controller) a visualizzare il dato aggiornato.
Tutto questo è riassunto da quest'immagine che descrive il design pattern MVC:
pattern-mvc-fig2.gif
 

Discussioni simili