piu istanze della stessa classe per la connesione al database

Salve ha tutti sto realizando la mia prima applicazione con l'utilizzo di classi in php.

ho cercato di suddividere la mia applicazione in livelli

application

business

domain

la classe che ho utilizzato per la connessione e per prelevare i dati dal data base e' la seguente

dbConnection.class.php

<?php 

abstract class Singleton {

    protected function __construct() {
    }

    final public static function getInstance() {
        static $aoInstance = array();

        $calledClassName = get_called_class();

        if (! isset ($aoInstance[$calledClassName])) {
            $aoInstance[$calledClassName] = new $calledClassName();
        }

        return $aoInstance[$calledClassName];
    }

    final private function __clone() {
    }
}
/**
 * LoginSystem
 * 
 * Simple Login system with sessions and MySQL User DB
 * 
 * @version      1.0
 * @author       A.Surrey   (www.surneo.com)
 * 
 * 
 */

class dbConnection extends Singleton
{
   var   $db_host,
      $db_name,
      $db_user,
      $db_password,
      $connection,
      $username,
      $password;

   /**
    * Constructor
    */
   function dbConnection()
   {
      require_once('settings.php');
      
      $this->db_host = $dbhost;
      $this->db_name = $dbname;
      $this->db_user = $dbuser;
      $this->db_password = $dbpassword;
   }
   
   /**
    * Check if the user is logged in
    * 
    * @return true or false
    */
   
   
   /**
    * Check username and password against DB
    *
    * @return true/false
    */
   function doLogin($username, $password)
   {
      $this->connect();
      
      $this->username = $username;
      $this->password = $password;
      
      // check db for user and pass here.
      $sql = sprintf("SELECT * FROM user_tbl WHERE UserName = '%s' and Password = '%s'", 
                                 $this->clean($this->username), md5($this->clean($this->password)));
                  
      $result = mysql_query($sql, $this->connection);
      
      // If no user/password combo exists return false
      if(mysql_affected_rows($this->connection) != 1)
      {
         $this->disconnect();
         return false;
      }
      else // matching login ok
      {
         $row = mysql_fetch_assoc($result);
         
         // more secure to regenerate a new id.
         session_regenerate_id();
         
         //set session vars up
         $_SESSION['LoggedIn'] = true;
         $_SESSION['userName'] = $this->username;
         
      }
      
      $this->disconnect();
      return true;
   }
   

   
   /**
    * Connect to the Database
    * 
    * @return true/false
    */
   function connect()
   {
      $this->connection = mysql_connect($this->db_host, $this->db_user, $this->db_password) 
                                          or die("Unable to connect to MySQL");
      
      mysql_select_db($this->db_name, $this->connection) or die("Unable to select DB!");
      
      // Valid connection object? everything ok?
      if($this->connection)
      {
         return true;
      }
      else return false;
   }
   
   /**
    * Disconnect from the db
    */
   function disconnect()
   {
      mysql_close($this->connection);
   }
   
   /**
    * Cleans a string for input into a MySQL Database.
    * Gets rid of unwanted characters/SQL injection etc.
    * 
    * @return string
    */
   function clean($str)
   {
      // Only remove slashes if it's already been slashed by PHP
      if(get_magic_quotes_gpc())
      {
         $str = stripslashes($str);
      }
      // Let MySQL remove nasty characters.
      $str = mysql_real_escape_string($str);
      
      return $str;
   }
   
   /**
    * create a random password
    * 
    * @param   int $length - length of the returned password
    * @return   string - password
    *
    */
   function randomPassword($length = 8)
   {
      $pass = "";
      
      // possible password chars.
      $chars = array("a","A","b","B","c","C","d","D","e","E","f","F","g","G","h","H","i","I","j","J",
            "k","K","l","L","m","M","n","N","o","O","p","P","q","Q","r","R","s","S","t","T",
            "u","U","v","V","w","W","x","X","y","Y","z","Z","1","2","3","4","5","6","7","8","9");
            
      for($i=0 ; $i < $length ; $i++)
      {
         $pass .= $chars[mt_rand(0, count($chars) -1)];
      }
      
      return $pass;
   }
    
    function addUser($username,$pas)
    {
    $this->connect();
    $pw = md5($this->clean($pas));
   $username = $this->clean($username);
    $sql = "INSERT INTO user_tbl (UserName, Password) VALUES ('$username', '$pw')";
   $result= mysql_query($sql,$this->connection);

    return $result;
    $this->disconnect();
    //return true;
    }
    
