Newsgroup: it.comp.www.php
Titolo: Classe: dove sto sbagliando?

Ho costruito una classe per semplificarmi un pochetto l'interfaccia
verso il database.
Ora, a prescindere dal fatto che possa esserci qualcosa di già pronto,
il mio problema è questo: se nella classe dichiaro una variabile $conn
che contiene il riferimento alla connessione aperta, e se dalle
funzioni la richiamo come $this->$conn, perchè il mio progetto in una
determinata funzione vede $this->$conn come "0" invece che come
riferimento alla connessione? Eppure la connessione l'ho aperta,
perchè nel metodo connect() restituisco $this->$conn e quindi "vedo"
che è stata stabilita e assegnata correttamente.
Sono stato un po' spicciolo ma vi posto il codice della classe e
l'esempio che ho utilizzato per i primi test:
Ho costruito una classe per semplificarmi un pochetto l'interfaccia
verso il database.
Ora, a prescindere dal fatto che possa esserci qualcosa di già pronto,
il mio problema è questo: se nella classe dichiaro una variabile $conn
che contiene il riferimento alla connessione aperta, e se dalle
funzioni la richiamo come $this->$conn, perchè il mio progetto in una
determinata funzione vede $this->$conn come "0" invece che come
riferimento alla connessione? Eppure la connessione l'ho aperta,
perchè nel metodo connect() restituisco $this->$conn e quindi "vedo"
che è stata stabilita e assegnata correttamente.
Sono stato un po' spicciolo ma vi posto il codice della classe e
l'esempio che ho utilizzato per i primi test:
file "inc/mod_database2.php"
--------------------------
<?php
  $db_host = "localhost";
  $db_username = "root";
  $db_password = "";
  class clsDatabase
  {
    var $conn, $error, $err_no, $affected_rows;
    // Constructor
    function clsDatabase()
    {
      $this->$conn   = null;
      $this->$error  = "";
      $this->$err_no  = 0;
      $this->$affected_rows = 0;
    }
    function getConnection()
    {
      return $this->$conn;
    }
    function getError()
    {
      return $this->$error;
    }
    function getErrNo()
    {
      return $this->$err_no;
    }
    function getAffectedRows()
    {
      return $this->$affected_rows;
    }
    function connect($db_name = "")
    {
      global $db_host, $db_username, $db_password;
      if ($conn != null)
        close();
      if ($db_name != "")
      {
        if (($this->$conn = @mysql_connect($db_host, $db_username,
$db_password)) !== false)
        {
          if (!mysql_select_db($db_name, $this->$conn))
          {
            mysql_close($this->$conn);
            $this->$conn = false;
          }
        }
        else
          $this->$conn = null;
      }
      return ($this->$conn);
    }
    function close()
    {
      if ($this->$conn != null)
      {
        mysql_close($this->$conn);
        $this->$conn = null;
      }
    }
    function doSelect($strSQL)
    {
      $ris = null;
      $this->$error  = "";
      $this->$err_no = 0;
      echo "doSelect(): conn = " . $this->$conn . "<br />\n";
      if ($this->$conn != null)
      {
        if (($rs = mysql_query($strSQL, $this->$conn)) !== false)
        {
          while (($riga = mysql_fetch_array($rs)) !== false)
            $ris[] = $riga;
          mysql_free_result($rs);
        }
        else
        {
          $this->$error  = "Errore nella query: " . mysql_error($this->
$conn);
          $this->$err_no = mysql_errno($this->$conn);
        }
      }
      return $ris;
    }
    function doQuery($strSQL)
    {
      $ris = false;
      $this->$affected_rows = 0;
      if (mysql_query($strSQL, $this->$conn))
      {
        $ris = true;
        $this->$affected_rows = mysql_affected_rows($this->$conn);
      }
      else
      {
        $this->$error  = mysql_error($this->$conn);
        $this->$err_no = mysql_errno($this->$conn);
      }
      return $ris;
    }
  }
?>
file "prova.php"
----------------
<?php
  require("inc/mod_database2.php");
  $db = new clsDatabase;
  if ($conn = $db->connect("messaggistica"))
  {
    $strSQL = "
    SELECT COUNT(1) AS nCount
    FROM messaggi";
    if ($ris = $db->doSelect($strSQL))
      echo "Ci sono $ris[0][nCount] messaggi";
    else
      echo "Errore: " . $db->getError();
    $db->close();
  }
  else
    echo "Non connesso :\<br />\n";
  $db = null;
?>
Dove sbaglio? Perchè nella chiamata a $db->doSelect() la riga con il
print di $this->$conn mi stampa 0?

 connessione? Eppure la connessione l'ho aperta, perchè nel metodo
Perche` non devi usare $this->$conn, ma $this->conn (senza il dollaro).
Bye.

 Bye.
DOH!!!
Strano che la getConnection() mi funzioni però :\
Chissà da dove lo prende il valore da restituirmi... Mah!!!
Comunque grazie!

 prende il valore da restituirmi... Mah!!! Comunque grazie!
Perche` traduce $conn in una stringa, che potrebbe valere "false", quindi 
memorizza in $this->false il valore.
Se la richiami subito dopo il connect() ti torna il valore giusto, ma poi 
tutte le variabili che usi con il "dollaro" vengono convertite come 
"false", quindi continui a sovrascrivere $this->false con nuovi valori, e 
perdi la connessione.
Bye.