Nell’articolo di ieri abbiamo partalo di come creare una tabella per permette ai nosti utenti di scambiarsi messaggi privati. Oggi ci occuperemo del codice vero e proprio per la gestione di questo sistema, pubblicherò e commenterò soltanto le funzioni che ho u io
Fatta questa breve introduzione all’articolo precedente, passiamo subito al codice php che dobbiamo usare per far inviare il messaggio, (io al momento ho usato il semplice php, ma si puo implementare anche con l’ajax).
Il prima funzione che presento serve per memorizzare il messaggio nella tabella
[php]
function save_message($id_sender,$id_receiver,$message)
{
$ip=$_SERVER['REMOTE_ADDR'];
$query = "INSERT INTO messaggi (‘id_sender’,'id_recevier’,'messaggio’,'ip’)
values (‘$id_sender’,'$id_recevier’,'$message’,'$ip’)";
$result = mysql_query( $query ) or die ("query errata");
if ($result) {
return 1; //messaggio salvato nel database
}else{
return 0; //messaggio non salvato nel database
}
}
[/php]
La funzione richiede come parametri l’id dell’utente che invia il messaggio, l’id dell’utente che riceve il messaggio, ed il messaggio vero e proprio. Semplicemente la funzione esegue una query, inserendo nel database il messaggio con tutti i campi richiesti, per usare tale funzione bisogna inserire in un qualsiasi punto della pagina la seguente riga.
[php]
save_message($mittente,$destinatario,$messaggio);
[/php]
Ovviamente le varibili al suo interno devo contenere i dati richiesti, altrimenti il messaggio verà salvato ma non nel modo corretto.
Seconda ed ultima funzione necessaria per una gestione semplice dei messaggi è quella per leggere ed elencare tutti i messaggi ricevuti da un utente.
Io ho usato la seguente funzione
[php]
function read_message($id_receiver)
{
$query = "SELECT id_sender,messaggio FROM messaggi WHERE id_receiver=’$id_receiver’";
$result = mysql_query( $query ) or die ("query errata");
if (!$result){
echo "L’utente: ".$id_receiver." non ha nessun messaggio\n";
}else{
$nummex = mysql_num_fields($result);
if ($nummex>1)
{
echo "L’utente: ".$id_receiver." ha ricevuto i seguenti messaggi";
}else{
echo "L’utente: ".$id_receiver." ha ricevuto il seguente messagge";
}
echo "<table border=\"1\"><tr><td>Mittente</td><td>Messaggio</td></tr>";
while ($row = mysql_fetch_row($result))
{
echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";
}
echo "</table>";
}
}
[/php]
Come prima per usare tale funzione dobbiamo inserire la seguente riga di codice in un punto qualsiasi della nostra pagina
[php]
read_message($utente);
[/php]
La variabile utente indica l’id dell’utente, o meglio l’id da cercare nel campo dei destinatari, se la query è vuota allora dice che l’utente non ha ricevuto nessun messaggio nel caso contrario elenca tutti i messaggi ricevuti dall’utente indicato. Natuarlamente la funzione come tutto il sistema puo essere migliorato aggiungengo qualche piccolo accorgimento..
La prima piccola guida di php e mysql termina qua.
se hai qualche consiglio, qualche suggerimento, un dubbio, o vuoi semplicemente ringranziare, usa i commenti..

Ciao Vincenzo
hai dimenticato di utilizzare in modo corretto gli indici sulla tabella.
Con 1000 utenti e un 1000000 messaggi privati i tempi si allungheranno a dismisura se non provvedi
Non avevo pensato a questo dettaglio..
come mi suggerisci di aggire tu?..
Ciao,
la creazione degli indici dipende da come saranno strutturate le query e dal tipo di engine delle tabelle.
Se non prevedi ricerche fulltext nei campi di testo, potresti utilizzare l’ innodb che ti permette di avere un sostanziale incremento delle prestazioni. Per quanto riguarda gli indici in se, questa quida (http://database.html.it/guide/lezione/2447/indici/) è un ottimo punto di partenza. Di base, dovrai creare un indice per ogni query che andrai ad effettuare, racchiudendo nello stesso i campi utilizzati come discriminanti per recuperare i dati. Nell’esempio in pagina, un indice sul campo ‘id_receiver’ già aiuterebbe
Vado a vedere la pagina..
e provvedo con le modifiche..
Che utilità ci sarebbe nel salvare anche l’indirizzo IP? Nell’altro articol ospieghi che serve per tutelarsi da utilizzo improprio del servizio..ma se il mio utente si connette da più postazioni?!
Ottimo lavoro comunque
Memorizzare l’ip serve a chi controlla il servizio se per esempio l’utente x offende l’utente y o comunque fa attività di spam io ho memorizzato l’indirizzo ip nel database in tal modo posso passare queste informazioni messaggio inviato, indirizzo ip alle forze dell’ordine competenti in questo caso alla polizia postale, che provvederà di conseguenza..
come scritto nell’altro articolo è un modo per tutelare il tuo lavoro ed il tuo sito..
Non ci avevo pensato!! Effettivamente è un’ottima cosa
davvero un bel lavoro semplice ma efficace
dobbiamo moltiplicare gli interventi sul php e mysql xò
A breve pubblicherò altre “guide” ed algoritmi per il php..
Salve,
allora innanzitutto premetto che il codice è altamente inutile.
Se devi fare una guida per principianti, falla completa.
Errori commessi:
1° Ti sei limitato a scrivere delle query che sanno scrivere anche i bambini di 3 anni;
2° Il vero sistema dei messaggi è nel far riconoscere $mittente = (a cosa?) $destinatario = (a cosa?) $messaggio = (a cosa?)…
3° La soluzione non è tanto semplice come tu hai supposto, perchè un sistema di messagistica richieste anche una registrazione e un login. Se effettuato con successo il login bisognerebbe richiamarlo da un altro foglio.php come campo “$mittente” se no come fa a riconoscere chi sta spedendo il messaggio…
4° Anche per leggere i messaggi hai omesso la parte piu importante ovvero:
Messaggio:
Titolo:
Mittente eccetera…
voto 4/10
Io ho presentato il sistema (funzioni necessarie) per realizzare un sistema di messaggistica degli utenti, e non quello per gestire la registrazione ed il login degli utenti (argomento di un altro articolo), se guardi per bene nel sito lo trovi! quindi usando un po di logica ed inventiva puoi realizzare quello che dici semplicemente copiando!
una casella di messaggi fatta bene è complessa.
ecco il codice che ho creato in poche ore sta mattina…
Nickname destinatario:
Oggetto:
Messaggio:
<?
// attraverso un if controlliamo che il form sia stato inviato
if ( $_GET['messagesend'] == "ok" ) {
// recuperiamo i dati inviati con il form
$H = date('H');
$i = date('i');
$s = date('s');
$m = date('m');
$d = date('d');
$Y = date('Y');
$j = date('j');
$n = date('n');
$today = $d;
$month = $m;
$year = $Y;
$date_normal = date('d-m-Y',mktime($m,$d,$Y));
$date_reversed = date('Y-m-d', mktime($m,$d,$y));
$date_full = date('d-m-Y H:i:s',mktime($H,$i,$s,$m,$d,$Y));
$date_time = date('H:i:s',mktime($H,$i,$s));
$date_hc = "".$j."-".$n."-".$Y."";
$ip = $_SERVER['REMOTE_ADDR'];
$name_recevier = $_POST['destinatario'];
$oggetto = $_POST['oggetto'];
$message = $_POST['messaggio'];
// controllo se il destinatario è stato compilato
if ( $name_recevier == TRUE ) {
// controllo se l oggetto è stato compilato
if ( $oggetto == TRUE ) {
// controllo se il messaggio è stato compilato
if ( $message == TRUE) {
// controllo se il destinatario esiste
$sql = mysql_query("SELECT * FROM users WHERE username = '$name_recevier'") or die ("Destinatario inesistente");
$num_rows = mysql_num_rows($sql);
if ( $num_rows == 1 ) {
mysql_query("INSERT INTO messaggi
(name_sender , name_recevier , oggetto , messaggio , data , ip_mittente )
VALUES
('$nome_utente' , '$name_recevier' , '$oggetto' , '$message' , '".$date_full."' , '$ip' )") OR DIE(mysql_error());
// messaggio di riuscita invio messaggio
echo "Messaggio inviato con successo.";
} else {
echo "Destinatario inesistente!";
}
} else {
echo "Il campo di testo del messaggio è vuoto!";
}
} else {
echo "Inserisci l'oggetto del messaggio!";
}
} else {
echo "Inserisci il destinatario a cui inviare il messaggio!";
}
}
come puoi vedere è completo ed esauriente anche di errori, data, ip e tutto quello che serve.
(Ovviamente per chi utilizza il mio codice dovrà includere il file di connessione al database, e alcune variabili che ho richiamato da altri file)
Molto più elementare del mio, però è una soluzione scomoda in quanto devi inserire in ogni pagina il codice per far inviare il messaggio con la mia soluzione “chiami” la funziona di inserimento o di lettura dei messaggi e fai tutto.. riduci il codice ed è più pulito
xd
la parte Input l’ha omessa inviando questo messaggio ma tutta via è semplice…
Dato che io sono ancora alle prime fasi con il PHP…
Potresti indicarmi come impostare la pagina per leggere i messaggi?
E che variabili devo mettere sotto
read_message($utente);
??
Cioè in teoria io dovrei fare
Oggetto: Interlocutore: Data:
prova prova prova
Allora tu hai la funzione read_message($utente) dove $utente indica l’id dell’utente, tale funzione non fa altro che leggere tutti i messaggi inviati all’utente con id $utente e creare (mostrandola dove chiamata) una tabella con i dati ottentuti.. puoi notare le funzioni “echo” dentro la funzione
[php]
function read_message($id_receiver)
{
$query = "SELECT id_sender,messaggio FROM messaggi WHERE id_receiver=’$id_receiver’";
$result = mysql_query( $query ) or die ("query errata");
if (!$result){
echo "L’utente: ".$id_receiver." non ha nessun messaggion";
}else{
$nummex = mysql_num_fields($result);
if ($nummex>1)
{
echo "L’utente: ".$id_receiver." ha ricevuto i seguenti messaggi";
}else{
echo "L’utente: ".$id_receiver." ha ricevuto il seguente messagge";
}
echo "<table border="1"><tr><td>Mittente</td><td>Messaggio</td></tr>";
while ($row = mysql_fetch_row($result))
{
echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";
}
echo "</table>";
}
}
[/php]
Ovviamente questa funzione potrebbe essere migliorata!
si ma ho gia provato e nn genera le tabelle per leggere i messaggi…
ovvero rimane solo:
Mittente, Messaggio…
per caso devo inserire qualche variabile $utente?
cioè mettere nella funzione: $utente = $id_receiver;
?
Grazie per le risposte!
Giuseppe, guarda bene le due funzioni.
quando salvi un messaggio sul database, usi questa funzione:
save_message($id_sender,$id_receiver,$message)
e per leggere i messaggi che un qualsiasi utente ha ricevuto invochi l’altra funzione:
read_message($id_receiver)
Quindi se come prima cosa salvi un messaggio “Ciao” da utente 1 a utente 2, risulterà che l’utente 2 ha ricevuto un messaggio, che puoi leggere specificando l’id dell’utente come attributo della funzione read_message($id_receiver)…
Consiglio: quando eseguite una query con mysql_query($query) è sempre meglio metterla in questa forma:
mysql_query($query) or die(mysql_query().’ – ‘.$query);
in modo tale che se qualcosa va storto, ti viene riportato l’errore, e anche la query che l’ha generato.
[code]function read_message($nome_utente)
{
$query = "SELECT name_sender,messaggio FROM messaggi WHERE name_recevier='$nome_utente'";
$result = mysql_query( $query ) or die ("query errata");
if (!$result){
echo "L'utente: ".$nome_utente." non ha nessun messaggio\n";
}else{
echo "<table border=\"1\"><tr><td>Mittente</td><td>Messaggio</td></tr>";
while ($row = mysql_fetch_row($result))
{
echo "<tr><td>".$row[0]."</td><td>".$row[1]."</td></tr>";
}
echo "</table>";
}
}[/code]
Non so dov’è l’errore ma nn appaiono i messaggi…
sei sicuro che sia name_recevier e non name_receiver qui: “$query = “SELECT name_sender,messaggio FROM messaggi WHERE name_recevier=’$nome_utente’”;”
Comunque per tagliare la testa al toro, inserisci manualmente nel tuo DB dei record (con nome destinatario “pippo”), e poi esegui la query direttamente da phpmyadmin
SELECT * FROM messaggi WHERE name_recevier=’pippo’;
Comunque metti così nel tuo codice:
mysql_query( $query ) or die (“Errore: “.mysql_error().” – Sulla query: “.$query);
e riportaci l’errore che ne esce.
Si la tabella si chiama name_recevier
Comunque ho provato ad eseguire la query SELECT * FROM messaggi WHERE name_recevier=’pippo’; e va correttamente infatti mi risulta la tabella che ho inserito con il nome Pippo.
Però non esce sul sito ç_ç
http://shopgame.altervista.org/message_list.php
ç_ç soluzioni ?
funzionaaaaaaaaaaaaaaa!
Però mi servirebbe una maniera piu dinamica… tipo non si potrebbe fare un altro foglio .php che legge i messaggi? Esempio:
Clicco su messaggio 1 e si apre il foglio:
http://link/read_message?id=(id del messaggio)
In modo tale da leggere il messaggio in modo ordinato…
Si potrebbe fare?
Certo che si può fare
basta creare un’altra funzione che “chieda” al database i dettagli del messaggio con id uguale ad x
si sto provando ora ti so dire se ho errori
una domandina veloce:
devo fare 2 controlli sulla stessa riga… il formato è giusto cosi?
if ($verita ==”1″) AND if ($name_utente == $nome_utente);
oppure in altro modo?
grazie vincenzo !
Per fare due controlli contemporaneamente.. devi usare la seguente struttura
[php]
if ( (condizione1) && (condizione2) )
[/php]
grazie mille !
scusa mi da un errore:
Parse error: syntax error, unexpected T_ELSE in /membri/shopgame/read_message.php on line 54
…
Sulla linea 54 ci sta solo else… nn capisco!
Codice che ho creato:
[CODE]
<?php
// includiamo il file di connessione al database
include ("db_connect.php");
include ("check1.php");
include ("funzioni.php");
$id_messaggio = $_GET[id];
$name_utente = $_GET[utente];
$mittente = mysql_query("SELECT name_sender WHERE 'id_message' = '$id_messaggio' AND 'name_recevier' = '$name_utente' LIMIT 0 , 1 ");
$oggetto = mysql_query("SELECT oggetto WHERE 'id_message' = '$id_messaggio' AND 'name_recevier' = '$name_utente' LIMIT 0 , 1 ");
$messaggio = mysql_query("SELECT messaggio WHERE 'id_message' = '$id_messaggio' AND 'name_recevier' = '$name_utente' LIMIT 0 , 1 ");
$data = mysql_query("SELECT data WHERE 'id_message' = '$id_messaggio' AND 'name_recevier' = '$name_utente' LIMIT 0 , 1 ");
if(is_numeric($id_messaggio)){
$id_messaggio = $_GET[id];
}
else
{$id_messaggio = "1";}
if(is_numeric($name_utente)){
$name_utente = $_GET[utente];
}
else
{$name_utente = "1";}
$controllo_messaggio = mysql_query ("SELECT *
FROM `messaggi`
WHERE `id_message` = '$id_messaggio'
AND `name_recevier` = '$name_utente'
LIMIT 0 , 1 ");
$verita = mysql_num_rows($controllo_messaggio);
if ( ($verita =="1") && ($name_utente == $nome_utente) );
{
$aggiorno_messaggio = mysql_query ("UPDATE `messaggi` SET `status` = '1' WHERE `id` = '$id_messaggio' LIMIT 1") ;
Echo "
Mittente:
Oggetto:
Messaggio:
Data:
‘.$mittente.’
‘.$oggetto.’
‘.$messaggio.’
‘.$data.’
“;
}
else
{
echo “Errore!”;
}
?>
[/CODE]
Primo errore si scrivere “echo” e non “Echo”!
Poi questa implementazione non fa affatto bene!
[php]
$oggetto = mysql_query("SELECT oggetto WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
$messaggio = mysql_query("SELECT messaggio WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
$data = mysql_query("SELECT data WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
[/php]
Troppe chiamate al database lo appesantisci molto!.
scusa mi da un errore:
Parse error: syntax error, unexpected T_ELSE in /membri/shopgame/read_message.php on line 54
…
Sulla linea 54 ci sta solo else… nn capisco!
Codice che ho creato:
ho corretto “Echo” con “echo” ma l’errore sulla riga 54 che me lo indica su “else” rimane… come risolvo?…
Ho provato con questo link:
http://shopgame.altervista.org/read_message.php?id=15&utente=RuggeriExtreme
Aprendo il link che hai inserito a me non da nessun errore…
ho tolto l’else finale che risultava obsoleto nn so perchè ora va ma non visualizza il contenuto nelle tabelle come mai?
Vedi se ho fatto giusto:
[php]
<?php
include ("db_connect.php");
include ("check1.php");
session_start();
$user = mysql_query("SELECT *
FROM `users`
WHERE `username` =’$username’
AND `password` = ‘$pass’
LIMIT 0 , 1");
if ($autorizzato == "1"){
?>
<?
$id_messaggio = $_GET[id];
$name_utente = $_GET[utente];
$mittente = mysql_query("SELECT name_sender WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
$oggetto = mysql_query("SELECT oggetto WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
$messaggio = mysql_query("SELECT messaggio WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
$data = mysql_query("SELECT data WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
if(is_numeric($id_messaggio)){
$id_messaggio = $_GET[id];
}
else
{$id_messaggio = "1";}
if(is_numeric($name_utente)){
$name_utente = $_GET[utente];
}
else
{$name_utente = "1";}
$controllo_messaggio = mysql_query ("SELECT *
FROM `messaggi`
WHERE `id_message` = ‘$id_messaggio’
AND `name_recevier` = ‘$name_utente’
LIMIT 0 , 1 ");
$verita = mysql_num_rows($controllo_messaggio);
if ( ($verita =="1") && ($name_utente == $nome_utente) );
{
$aggiorno_messaggio = mysql_query ("UPDATE `messaggi` SET `status` = ’1′ WHERE `id_message` = ‘$id_messaggio’ LIMIT 1") ;
echo "<table border=\"1\">
<tr>
<td>Mittente:</td>
<td>Oggetto:</td>
<td>Messaggio:</td>
<td>Data:</td>
</tr>
<tr>
<td>$mittente</td>
<td>$oggetto</td>
<td>$messaggio</td>
<td>$data</td>
</tr>
</table>";
}
?>
<?
}
else
{
?>
errore
<?
}
?>
[/php]
puoi dirmi se questo pezzo è giusto?
[php]
if(is_numeric($name_utente)){
$name_utente = $_GET[utente];
}
else
{$name_utente = "1";}
[/php]
penso che sia sbagliato perchè alla fine non è numerico ma è il nome del destinatario…
ovvero:
http://link/read_message.php?id=id messaggio(numerico)&utente=nome destinatario(che non è numerico)
Come fai ad analizzare una variabile vuota?.. $name_utente l’hai usata in precedenza? o l’ha messa li cosi?
ho visto che stai provando anche tu..
comunque lo status come da variabile viene settato da ’0′ a ’1′ correttamente nel database…
però non spuntano i valori nelle varie tabelle del link…
è strano come mai?
ho corretto le variabili mancava FROM messaggi
comunque ancora nn si vede compare un messaggio di errore… (Resource id #1) comunque
$name_utente se leggi all’inizio corrisponde al get:
http://link/id=id_messaggio&utente=name_utente
Comunque mi dici come richiamare adesso nelle tabelle…
Contattami su skype, cosi vediamo di realizzare qualcosa di personlizzato
nome skype: RuggeriExtreme
se nn vuoi aggiungermi dammi tuo nome che ti aggiungo io
Ti ho aggiunto!
Conosci qualche metodo per farmi arrivare la notifica? perchè non è arrivata… se no dammi il contatto che ti aggiungo io
[php]
<?php
include ("db_connect.php");
include ("check1.php");
session_start();
$user = mysql_query("SELECT *
FROM `users`
WHERE `username` =’$username’
AND `password` = ‘$pass’
LIMIT 0 , 1");
if ($autorizzato == "1"){
?>
<?
$id_messaggio = $_GET[id];
$name_utente = $_GET[utente];
$mittente = mysql_query("SELECT name_sender FROM messaggi WHERE `id_message` = ‘$id_messaggio’ AND `name_recevier` = ‘$name_utente’ LIMIT 0 , 1 ");
$oggetto = mysql_query("SELECT oggetto FROM messaggi WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
$messaggio = mysql_query("SELECT messaggio FROM messaggi WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
$data = mysql_query("SELECT data FROM messaggi WHERE ‘id_message’ = ‘$id_messaggio’ AND ‘name_recevier’ = ‘$name_utente’ LIMIT 0 , 1 ");
if(is_numeric($id_messaggio)){
$id_messaggio = $_GET[id];
}
else
{$id_messaggio = "1";}
if(is_numeric($name_utente)){
$name_utente = $_GET[utente];
}
else
{$name_utente = "1";}
$controllo_messaggio = mysql_query ("SELECT *
FROM `messaggi`
WHERE `id_message` = ‘$id_messaggio’
AND `name_recevier` = ‘$name_utente’
LIMIT 0 , 1 ");
$verita = mysql_num_rows($controllo_messaggio);
if ( ($verita =="1") && ($name_utente == $nome_utente) );
{
$aggiorno_messaggio = mysql_query ("UPDATE `messaggi` SET `status` = ’1′ WHERE `id_message` = ‘$id_messaggio’ LIMIT 1") ;
echo "<table border=\"1\">
<tr>
<td>Mittente:</td>
<td>Oggetto:</td>
<td>Messaggio:</td>
<td>Data:</td>
</tr>
<tr>
<td>$mittente</td>
<td>$oggetto</td>
<td>$messaggio</td>
<td>$data</td>
</tr>
</table>";
}
?>
<?
}
else
{
?>
errore
<?
}
?>[/php]
Nelle tabelle al posto di comparire i dati come dovrebbe compare:Resource id #10
Eppure è tutto corretto dove sbaglio…
Tutti gli $_GET sono sbagliati…mancano gli apici dentro le quadre… deve essere così $_GET['utente']
All’inizio dentro al primo if chiudi e apri il php
if (…) {
?> <?
…
}
e non è bello!
apri e chiudi il php a caso….
il copia e incolla non fa decisamente per te Giuseppe XD
Comunque per mettere il tuo codice, usa http://www.pastebin.com
Yuri nn faccio copia incolla guarda… siccome sono alle basi col php mi hanno detto di sostituire gli echo chiudendo ed aprendo il php…
Caso mai poi gli do una pulita l’importante è che funzioni!
ho inserito gli apici nei $_GET ma il problema nn è quello… infatti rimane lo stesso problema di prima!