Messaggistica interna

surapazzo

Utente Attivo
10 Dic 2013
63
0
0
Ciao a tutti volevo chiedere una mano e qualche chiarimento su una messaggistica interna in un sito...
Leggendo un po' in giro l'ho pensata cosi..
-Faccio una tabella con data e ora (che non ho ancora ben capito come mettere) contenuto, mittente e destinatario...
-Quando leggo cerco se c'e un destinatario con il mio nome con una query usando una variabile che mi dice se il mex è già stato letto o no...
-Quando scrivo inserisco il mio messaggio con una query...
Mi sono dimenticato qualcosa a livello concettuale?
Mi servirebbe una mano con il codice qualcuno ha consigli?
Grazie in anticipo:o
 
A livello concettuale non ti sei dimenticato nulla.
Il mio consiglio è di partire dai concetti che hai sviluppato: procedi con ordine e prova a creare prima la paginetta che si occupa della lettura dei messaggi che hai ricevuto.

Non c'è un particolare esempio di codice da mostrarti, va semplicemente fatta una query e poi recuperati tutti i risultati con un ciclo.
Provaci e se non ti torna qualcosa posta il codice che sei riuscito a comporre ;)
 
A livello concettuale non ti sei dimenticato nulla.
Il mio consiglio è di partire dai concetti che hai sviluppato: procedi con ordine e prova a creare prima la paginetta che si occupa della lettura dei messaggi che hai ricevuto.

Non c'è un particolare esempio di codice da mostrarti, va semplicemente fatta una query e poi recuperati tutti i risultati con un ciclo.
Provaci e se non ti torna qualcosa posta il codice che sei riuscito a comporre ;)

