Classe per connessione MySqli

Alessandro Gusella

Nuovo Utente
3 Set 2012
7
0
0
Salve a tutti ragazzi.
Ho dei problemi a capire come funzionano i costruttori e la propagazione delle classi.
Di seguito trovate il problema.

Questo è il contenuto del file con le impostazioni e la connessione

PHP:
define('DATA_HOST', '---------');
define('DATA_UTENTE', '--------');
define('DATA_PASS', '-------');
define('DATA_DB', '------');
define('USERS_TABLE_NAME', '-----------');

class DATA_Class {

  function __construct() {
      $db = new mysqli(DATA_HOST, DATA_UTENTE, DATA_PASS, DATA_DB);
      if ($db->connect_errno)
      echo "Connessione fallita a MySQL: " . $db->connect_error;
  }
}
e questo il file dove vengono eseguiti i metodi della classe

PHP:
include($_SERVER['DOCUMENT_ROOT'].'/........');

class User_Class  {

  public function __construct()
  {
    $data = new DATA_Class();
  }
 
  public function registra($username, $password, $email)
  {   
    $password = @sha1($password);
  
    $query = "SELECT id FROM users WHERE email = '$email'";
$result = $db->query($query);
non mi viene propagato (se così si può dire) in questo file il costruttore presente nel file delle impostazioni e connessione.

Dove sbaglio? spero abbiate capito il problema

Alessandro
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Nelle classi devi usare le proprietà le variabili si comportano come in normali funzioni quindi non richiamabili cosi


Ad esempio
PHP:
define('DATA_HOST', '---------');
define('DATA_UTENTE', '--------');
define('DATA_PASS', '-------');
define('DATA_DB', '------');
define('USERS_TABLE_NAME', '-----------');

class DATA_Class {

public $db;

  function __construct() {
      $this->db = new mysqli(DATA_HOST, DATA_UTENTE, DATA_PASS, DATA_DB);
      if ($this->db->connect_errno)
      echo "Connessione fallita a MySQL: " . $this->db->connect_error;
  }
}  

/* ALTRO FILE */

include($_SERVER['DOCUMENT_ROOT'].'/........');

class User_Class  {

public $data;

  public function __construct()
  {
    $this->data = new DATA_Class();
  }
 
  public function registra($username, $password, $email)
  {   
    $password = @sha1($password);
  
    $query = "SELECT id FROM users WHERE email = '$email'";
$result = $this->data->db->query($query);
Se dovevi ricavare solamente mysqli, ti bastava una normale funzione con un return
PHP:
function getDb() {
      $db= new mysqli(DATA_HOST, DATA_UTENTE, DATA_PASS, DATA_DB);
      if ($db->connect_errno)
       die("Connessione fallita a MySQL: " . $db->connect_error);  else return $db;
  }

//e nelle classi

//....
   $this->var = getDb();
   $this->var->query('...');
//....
 
Ultima modifica:

Alessandro Gusella

Nuovo Utente
3 Set 2012
7
0
0
perfetto, grazie, come dici tu funziona, ma vorrei capire perche se il file delle impostazioni è cosi

PHP:
class DATA_Class {
  
  function __construct() {
    
    $connessione = @mysql_connect(DATA_HOST, DATA_UTENTE, DATA_PASS) or die('Errore nella connessione: ' . mysql_error());
  
    @mysql_select_db(DATA_DB, $connessione) or die('Errore dal database: ' . mysql_error());
  }
}
e nel secondo file è cosi
PHP:
class User_Class {
  
 
  public function __construct() 
  {
    
    $data = new DATA_Class();
  }

  
  public function registra($nome_reale, $nome_utente, $password, $email) 
  {
   
    $password = @sha1($password);
   
    $query = @mysql_query("SELECT id_utente FROM iscritti WHERE nome_utente = '$nome_utente' OR email = '$email'") or die('Errore: ' . mysql_error());

funziona.
Non si posso includere classi nelle istanze?
Riesci a spiegarmelo?
Grazie e gentilissimo.
Ale
 
Ultima modifica:

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
perfetto, grazie, come dici tu funziona, ma vorrei capire perche se il file delle impostazioni è cosi

PHP:
class DATA_Class {
  
  function __construct() {
    
    $connessione = @mysql_connect(DATA_HOST, DATA_UTENTE, DATA_PASS) or die('Errore nella connessione: ' . mysql_error());
  
    @mysql_select_db(DATA_DB, $connessione) or die('Errore dal database: ' . mysql_error());
  }
}
e nel secondo file è cosi
PHP:
class User_Class {
  
 
  public function __construct() 
  {
    
    $data = new DATA_Class();
  }

  
  public function registra($nome_reale, $nome_utente, $password, $email) 
  {
   
    $password = @sha1($password);
   
    $query = @mysql_query("SELECT id_utente FROM iscritti WHERE nome_utente = '$nome_utente' OR email = '$email'") or die('Errore: ' . mysql_error());

funziona.
Non si posso includere classi nelle istanze?
Riesci a spiegarmelo?
Grazie e gentilissimo.
Ale
Non capisco che cosa intendi, mysql lavora da procedurale è differente e poi che intendi la classe in un istanza? Un istanza è il resource di una classe in poche parole...

Spiegati meglio pls...

ps: perdi il vizio di usare la @, gli errori è meglio correggerli che nasconderli
 

Alessandro Gusella

Nuovo Utente
3 Set 2012
7
0
0
Lo perderò il vizio delle @ lo giuro :fonzie:

allora cerco di spiegarmi meglio.
Se nel primo file nel __costrutto della classe DATA_Class c'è questo
PHP:
class DATA_Class {
  
  function __construct() {
    
    $connessione = mysql_connect(DATA_HOST, DATA_UTENTE, DATA_PASS) or die('Errore nella connessione: ' . mysql_error());
  
    mysql_select_db(DATA_DB, $connessione) or die('Errore dal database: ' . mysql_error());
  }
}
perchè se nel __costrutto della classe nel secondo file basta chiamare la classe DATA_Class
come qui scritto
PHP:
class User_Class {
  
 
  public function __construct() 
  {
    
    $data = new DATA_Class();
  }
e la connessione è disponibile in tutta la classe?

Io credevo che se nel __costrutto della classe DATA_Class avessi scritto questo
PHP:
class DATA_Class {

  function __construct() {
      $db = new mysqli(DATA_HOST, DATA_UTENTE, DATA_PASS, DATA_DB);
      if ($db->connect_errno)
      echo "Connessione fallita a MySQL: " . $db->connect_error;
  }
}
tutto sarebbe andato a posto.

Non mi è facile spiegare.
Ciao.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
mysqli usa un concetto orm invece mysql lavora da procedurale, non è un istanza che ritorna ma lavora a semplici funzioni, quindi basterà stabilirlo dove vuoi perché sia disponibile ovunque perciò è anche inutile che la richiami nel construct ti basterebbe dichiararlo in un file senza classi ne nulla, invece mysqli torna con l'istanza della classe e i metodi da usare.


Ti consiglierei di adottare pdo anche se un po difficile le prime volte, perché lavora completamente ad oggetti, ma per ora continua pure su mysqli o mysql, prima devi farti un po i muscoli per sfidarlo :cool: