Newsgroup: it.comp.www.php
Titolo: Classe PHP e connessione MySQLi già presente

Ciao a tutti,
ho scritto una piccola classe PHP per la gestione degli errori. Con errori 
non intendo gli errori di programmazione, ma errori nei risultati delle 
query a MySQL (ad es. mi attendo dei risultati che non trovo) oppure nello 
spedire delle email agli utenti ecc.
 
La classe è questa:
 
class Errore
{
    private $page;
    public $info="non sono stati indicati dettagli dell'errore";
    public $email=true;
    public $to="
m...@email.it
";
    public $subject="Segnalazione automatica errore";
    public $body;
    private $headers="From: 
m...@email.it
";
 
    public function __construct()
    {
        // devo aprire la connessione al db qui?
        $this->page=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
        $this->body="Ciao,\r\nil sistema di diagnostica automatico ha 
rilevato un errore:\r\n\r\n- pagina: ".$this->page."\r\n- info: ";
    }
 
    public function __destruct()
    {
        // chiudo la connessione al db? o no?!
    }
 
    public function salva()
    {
        require_once(realpath($_SERVER["DOCUMENT_ROOT"])."/inc/db_open.php"); 
// apro la connessione al db
        $query="INSERT INTO errori (pagina,info,email) VALUES 
('".$mysqli->real_escape_string($this->page)."','".$mysqli->real_escape_string($this->info)."','".(($this->email)?$this->to:'no')."')"; 
// salvo l'errore sul db
        $mysqli->query($query);
        if ( $mysqli->errno > 0 ) // errore nella connessione
        {
            print "An error occurred: " . $mysqli->error;
        }
 
        if ($mysqli->affected_rows!=1) // non sono riuscito a scrivere sul 
db, avviso il webmaster
        {
            mail($this->to,"Diagnostica errori: impossibile accedere a 
MySQL","Il sistema di diagnostica non e' riuscito a scrivere sul db l'errore 
rilevato sulla pagina ".$this->page.". Altre info: 
".$this->info,$this->headers);
        }
        else // ho scritto sul db
        {
            if ($this->email) // devo avvisare?
            {
                mail($this->to,$this->subject,$this->body.$this->info,$this->headers); 
// si, avviso!
            }
        }
        require_once(realpath($_SERVER["DOCUMENT_ROOT"])."/inc/db_close.php"); 
// chiudo la connessione
    }
}
 
In pratica, quando viene istanziata la classe, salvo l'errore sul db e se 
richiesto, mando anche un'email (ho sparso qui e là dei commenti). Per ogni 
errore posso gestire l'email, il destinatario, il subject ecc. Ad esempio:
 
$errore=new Errore();
$errore->info="OPS! Che imbarazzo... errore!!";
$errore->salva();
 
Adesso quando richiamo il metodo nomeOggetto->salva() apro e chiudo la 
connessione al db (sarebbe meglio metterli nel costruttore e nel 
distruttore? Ho provato ma dà comunque l'errore che vi scriverò tra poco).
BTW, la classe funziona se la richiamo in una pagina che non ha connessioni 
a MySQL. Se la pagina ha già connessioni a MySQL mi risponde:
 
Fatal error: Call to a member function real_escape_string() on a non-object 
in /inc/Errore.php on line 26
 
La linea 26 è la query:
 
$query="INSERT INTO errori (pagina,info,email) VALUES 
('".$mysqli->real_escape_string($this->page)."','".$mysqli->real_escape_string($this->info)."','".(($this->email)?$this->to:'no')."')";
 
Cosa sto sbagliando? Non riesco a venirne a capo :(
 
PS: la chiusura della connessione al db inserita nella classe potrebbe 
creare problemi se nella pagina ci sono altre chiamate a MySQL?
 
Grazie per aver letto la mia richiesta d'aiuto e soprattutto a chiunque 
abbia la soluzione :) 
 

to:'no')."')";
 
 
Tu credi che dopo la chiamata 
 
 equire_once(realpath($_SERVER["DOCUMENT_ROOT"])."/inc/db_open.php"); 
 
 
hai a disposizione una variabile $mysqli che è un oggetto della classe 
mysqli, ma evidentemente non è così.
se dumpi $mysqli appena dopo la require vedrai che $mysqli è NULL.
Non conosco il contenuti del file incluso, quindi non posso dorti altro
 
ciao

 Non conosco il contenuti del file incluso, quindi non posso dorti altro
 
Hai ragione. Il file esterno sarebbe:
 
<?php
// connessione a MySQL con l'estensione MySQLi
$mysqli = new mysqli("
db.host.it
", "user", "pass", "db");
 
// verifica dell'avvenuta connessione
if (mysqli_connect_errno()) {
           // notifica in caso di errore
        echo "Errore in connessione al DBMS: ".mysqli_connect_error();
           // interruzione delle esecuzioni i caso di errore
        exit();
 
}
 
?>
 
Mentre la chiusura e' solo:
 
<?php
$mysqli->close();
?>