    function getAllComuni(){
        $this->connect();
        $sql="SELECT * FROM comune";
        $result=mysql_query($sql);
        $arrayComuni=array();
      while($arrayC[]=mysql_fetch_array($result)){
          $arrayComuni=$arrayC;
          }
        $this->disconnect();
      
        return $arrayComuni;
    }
    
    function getAllCcnl(){
        $this->connect();
        $sql="SELECT DISTINCT (CCNL) FROM profilo_formativo";
        $result=mysql_query($sql);
        $arrayC[]=mysql_fetch_array($result);
        $this->disconnect();
        return $arrayC;
    }
}

?>

Questa e' la classe che si occupa del livello di business

<?
include_once("User.class.php");
include_once("../domain/dbConnection.class.php");
class buisiness{
   
    function addUser($username,$pas)
    {
        $u=new User($username,$pas);
    
         
        return $this->dbConnection->addUser($u->username,$u->password);
        
    }
    function getSelectComuni(){
            
           
          $arrayComuni=$this->dbConnection->getAllComuni();
          $num=count($arrayComuni);
          ?>
          <select name="comune">
            <option value=0>scegli il comune</option>
            <?
            for ($row = 0; $row < $num; $row++)
            {
                echo "<option value=".$arrayComuni[$row][id].">".$arrayComuni[$row][comune]."</option>";
            }
           ?>
          </select>
       <?   
    }
    function getCCNLText(){
        
       
          $arrayComuni=$this->dbConnection->getAllCcnl();
         print_r($arrayComuni);
    }
}
?>

Infine quando ho utilizzato questa pagina per chiamare piu' di una funzione mi da errore nella connessione del database

la pagina e' la sequente

<?php 
include_once("../business/GestoreBusiness.php");
$business=new buisiness();



if($_POST['Submit']=='Add')
{

   
}

/**
 *   Show error messages etc.
 */
function showMessage()
{
   if(is_numeric($_GET['msg']))
      {
         switch($_GET['msg'])
         {
            case 1: echo "Inserisci tutti i campi o assicurati che l'utente non sia gia inserito";
            break;
            
            case 2: echo "Utente aggiunto!";
            break;
            
         }
      }
}

?>


   <div class="cent"><? showMessage();?></div>
<form action="<? echo $_SERVER['REQUEST_URI'];?>" method="post" name="addAziendaForm">
    <table>
        <tr>
            <td>denominazione</td>
            <td><input name="denominazione" type="text" value="" size="30" maxlength="30" /><br /></td>
        </tr>
        <tr>
            <td>indirizzo</td>
            <td><input name="indirizzo" type="text" value="" size="30" maxlength="30" /><br /></td>
        </tr>   
        <tr>
            <td>comune</td>
            <td>
                [color=red]<?$business->getSelectComuni();?>[/color]
            </td>
        </tr>
        <tr>
            <td>
            [color=red]<?$business->getCCNLText();?>[/color]
            </td>
        </tr> 
      <tr>
            <td><input name="Submit" type="submit" value="Add" /></td>
        </tr>
  </table>
</form>

<SCRIPT language="JavaScript">
 var frmvalidator  = new Validator("addAziendaForm");
 frmvalidator.addValidation("denominazione","req");
 frmvalidator.addValidation("indirizzo","req");
 
 </SCRIPT>

Dove sbaglio mi sfugge qualcosa con la gestione delle classi perfavore AIUTOOO!!!

Infine un ultima cosa le pagine non mi danno nessun tipo di errore neanche di sintassi.

Premetto che nel file php.ini display_error e stettato ad on e ho provato anche a mettere error_reporting(E_ALL).

inviato 6 anni fa
tommy86
X 0 X

Prova a cercare degli errori nel log di apache (usi questo vero?).

Che errore esattamente ti propone per la connessione al database?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Access denied for user 'ODBC'@'localhost' (using password: NO)

cmq scusatemi ho postato la classe errata sono simili solo che non ho utilizzato la classe singelton

classe per la connessione al DB

<?php 



class dbConnection
{
   var   $db_host,
      $db_name,
      $db_user,
      $db_password,
      $connection,
      $username,
      $password;

   /**
    * Constructor
    */
   function dbConnection()
   {
      require_once('settings.php');
      
      $this->db_host = $dbhost;
      $this->db_name = $dbname;
      $this->db_user = $dbuser;
      $this->db_password = $dbpassword;
   }
   
   /**
    * Check if the user is logged in
    * 
    * @return true or false
    */
   
   
   /**
    * Check username and password against DB
    *
    * @return true/false
    */
   function doLogin($username, $password)
   {
      $this->connect();
      
      $this->username = $username;
      $this->password = $password;
      
      // check db for user and pass here.
      $sql = sprintf("SELECT * FROM user_tbl WHERE UserName = '%s' and Password = '%s'", 
                                 $this->clean($this->username), md5($this->clean($this->password)));
                  
      $result = mysql_query($sql, $this->connection);
      
      // If no user/password combo exists return false
      if(mysql_affected_rows($this->connection) != 1)
      {
         $this->disconnect();
         return false;
      }
      else // matching login ok
      {
         $row = mysql_fetch_assoc($result);
         
         // more secure to regenerate a new id.
         session_regenerate_id();
         
         //set session vars up
         $_SESSION['LoggedIn'] = true;
         $_SESSION['userName'] = $this->username;
         
      }
      
      $this->disconnect();
      return true;
   }
   

   
   /**
    * Connect to the Database
    * 
    * @return true/false
    */
   function connect()
   {
      $this->connection = mysql_connect($this->db_host, $this->db_user, $this->db_password) 
                                          or die("Unable to connect to MySQL".mysql_error());
      
      mysql_select_db($this->db_name, $this->connection) or die("Unable to select DB!");
      
      // Valid connection object? everything ok?
      if($this->connection)
      {
         return true;
      }
      else return false;
   }
   
   /**
    * Disconnect from the db
    */
   function disconnect()
   {
      mysql_close($this->connection);
   }
   
   /**
    * Cleans a string for input into a MySQL Database.
    * Gets rid of unwanted characters/SQL injection etc.
    * 
    * @return string
    */
   function clean($str)
   {
      // Only remove slashes if it's already been slashed by PHP
      if(get_magic_quotes_gpc())
      {
         $str = stripslashes($str);
      }
      // Let MySQL remove nasty characters.
      $str = mysql_real_escape_string($str);
      
      return $str;
   }
   
   /**
    * create a random password
    * 
    * @param   int $length - length of the returned password
    * @return   string - password
    *
    */
   function randomPassword($length = 8)
   {
      $pass = "";
      
      // possible password chars.
      $chars = array("a","A","b","B","c","C","d","D","e","E","f","F","g","G","h","H","i","I","j","J",
            "k","K","l","L","m","M","n","N","o","O","p","P","q","Q","r","R","s","S","t","T",
            "u","U","v","V","w","W","x","X","y","Y","z","Z","1","2","3","4","5","6","7","8","9");
            
      for($i=0 ; $i < $length ; $i++)
      {
         $pass .= $chars[mt_rand(0, count($chars) -1)];
      }
      
      return $pass;
   }
    
    function addUser($username,$pas)
    {
    $this->connect();
    $pw = md5($this->clean($pas));
   $username = $this->clean($username);
    $sql = "INSERT INTO user_tbl (UserName, Password) VALUES ('$username', '$pw')";
   $result= mysql_query($sql,$this->connection);

    return $result;
    $this->disconnect();
    //return true;
    }
    
    function getAllComuni(){
        $this->connect();
        $sql="SELECT * FROM comune";
        $result=mysql_query($sql);
        $arrayComuni=array();
      while($arrayC[]=mysql_fetch_array($result)){
          $arrayComuni=$arrayC;
          }
        $this->disconnect();
      
        return $arrayComuni;
    }
    
    function getAllCcnl(){
        $this->connect();
        $sql="SELECT DISTINCT (CCNL) FROM profilo_formativo";
        $result=mysql_query($sql);
        $arrayC[]=mysql_fetch_array($result);
        $this->disconnect();
        return $arrayC;
    }
}

?>

classe di business

<?
include_once("User.class.php");
include_once("../domain/dbConnection.class.php");
class buisiness{
    
