Classe database e metodo pubblico

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
Salve, perché ho questa classe che sto scrivendo a modo mio e vedento molti video su youtube..etc..
Mi da questi errori:
PHP:
Notice: Undefined variable: db in D:\xampp\htdocs\ProveOOP\db.php on line 20

Fatal error: Call to a member function query() on a non-object in D:\xampp\htdocs\ProveOOP\db.php on line 20

Ho fatto
PHP:
<?php
class database{

   public $db;
    
    public function __construct(){
        $db = new mysqli("localhost", "root", "","test");        
    }

    public static function getInstance(){    
        if(is_null(database::$instance)){
            database::$instance = new database();
        }
        return database::$instance;    
    }
    
    public function db_insert($q)
    {
        
       return  $db->query($q);
    }
}
?>

mi da errore qua:
public function db_insert($q)
{

return $db->query($q);
}

grazie mille. mi sapete dire come mai?

buona giornata.
 
Devi utilizzare $this per accedere alle proprietà non statiche
PHP:
class database{ 

   public $db; 
     
    public function __construct(){ 
        $this->db = new mysqli("localhost", "root", "","test");         
    } 

    public static function getInstance(){     
        if(is_null(database::$instance)){ 
            database::$instance = new database(); 
        } 
        return database::$instance;     
    } 
     
    public function db_insert($q) 
    { 
         
       return  $this->db->query($q); 
    } 
}
 
ok, ora ho fatto la classe user:
PHP:
<?php

 
class User{
 
   public function __construct(){
    
   } 
  
   public function insert($nome,$cognome)
   {
     return  $this->db_insert("INSERT users (name,firstname)VALUES('".$nome."','".$cognome."')");    
   }
}

ma mi da questo errore che non so andar avanti:
Fatal error: Call to undefined method User::db_insert() in D:\xampp\htdocs\ProveOOP\user.php on line 15
me lo da nella funzione db_insert che si trova nella classe database.
cosa devo fare?

grazie mille.
 
ok, ora ho fatto la classe user:
PHP:
<?php

 
class User{
 
   public function __construct(){
    
   } 
  
   public function insert($nome,$cognome)
   {
     return  $this->db_insert("INSERT users (name,firstname)VALUES('".$nome."','".$cognome."')");    
   }
}

ma mi da questo errore che non so andar avanti:
Fatal error: Call to undefined method User::db_insert() in D:\xampp\htdocs\ProveOOP\user.php on line 15
me lo da nella funzione db_insert che si trova nella classe database.
cosa devo fare?

grazie mille.
La classe user non estende la classe del database quindi è ovvio che ti da quell'errore perché in pratica chiami un metodo inesistente in quella classe

ps: il construct non è obbligatorio, utilizzalo se ti serve nella dichiarazione di una nuova istanza
 
ciao, ti posto le classi che si fa prima perché adeso mi da errore:

Notice: Undefined variable: db in D:\xampp\htdocs\ProveOOP\user.php on line 7

Fatal error: Cannot access empty property in D:\xampp\htdocs\ProveOOP\user.php on line 7

db.php:
PHP:
<?php
class database{ 

   public $db; 
     
    public function __construct(){ 
        $this->db = new mysqli("localhost", "root", "","test");         
    } 

    public static function getInstance(){     
        if(is_null(database::$instance)){ 
            database::$instance = new database(); 
        } 
        return database::$instance;     
    } 
     
    public function db_insert($q) 
    { 
         
       return  $this->db->query($q); 
    } 
}  
?>

user.php:
PHP:
<?php

class User extends database{
       
   public function insert($nome,$cognome)
   {
     return  $this->$db->db_insert("INSERT users (name,firstname)VALUES('".$nome."','".$cognome."')");    
   }
}

test.php:
PHP:
<?php
include("db.php");
include("user.php");


$u = new User();

$insert_user = $u->insert("Nino","Morini");

?>

come mai mi da quell'errore lì?

grazie mille.
 
In questo caso dovresti fare cosi:
PHP:
$this->db_insert("INSERT INTO users (name,firstname)VALUES('".$nome."','".$cognome."')");

perché db_insert non è un metodo di mysqli, inoltre per accedere ad una proprietà non serve $ anche dopo $this

ps: è insert into no solo insert
 
Ultima modifica:
ok, c'è lo fatta...

una cosa senza estendere la classe si può fare o no?