Allora io ho impostato la query cosi:
PHP:
 public function mailbox($username)
 {
 	if($sql="SELECT * FROM mailbox WHERE destinat=$username ORDER BY data"){
 		$row = mysql_fetch_assoc($sql);
		
		
	}

Non so come impostare però la tabella dei record scaricati perchè non so come riempirla...
io volevo fare una tabella con i record presi dalla select come faccio a fare la tabella pero?
 
Partiamo dalla query.
Lo username è una stringa giusto ? Allora va contornato da apici e l'operatore corretto da usare non è l'uguale ma il LIKE

PHP:
public function mailbox($username)
 {
     if($sql="SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data"){
         $row = mysql_fetch_assoc($sql);
        
        
}

Ok, a questo punto il controllo che fai sulla creazione della query, questo:
PHP:
if($sql="SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data"){
è inutile, perché salvo errori di sintassi sarà sempre vero il controllo di un assegnazione il cui risultato è diverso da false.

Terzo punto la successione delle funzioni necessarie per la query.
Non puoi richiedere dati con mysql_fetch_assoc se non hai chiesto al server di caricare un recordset prima.

Ricorda che per eseguire una query di selezione i passaggi sono sempre 3:
  1. Definizione della query (SELECT campo FROM tabella)
  2. Richiesta al database ( mysql_query() )
  3. Recupero delle informazioni ( mysql_fetch_*() )
  4. Per buona norma ci sarebbe anche un quarto punto: pulizia delle risorse ( mysql_free_result() )

Sistemando il tuo codice verrebbe quindi qualcosa di questo tipo:
PHP:
public function mailbox($username)
{
    #> Realizzazione Query
    $sql = "SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data";
    $result = mysql_query($sql);

    #> Controllo Errori
    if (!$result)
        die('Errore Mysql: '. mysql_error());

    #> Recupero Informazioni
        
}

Ok, a questo punto abbiamo realizzato la query e abbiamo messo un controllo per verificare la presenza di eventuali errori, ci serve adesso recuperare i dati.
Nell'esempio ti mostro anche come formattarli in una tabella con html:

PHP:
public function mailbox($username)
{
    #> Realizzazione Query
    $sql = "SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data";
    $result = mysql_query($sql);

    #> Controllo Errori
    if (!$result)
        die('Errore Mysql: '. mysql_error());


    #> Formatto una tabella html
    echo '<table>';

    #> Recupero Informazioni
    while ($row = mysql_fetch_assoc($result)) {
    
        #> Formatto una nuova riga nella tabella
        echo '<tr>';
        
        echo '<td>', $row['autore'], '</td>';
        echo '<td>', $row['messaggio'], '</td>';

        echo '</tr>';
    }

    #> Chiudo la formattazione della tabella
    echo '</table>';

    #> Libero le risorse impiegate dalla query
    mysql_free_result($result);

}


Chiaramente, 'autore' e 'messaggio' li ho inventati io perché non conosco i campi della tua tabella sul database.
Come esempio è molto base, da qui penso che dovresti riuscire a integrarlo come meglio credi.

Ultima cosa, se hai possibilità ti consiglio di passare a mysqli.
 
Ultima modifica:
Partiamo dalla query.
Lo username è una stringa giusto ? Allora va contornato da apici e l'operatore corretto da usare non è l'uguale ma il LIKE

PHP:
public function mailbox($username)
 {
     if($sql="SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data"){
         $row = mysql_fetch_assoc($sql);
        
        
}

Ok, a questo punto il controllo che fai sulla creazione della query, questo:
PHP:
if($sql="SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data"){
è inutile, perché salvo errori di sintassi sarà sempre vero il controllo di un assegnazione il cui risultato è diverso da false.

Terzo punto la successione delle funzioni necessarie per la query.
Non puoi richiedere dati con mysql_fetch_assoc se non hai chiesto al server di caricare un recordset prima.

Ricorda che per eseguire una query di selezione i passaggi sono sempre 3:
  1. Definizione della query (SELECT campo FROM tabella)
  2. Richiesta al database ( mysql_query() )
  3. Recupero delle informazioni ( mysql_fetch_*() )
  4. Per buona norma ci sarebbe anche un quarto punto: pulizia delle risorse ( mysql_free_result() )

Sistemando il tuo codice verrebbe quindi qualcosa di questo tipo:
PHP:
public function mailbox($username)
{
    #> Realizzazione Query
    $sql = "SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data";
    $result = mysql_query($sql);

    #> Controllo Errori
    if (!$result)
        die('Errore Mysql: '. mysql_error());

    #> Recupero Informazioni
        
}

Ok, a questo punto abbiamo realizzato la query e abbiamo messo un controllo per verificare la presenza di eventuali errori, ci serve adesso recuperare i dati.
Nell'esempio ti mostro anche come formattarli in una tabella con html:

PHP:
public function mailbox($username)
{
    #> Realizzazione Query
    $sql = "SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data";
    $result = mysql_query($sql);

    #> Controllo Errori
    if (!$result)
        die('Errore Mysql: '. mysql_error());


    #> Formatto una tabella html
    echo '<table>';

    #> Recupero Informazioni
    while ($row = mysql_fetch_assoc($result)) {
    
        #> Formatto una nuova riga nella tabella
        echo '<tr>';
        
        echo '<td>', $row['autore'], '</td>';
        echo '<td>', $row['messaggio'], '</td>';

        echo '</tr>';
    }

    #> Chiudo la formattazione della tabella
    echo '</table>';

    #> Libero le risorse impiegate dalla query
    mysql_free_result($result);

}


Chiaramente, 'autore' e 'messaggio' li ho inventati io perché non conosco i campi della tua tabella sul database.
Come esempio è molto base, da qui penso che dovresti riuscire a integrarlo come meglio credi.

Ultima cosa, se hai possibilità ti consiglio di passare a mysqli.

PHP:
 $conn->mailbox($_POST["username"]);

Non la devo richiamare così?=)


Altra cosa l'ho dovuta fare obj orien
PHP:
public function mailbox($username)
{
    #> Realizzazione Query
    $sql = "SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data";
    $result = $this->con_>query($sql);

    #> Controllo Errori
    if (!$result)
        die('Errore Mysql: '. $this->mysql_error());


    #> Formatto una tabella html
    echo '<table>';

    #> Recupero Informazioni
    while ($row = $this->mysql_fetch_assoc($result)) {
    
        #> Formatto una nuova riga nella tabella
        echo '<tr>';
        
        echo '<td>', $row['sender'], '</td>';
        echo '<td>', $row['content'], '</td>';
		 echo '<td>', $row['data'], '</td>';

        echo '</tr>';
    }

    #> Chiudo la formattazione della tabella
    echo '</table>';

    #> Libero le risorse impiegate dalla query
    $this->mysql_free_result($result);

}
 
e mi manda questo erro
Codice:
Ti sei connesso al database S3654125 Notice: Undefined index: username in /chroot/home/S3654125/public_html/mail.php on line 14 Notice: Undefined property: mysqlClass::$con_ in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 121 Fatal error: Call to undefined function query() in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 121
 
Gli errori sono abbastanza chiari:
Notice: Undefined index: username in /chroot/home/S3654125/public_html/mail.php on line 14
Sta quasi certamente parlando di questo:
PHP:
$_POST["username"]

In post non arriva alcun dato via form indicato come "username".
Vista l'applicazione, a logica dovresti utilizzare infatti un valore di sessione.

Notice: Undefined property: mysqlClass::$con_ in /chroot/home/S3654125/public_html/functions/mysqldb.php
Qui si riferisce a questo:
PHP:
$this->con_

$this->con_ non esiste e tantomeno contiene un istanza della classe di database.
Una curiosità, mysqlClass cos'è ? E' la tua classe primaria di database o una classe che racchiude metodi che necessitano dell'uso del database ?
Perché se contiene entrambe le logiche, allora stai facendo un po di confusione a livello di sviluppo.

Fatal error: Call to undefined function query() in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 121
Chiaramente, non esistendo la proprietà con_ non può disporre di un metodo query(), di conseguenza ti cade in fatal error.
 
Gli errori sono abbastanza chiari:

Sta quasi certamente parlando di questo:
PHP:
$_POST["username"]

In post non arriva alcun dato via form indicato come "username".
Vista l'applicazione, a logica dovresti utilizzare infatti un valore di sessione.


Qui si riferisce a questo:
PHP:
$this->con_

$this->con_ non esiste e tantomeno contiene un istanza della classe di database.
Una curiosità, mysqlClass cos'è ? E' la tua classe primaria di database o una classe che racchiude metodi che necessitano dell'uso del database ?
Perché se contiene entrambe le logiche, allora stai facendo un po di confusione a livello di sviluppo.


Chiaramente, non esistendo la proprietà con_ non può disporre di un metodo query(), di conseguen
za ti cade in fatal error.



Allora mysqlClass è la classe dove ho racchiuso tutti i metodi...
Non riesco a capire come tirare via l'username dalla sessione con il post era un tentativo balordo=)
 
Gli errori sono abbastanza chiari:

Sta quasi certamente parlando di questo:
PHP:
$_POST["username"]

In post non arriva alcun dato via form indicato come "username".
Vista l'applicazione, a logica dovresti utilizzare infatti un valore di sessione.


Qui si riferisce a questo:
PHP:
$this->con_

$this->con_ non esiste e tantomeno contiene un istanza della classe di database.
Una curiosità, mysqlClass cos'è ? E' la tua classe primaria di database o una classe che racchiude metodi che necessitano dell'uso del database ?
Perché se contiene entrambe le logiche, allora stai facendo un po di confusione a livello di sviluppo.


Chiaramente, non esistendo la proprietà con_ non può disporre di un metodo query(), di conseguenza ti cade in fatal error.

PHP:
  $username=$_SESSION['username'];
   $conn = new mysqlClass; 
   $conn->connect(); 
   $title ="Benvenuto nella mail";
  
   $conn->mailbox($username);

Così l'assegnazione va bene non dovrebbe prendere l'username?
 
Ultima modifica:
e l'errore adesso è questo:

Ti sei connesso al database S3654125 Warning: mysql_query(): Access denied for user 'www-data'@'localhost' (using password: NO) in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 122 Warning: mysql_query(): A link to the server could not be established in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 122 Errore Mysql: Access denied for user 'www-data'@'localhost' (using password: NO)


Secondo me c'è un problema sulle funzioni di chiamata..
il codice è quello che mi hai postato all'inizio...
 
Si c'è un problema sulle funzioni di chiamata.

Warning: mysql_query(): Access denied for user ..

Questo problema qui deriva dal fatto che mysql_query non riesce a trovare il link già stabilito per la connessione al database, di conseguenza tenta di avviarne uno lui lanciando mysql_connect senza parametri e il successivo fallimento genera l'errore di classe E_WARNING che leggi.
 
Si c'è un problema sulle funzioni di chiamata.



Questo problema qui deriva dal fatto che mysql_query non riesce a trovare il link già stabilito per la connessione al database, di conseguenza tenta di avviarne uno lui lanciando mysql_connect senza parametri e il successivo fallimento genera l'errore di classe E_WARNING che leggi.

infatti nelle altre query l'avevo scritta in questa forma:

PHP:
		$result=$this->con->query($sql);

ora così mi pare prenda però mi da altri errori del tipo:
Codice:
Notice: Undefined index: username in /chroot/home/S3654125/public_html/mail.php on line 9 Ti sei connesso al database S3654125INBOX : Warning: mysql_fetch_assoc() expects parameter 1 to be resource, object given in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 132
Warning: mysql_free_result() expects parameter 1 to be resource, object given in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 148

Con un mail.php scritto così:

PHP:
session_start();

header("Content-type: text/html; charset=utf-8");
	
 include ("functions/mysqldb.php"); 
 
   $username=$_SESSION['username'];
   $conn = new mysqlClass; 
   $conn->connect(); 
   $title ="Benvenuto nella mail";
  echo "INBOX : ";
   $conn->mailbox($username);//Qua la chiamata non gli piace come mai???
   
  
$content="";
 
Ultima modifica:
Tutta la tua catena di problemi nasce dal fatto che
PHP:
$_SESSION['username']
non esiste.

A tal proposito ti conviene scrivere un controllo nella pagina:
PHP:
session_start();

header("Content-type: text/html; charset=utf-8");
    
 include ("functions/mysqldb.php"); 
 

   if (empty($_SESSION['username'])) {
      die('Non hai effettuato il login nel sito e non puoi pertanto usufruire di questa risorsa');
   }

   $username=$_SESSION['username'];
   $conn = new mysqlClass; 
   $conn->connect(); 
   $title ="Benvenuto nella mail";
  echo "INBOX : ";
   $conn->mailbox($username);//Qua la chiamata non gli piace come mai???
   
  
$content="";
 
Tutta la tua catena di problemi nasce dal fatto che
PHP:
$_SESSION['username']
non esiste.

A tal proposito ti conviene scrivere un controllo nella pagina:
PHP:
session_start();

header("Content-type: text/html; charset=utf-8");
    
 include ("functions/mysqldb.php"); 
 

   if (empty($_SESSION['username'])) {
      die('Non hai effettuato il login nel sito e non puoi pertanto usufruire di questa risorsa');
   }

   $username=$_SESSION['username'];
   $conn = new mysqlClass; 
   $conn->connect(); 
   $title ="Benvenuto nella mail";
  echo "INBOX : ";
   $conn->mailbox($username);//Qua la chiamata non gli piace come mai???
   
  
$content="";


Si ma il problema è che io il login lo faccio eppure non legge il valore come mai?
 
Posta lo script del login, ci deve essere qualche problema lì sicuramente.

PHP:
<?php

session_start();
	// funzioni php preparazioni variabili, connessioni al db ecc...
header("Content-type: text/html; charset=utf-8");
	

	
	include ("functions/mysqldb.php");
	
	$conn = new mysqlClass;
	$conn->connect();
	

	if($conn->checklogin($_POST["username"],$_POST["password"])){

		$_SESSION["loggedin"]=1;
		$title = "Congratulazioni!";
		$content = "sei loggato";
	}
	else {
		$title = "Errore!";
		$content = "errore nel login";
	}	
	
	
	
	// costruzione della pagina
	
	include ('layout/header.php');
	include ('layout/menu.php');
	include ('layout/content.php');
	include ('layout/footer.php');
	

?>

Sopra il codice della pagina....
Sotto la query:
PHP:
	    public function checklogin($username, $password){  
            // Nome utente e password inviate attraverso il form   
              
            // To protect MySQL injection (more detail about MySQL injection)   
        //    $password =$this->con->md5(mysql_real_escape_string($password));  
              
            $username = $this->con->real_escape_string($username);    
            $password = $this->con->real_escape_string($password);   
              
    $sql = "SELECT * FROM users WHERE USERNAME='$username' and PASSWORD='$password'";       
       
        #> Verifichiamo che la query effettivamente riesca   
      $result = $this->con->query($sql)  ;
            $count = $result->num_rows;   
             if ($count != ""){ 
            #> Ora che non ci serve più, liberiamo la memoria impiegata dalla risorsa.   
            $result->close();   
            return true;  
        }  
        else {   
            $count = 0;   
            echo "Errore Login";    
              
      return false;  
        }  

	
	}
 
Posta lo script del login, ci deve essere qualche problema lì sicuramente.



Inoltre ho messo dei valori di prova ma non prende le funzioni della query che mi hai postato come mai?
Ti metto l'errore sotto:

Codice:
Ti sei connesso al database S3654125Errore nell Invio Warning: mysql_fetch_assoc() expects parameter 1 to be resource, object given in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 132
Warning: mysql_free_result() expects parameter 1 to be resource, object given in /chroot/home/S3654125/public_html/functions/mysqldb.php on line 148
 
Infatti, non ti rilevava la sessione perché controllavi un valore che non utilizzavi!
Modifica così il tuo script:
PHP:
<?php

session_start();
	// funzioni php preparazioni variabili, connessioni al db ecc...
header("Content-type: text/html; charset=utf-8");
	

	
	include ("functions/mysqldb.php");
	
	$conn = new mysqlClass;
	$conn->connect();
	

	if($conn->checklogin($_POST["username"],$_POST["password"])){

		$_SESSION["loggedin"]=1;
		$_SESSION['username'] = $_POST["username"];
		$title = "Congratulazioni!";
		$content = "sei loggato";
	}
	else {
		$title = "Errore!";
		$content = "errore nel login";
	}	
	
	
	
	// costruzione della pagina
	
	include ('layout/header.php');
	include ('layout/menu.php');
	include ('layout/content.php');
	include ('layout/footer.php');
	

?>

L'errore che citi dice che non gli passi il riferimento di una connessione ma un oggetto, controlla bene la conversione all'object oriented che hai fatto su quel pezzo di codice ;)
Questi più che bug irrisolvibili sono semplici sviste, ti consiglierei di prenderti qualche minuto in più e rileggere bene quel che hai scritto fino ad ora.
 
Infatti, non ti rilevava la sessione perché controllavi un valore che non utilizzavi!
Modifica così il tuo script:
PHP:
<?php

session_start();
	// funzioni php preparazioni variabili, connessioni al db ecc...
header("Content-type: text/html; charset=utf-8");
	

	
	include ("functions/mysqldb.php");
	
	$conn = new mysqlClass;
	$conn->connect();
	

	if($conn->checklogin($_POST["username"],$_POST["password"])){

		$_SESSION["loggedin"]=1;
		$_SESSION['username'] = $_POST["username"];
		$title = "Congratulazioni!";
		$content = "sei loggato";
	}
	else {
		$title = "Errore!";
		$content = "errore nel login";
	}	
	
	
	
	// costruzione della pagina
	
	include ('layout/header.php');
	include ('layout/menu.php');
	include ('layout/content.php');
	include ('layout/footer.php');
	

?>

L'errore che citi dice che non gli passi il riferimento di una connessione ma un oggetto, controlla bene la conversione all'object oriented che hai fatto su quel pezzo di codice ;)
Questi più che bug irrisolvibili sono semplici sviste, ti consiglierei di prenderti qualche minuto in più e rileggere bene quel che hai scritto fino ad ora.

Mi sono completamente perso ho bisogno di una mano per rimettere a posto le idee....
Mi mancano i riferimenti giusti a gli oggetti ho bisogno di una mano...
La mia funzione è questa:

PHP:
public function mailbox($username)
{
    #> Realizzazione Query
    $sql = "SELECT * FROM mailbox WHERE destinat LIKE '$username' ORDER BY data";
		$result=$this->con->query($sql); 
    #> Controllo Errori
    if (!$result)
        die('Errore Mysql: '. $this->$result->mysql_error());


    #> Formatto una tabella html
    echo '<table>';

    #> Recupero Informazioni
    while ($row = mysql_fetch_assoc($result)) {
    
        #> Formatto una nuova riga nella tabella
        echo '<tr>';
        
        echo '<td>', $row['sender'], '</td>';
        echo '<td>', $row['content'], '</td>';
		 echo '<td>', $row['data'], '</td>';

        echo '</tr>';
    }

    #> Chiudo la formattazione della tabella
    echo '</table>';

    #> Libero le risorse impiegate dalla query
    $this->$result->mysql_free_result($result);

	}

Ho fatto un po' di prove con gli oggetti ma mi sono perso proprio quindi una visione esterna mi aiutera sicuramente a rimettere a posto le idee, resci ad aiutarmi?
Grazie mille
 
Il metodo query della tua classe ritorna l'istanza della classe in se e non il riferimento alla query che è stata svolta, dovresti fargli ritornare quest'ultimo invece.
 

Discussioni simili