Servizio mail tra utenti

leon-kennedy

Utente Attivo
19 Mag 2010
147
0
0
Ciao,a tutti sto creando un servizio mailing tra gli utenti del mio sito e ho creato la tabella con i seguenti campi:
id
mittente
destinatario
testo
data_invio

Ho cominciato con il creare il form:
PHP:
<html> 
<head> 
<META NAME="GENERATOR" Content="AlterVista - Editor HTML"> 
<title>Invia un messaggio</title> 
</head> 
<body> 

<form method="post" action="invio_mail.php">  
<textarea name="testo" rows="5" cols="40"> 
</textarea> 
<input type="submit" class="button" value="Invia"> 
</form> 

</body></html>

La pagina invio_mail.php

PHP:
<?php 
//connessione al database 
include('connect.php'); 

//la sessione 
include('sessione.php'); 

//la data e l'ora dell'invio 
$data = date("Y-m-d  H:i:s"); 

//recuperiamo il testo del messaggio 
$testo = $_POST['testo']; 

//verifichiamo se un messaggio contiene 
if(!preg_match('/^[A-Za-z0-9]{10,250}$/',$testo)) 
    { 
    echo "Un messaggio deve contenere un minimo di 10 e un massimo 250 di caratteri!"; 
    exit; 
    }else{ 


//controlliamo che get sia definito 
if(isset($_GET['id'])){ 
     
$id = $_GET['id']; 
$team = $_SESSION['username']; 

$query_insert = mysql_query("INSERT INTO MESSAGGI 
(mittente, destinatario, testo, data_invio) 
VALUES 
('$team', '$id', '$testo', '$data')"); 
} 
} 
?>

Con il "get" recupero il nome della squadra a cui vogliamo inviare il messaggio...il problema è che mi restituisce sempre l'errore che un messaggio deve essere composto da almeno 10 caratteri...inoltre quali controlli posso effetuare sul testo?

Grazie per l'aiuto :)
 
Non sono un esperto di espressioni regolari, ma in quel modo l'utente non può inserire caratteri di punteggiatura, solo lettere e numeri... io ti consiglio di applicare la funzione htmlspecialchars e mysql_real_escape_string a TUTTI i campi, e poi controllare manualmente se il testo è tra i 10 e i 250 caratteri così:
PHP:
if(strlen($testo) < 10 || strlen($testo) > 250)
{
    // testo minore di 10 o maggiore di 250 caratteri
}
else
{
    // tutto ok
}

Un'ultima cosa: qualche anno fa creai un CMS che supportava la messaggistica interna. Sorse però un problema: praticamente se un utente, nella casella Posta in arrivo, cancellava il messaggio che gli era arrivato, questo veniva cancellato anche dalla casella Posta inviata del mittente, perché eliminavo il record del database.
Per risolvere ho aggiunto un campo folder che poteva essere inbox, outbox e trash (Posta in arrivo, Posta inviata e Cestino). Quando un utente inviava un messaggio creavo due copie perfettamente uguali del record, ma in una il campo folder era inbox e nell'altra il campo folder era outbox.
Quando un utente spostava il messaggio nel Cestino, invece, cambiavo il campo folder in trash. Poi, se eliminava i messaggi nel Cestino, allora cancellavo la sua copia dal database. Quella del mittente, però, continuava ad esistere!
 
Grazie ale per l'aiuto!Adesso appena posso tolgo l'espressione regolare e metto qualche funzione al testo.Dopodichè vedo di modificare la tabella nel database per evitare l'errore che hai citato sopra! ;)
 
Ciao guarda ho provato così,ma non funziona l'insert nelle tabelle:
PHP:
<?php
//connessione al database
include('connect.php');

//la sessione
include('sessione.php');

//la data e l'ora dell'invio
$data = date("Y-m-d  H:i:s");

//recuperiamo il testo del messaggio
$testo = $_POST['testo'];

//eliminiamo eventuali codici html,php o javascript presenti nel testo
strip_tags($testo);

//creiamo la funzione per filtrare i dati
function filtro_db($stringa) 
{ 
    $stringa = trim ($stringa); 
    if(empty($stringa)) 
    { 
    return FALSE; 
    } 
    else if(get_magic_quotes_gpc()) 
    { 
    stripslashes($stringa); 
    } 
    return mysql_real_escape_string($stringa); 
} 

$testo = filtro_db($_POST['testo']);

//inseriamo gli slash davanti ad eventuali caratteri
addslashes($testo);
//controlliamo che get sia definito
if(isset($_GET['id'])) {


//verifichiamo se un messaggio contiene troppi o pochi caratteri
if(strlen($testo) < 10 || strlen($testo) > 250)
    {
    header("location:errore_messaggio.php");
    exit;
    }else{

$id = $_GET['id'];
$team = $_SESSION['username'];

$query_insert = mysql_query("INSERT INTO MESSAGGI_inviati
(mittente, destinatario, testo, data_invio)
VALUES
('$team', '$id', '$testo', '$data')") or die (mysql_error());

$query_insert = mysql_query("INSERT INTO MESSAGGI_ricevuti
(mittente, destinatario, testo, data_invio)
VALUES
('$team', '$id', '$testo', '$data')") or die (mysql_error());
}
header("location:squadra.php?id={$id}");
}
?>
 
ma perché devi togliere l'espressione regolare? Hai:
PHP:
if(!preg_match('/^[A-Za-z0-9]{10,250}$/',$testo))
10 e il minimo 250 il massimo numero di caratteri, il valore te lo modifichi come vuoi, ad esempio:
PHP:
if(!preg_match('/^[A-Za-z0-9]{3,250}$/',$testo))
 
@Eliox: il problema non è la lunghezza del testo. L'espressione regolare sembra non funzionare proprio.
@leon-kennedy: In che senso non funziona? Restituisce qualche errore? Inoltre ti faccio notare che le funzioni addslashes e stripslashes non modificano i parametri ma restituiscono una stringa. Quindi devi usare:
PHP:
$testo = addslashes($testo);
E:
PHP:
$testo = stripslashes($testo);
 
Ale ho modificato per quanto riguarda addslashes...
Il problema è che mi restituisce una pagina bianca(perchè per il momento non rimando l'utente a nessuna pagina)però nel database le tabelle sono vuote!! :(
 
Certamente:
PHP:
<?php
//connessione al database
include('connect.php');

//la sessione
include('sessione.php');

//la data e l'ora dell'invio
$data = date("Y-m-d  H:i:s");

//recuperiamo il testo del messaggio
$testo = $_POST['testo'];

//eliminiamo eventuali codici html,php o javascript presenti nel testo
strip_tags($testo);

//creiamo la funzione per filtrare i dati
function filtro_db($stringa) 
{ 
    $stringa = trim ($stringa); 
    if(empty($stringa)) 
    { 
    return FALSE; 
    } 
    else if(get_magic_quotes_gpc()) 
    { 
    stripslashes($stringa); 
    } 
    return mysql_real_escape_string($stringa); 
} 

$testo = filtro_db($_POST['testo']);

//inseriamo gli slash davanti ad eventuali caratteri
$testo = addslashes($testo);
//controlliamo che get sia definito
if(isset($_GET['id'])) {


//verifichiamo se un messaggio contiene troppi o pochi caratteri
if(strlen($testo) < 10 || strlen($testo) > 250)
    {
    header("location:errore_messaggio.php");
    exit;
    }else{

$id = $_GET['id'];
$team = $_SESSION['username'];

$query_insert = mysql_query("INSERT INTO MESSAGGI_inviati
(mittente, destinatario, testo, data_invio)
VALUES
('$team', '$id', '$testo', '$data')") or die (mysql_error());

$query_insert = mysql_query("INSERT INTO MESSAGGI_ricevuti
(mittente, destinatario, testo, data_invio)
VALUES
('$team', '$id', '$testo', '$data')") or die (mysql_error());
}
header("location:squadra.php?id={$id}");
}
?>
 
Prova modificando in questo modo:
PHP:
<?php
function filter($var)
{
	$var = trim(strip_tags($var));
	
	if(!get_magic_quotes_gpc())
		$var = mysql_real_escape_string($var);
	
	return $var;
}

require 'connect.php';
require 'sessione.php';

$date = date('Y-m-d H:i:s');
$text = isset($_POST['testo']) ? filter($_POST['testo']) : '';
$id = isset($_GET['id']) ? filter($_GET['id']) : 0;

if($id)
{
	if(strlen($text) < 10 || strlen($text) > 250)
	{
		header('Location: errore_messaggio.php');
		exit();
	}

	$team = $_SESSION['username'];
	$tables = array('MESSAGGI_inviati', 'MESSAGGI_ricevuti');
	
	foreach($tables as $table)
	{
		$sql = "INSERT INTO {$table} (mittente, destinatario, testo, data_invio) VALUES ('{$team}', '{$id}', '{$text}', '{$date}')";
		mysql_query($sql) or die(mysql_error());
	}

	header("Location: squadra.php?id={$id}");
}
?>
Mi sorge però un dubbio... mi pare di capire che i campi mittente e destinatario siano destinati a contenere degli interi, giusto? Allora perché la variabile $team è uguale a $_SESSION['username'] che (secondo la logica) dovrebbe contenere lo username dell'utente (ossia una stringa)?
 
Ciao grazie adesso provo!
No,scusa perchè dovrebbero contenere degli interi?
$team è il nome della squadra che invia il messaggio
$id è il nome della squadra che lo riceve
 
Ho risolto!!!! :D
L'errore stava nella pagina dove c'è il form per mandare l'email dato che non recuperavo l'id per il get!

Grazie per l'aiuto ale!0:)


PS: scusa puoi consigliarmi un buon editor php gratis?
 
Ultima modifica:
Ah un'altra cosa ho messo anche queste righe per limitare il numero a 50 di messaggi sia ricevuti che inviati così:
PHP:
$sql = "UPDATE SQUADRA_messaggi SET ricevuti = ricevuti + 1 WHERE team = '{$id}' LIMIT 50";
    mysql_query($sql) or die(mysql_error());
    $sql = "UPDATE SQUADRA_messaggi SET inviati = inviati + 1 WHERE team = '{$team}' LIMIT 50";
    mysql_query($sql) or die(mysql_error());

L'incremento ho già verificato e funziona,per il limit invece non ho verificato,ma è corretto il modo in cui ho scritto?
 
Hai ragione Ale,ho modificato e adesso se l'utente ha troppi messaggi impedisco l'invio e mostro un messaggio! :)
Grazie Elliox per il programma! :D
 

Discussioni simili