c'è bisogna tutte le classi:
fare cosi:
class User extends database{
?
come posso chiamare la classe principale per far modo che non venga brutto il codice.

ti ringrazio molto.
buona giornata.
 
ok, c'è lo fatta...

una cosa senza estendere la classe si può fare o no?

c'è bisogna tutte le classi:
fare cosi:
class User extends database{
?
come posso chiamare la classe principale per far modo che non venga brutto il codice.

ti ringrazio molto.
buona giornata.
PHP:
public static $instance = null;
public static function getInstance(){      
        if(is_null(database::$instance)){  
            database::$instance = new database();  
        }  
        return database::$instance;      
    }
 
ciao dove devo mettere quel codice ?

poi un'altra cosa:
il $db->error(); non riesco a metterlo nella funzione db_query:
public function db_query($q)
{
return $this->db->query($q);
}

come faccio metterlo?

grazie mille.
 
ciao dove devo mettere quel codice ?

poi un'altra cosa:
il $db->error(); non riesco a metterlo nella funzione db_query:
public function db_query($q)
{
return $this->db->query($q);
}

come faccio metterlo?

grazie mille.

PHP:
 public function db_query($q) 
    { 
       $query = $this->db->query($q) or die($this->db->error); 
       return $query;
    }

Per quanto riguarda quella funzione l'hai gia messa te, la devi solo utilizzare cosi ad esempio
PHP:
$db = database::getInstance();
$db->db_insert('...');
 
ok. ho fatto ma non riesco ad utilizzare esempio num_rows per il controllo se esiste o no.
come mai?:
ecco il codice di prova che sto provando ad fare:
PHP:
 public function user_update($nome,$cognome,$id)
   {
    $r = $this->db_query("SELECT * FROM users  WHERE id='".$id."'");
    
    $r_no == $this->$db->num_rows($r); 
     
    if($r_no==0)
    {
     $this->db_query("UPDATE users SET name='".$nome."', firstname='".$cognome."' WHERE id='".$id."'"); 
    }else
    {
        echo "non trovato";
    }


Notice: Undefined variable: db in D:\xampp\htdocs\ProveOOP\user.php on line 14

Fatal error: Cannot access empty property in D:\xampp\htdocs\ProveOOP\user.php on line 14

come mai mi dici come risolvere?

grazie mille.
 
ok, fatto .. mi ero sbagliato:

PHP:
public function user_update($nome,$cognome,$id)
   {
    $r = $this->db_query("SELECT * FROM users  WHERE id='".$id."'");
    
    if($r->num_rows==0)
    {
        echo "non trovato";
    
    }else
    {
    
    $this->db_query("UPDATE users SET name='".$nome."', firstname='".$cognome."' WHERE id='".$id."'"); 
        
    }
          
   }

giusto?

ti ringrazio molto.

buona giornata.
 
ok, fatto .. mi ero sbagliato:

PHP:
public function user_update($nome,$cognome,$id)
   {
    $r = $this->db_query("SELECT * FROM users  WHERE id='".$id."'");
    
    if($r->num_rows==0)
    {
        echo "non trovato";
    
    }else
    {
    
    $this->db_query("UPDATE users SET name='".$nome."', firstname='".$cognome."' WHERE id='".$id."'"); 
        
    }
          
   }

giusto?

ti ringrazio molto.

buona giornata.
Si, comunque aggiungerei dei controlli sui campi passati alla funzione ($nome,$cognome,$id)
 
ok, fatto ma sto provando ad fare il costruttore come fa questo tutorial di mrwebmaster:
https://www.mrw.it/php/php-oop-creare-sistema-registrazione-autenticazione-utenti_7706.html

però se lo applico al mio:
PHP:
class User{
    
    public function __construct()
    {
     $db = new database();
    }

etc..
e nel database.php:
PHP:
<?php
class database{ 

   public $db; 
     
     function __construct(){ 
        $this->db = new mysqli("localhost", "root", "","test");         
    } 

     
    public function db_query($go_query) 
    { 
      $query = $this->db->query($go_query) or die($this->db->error); 
      return $query;
    } 
}  
?>

mi da un bel :
Call to undefined method User::db_query()

come mai.. non posso farlo anche al mio in quel sistema lì senza scrivere tutte le volte estendere la classe.
e poi mi dici come devo fare come mi avevi detto prima il codice che mi hai postato.. solo che lo provato non funziona.

hai idee?

grazie mille.
 
ok, quello di mrwebmaster non lo uso .. e mi arrendo uso il mio:

class User extends database{

ma se devo fare altre classi come devo fare sempre la solita dicitura?
grazie mille.
 
Puoi risolvere quei problemi utilizzando una funzione statica che riporta l'istanza della classe come inizialmente avevi fatto
PHP:
//esempio
$db = database::getInstance();
$db->db_query('...');
 
ho fatto cosi come mi hai detto ma nulla.. ti posto tutto:

ma ricevo questo:
Fatal error: Call to undefined method User::db_query() in D:\xampp\htdocs\ProveOOP\class\user.php on line 28

PHP:
<?php
include("inc.php");
$db = database::getInstance(); 

$u = new User();
$l = new Login();

$u->user_select_all(); // l'errore è di questa funzione che visualizza tutti i dati.
$email = "[email protected]";
$password = "fragola";
$l->login_form($email, $password);

?>

ha una cosa uso l'autoload:
PHP:
<?php
function __autoload($className)
{
    require_once 'class/'.$className.'.php';
}
?>

non riesco a capire come mai..

class User extends database

Ma questo codice lo devo sempre usare o togliere?

ti ringrazio molto.
buona serata.
 
Ti consiglio vivamente di leggere una guida dettagliata senza seguire vecchi tutorial o simili perché vedo che hai un po di confusione.

La funzione statica per l'istanza della classe del database la devi usare dove ne richiedi l'utilizzo, in questo caso $db è fuori dalle classi che richiami quindi è ovvio che darà errore (almeno che non utilizzi un global, ma te lo sconsiglio).

Inoltre la classe la devi estendere se vuoi usare i metodi e le proprietà della classe estesa in quella che la estende, quindi nel caso che tu estendi la classe del database potrai accedere direttamente con $this ai componenti dell'altra classe in tutti i metodi.
 

Discussioni simili