    function addUser($username,$pas)
    {
        $u=new User($username,$pas);
    
        $dbConnection= new dbConnection();
        return $dbConnection->addUser($u->username,$u->password);
        
    }
    function getSelectComuni(){
        
         $dbConnection= new dbConnection();
          $arrayComuni=$dbConnection->getAllComuni();
          $num=count($arrayComuni);
          ?>
          <select name="comune">
            <option value=0>scegli il comune</option>
            <?
            for ($row = 0; $row < $num; $row++)
            {
                echo "<option value=".$arrayComuni[$row][id].">".$arrayComuni[$row][comune]."</option>";
            }
           ?>
          </select>
       <?   
    }
    function getCCNLText(){
        
         $dbConnection= new dbConnection();
          $arrayComuni=$dbConnection->getAllCcnl();
         
    }
}
?>

la pagina e' la stessa postata prima

Cmq se nella pagina chiamo solo un metodo l'errore non me lo da.

risposto 6 anni fa
tommy86
X 0 X

Controlla i parametri di connessione al tuo database.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

I parametri sono esatti infatti se chiamo solo un metodo in questa pagina funziona tutto perfettamente.

Dovrebbe essere un errore nella gestione delle classi o una cosa simile.

<?php 
include_once("../business/GestoreBusiness.php");
$business=new buisiness();



if($_POST['Submit']=='Add')
{

   
}

/**
 *   Show error messages etc.
 */
function showMessage()
{
   if(is_numeric($_GET['msg']))
      {
         switch($_GET['msg'])
         {
            case 1: echo "Inserisci tutti i campi o assicurati che l'utente non sia gia inserito";
            break;
            
            case 2: echo "Utente aggiunto!";
            break;
            
         }
      }
}

?>


   <div class="cent"><? showMessage();?></div>
<form action="<? echo $_SERVER['REQUEST_URI'];?>" method="post" name="addAziendaForm">
    <table>
        <tr>
            <td>denominazione</td>
            <td><input name="denominazione" type="text" value="" size="30" maxlength="30" /><br /></td>
        </tr>
        <tr>
            <td>indirizzo</td>
            <td><input name="indirizzo" type="text" value="" size="30" maxlength="30" /><br /></td>
        </tr>   
        <tr>
            <td>comune</td>
            <td>
                [color=red]<?$business->getSelectComuni();?>[/color]
            </td>
        </tr>
        <tr>
            <td>
           
            </td>
        </tr> 
      <tr>
            <td><input name="Submit" type="submit" value="Add" /></td>
        </tr>
  </table>
</form>

<SCRIPT language="JavaScript">
 var frmvalidator  = new Validator("addAziendaForm");
 frmvalidator.addValidation("denominazione","req");
 frmvalidator.addValidation("indirizzo","req");
 
 </SCRIPT>
risposto 6 anni fa
tommy86
X 0 X

Ti consiglio di utilizzare la denominazione completa del tag php: <?php.

L'errore lo ottieni se chiami anche solo questo metodo:

$business->getCCNLText();
risposto 6 anni fa
Mario Santagiuliana
X 0 X

il metodo funziona se da solo anche con il tag php completo.

risposto 6 anni fa
tommy86
X 0 X

Se li chiami entrambi invece ottieni quell'errore?

Puoi riportarlo completo? Php non segnala un errore su qualche riga?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Si ottengo l'errore anche se chiamo due volte lo stesso metodo.

Per esempio $business->getAllComuni(); se lo chiamo una vota tutto ok mentre se lo chiamo due volte mi da errore nella connessione.

L'errore che ottengo e' generato da questa riga

$this->connection = mysql_connect($this->db_host, $this->db_user, $this->db_password) 
                                          or die("Unable to connect to MySQL".mysql_error());

lo ottengo perche i parametri alla seconda chiamata nn sono settati ma nn riesco a capire il perche'.

risposto 6 anni fa
tommy86
X 0 X

La notte porta consiglio mario ho risolto rimuovendo require_once("setting.php") nel costruttore della classe dbConnection.E mettendoci require("setting.php");

Grazie cmq per l'aiuto che mi hai dato.

In ogni modo se qualcuno riesce a spiegarmi il perche di questo comportamento gliene sarei grato.

risposto 6 anni fa
tommy86
X 0 X

Oh bene!!! Io ero a fare le nanne a quell'ora.

Il comportamento sembra in effetti strano ma non lo č. Rileggendo la documentazione della funzione si puņ capire il motivo:

The require_once() statement is identical to require() except PHP will check if the file has already been included, and if so, not include (require) it again.

Non ci avevo pensato a questa cosa...nella lettura dello script ero passato oltre.

Molto bene  :D

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda