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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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); 
    } 
}
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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:

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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;      
    }
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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('...');
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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)
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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('...');
 

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
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.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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
Autore Titolo Forum Risposte Data
L Problemi con classe di astrazione per il database PHP 20
P [RISOLTO]Classe database: connessione in costruttore? PHP 7
P Classe database: restiruire array da query PHP 7
L classe per inserire dati al database PHP 2
G classe CSS sovrascritta HTML e CSS 2
L php tinymce mi duplica la classe label PHP 3
P jButton1ActionPerformed passare parametri ad altra classe Java 2
L creare oggetti da una classe tramite un form Javascript 0
A Riproduzione classe Vector C/C++ 3
C [PHP] Estrarre da una classe i valori che mi interessano PHP 5
O Estendere una rete di classe C Reti LAN e Wireless 1
tucu49 PHP include classe PHP 8
M [PHP] Estendere Connessione a una Classe PHP 1
M [PHP] utilizzo di una classe e delle sue funzioni PHP 2
tritabit Classe MysqliDb mancante nelle librerie arc2 PHP 2
D [PHP] assegnare una classe PHP 1
W [PHP] Creazione classe PDO PHP 4
S Copiare attributi da una classe. Programmazione 0
D [PHP] chiamata metodi da una classe PHP 3
L [PHP] login con la classe medoo.in PHP 5
macus_adi Classe PHP per la Geolocalizzazione del visitatore Snippet PHP 0
B [Javascript] Cambiare classe ed aggiornare relativi eventi Javascript 3
M [wordpress-galleria immagini]Inserire classe php in html PHP 0
L [PHP] Classe che non vede i suoi metodi PHP 3
A [Javascript] Mancata aggiunta di una classe al click Javascript 1
A [PHP] metodo di una classe per estrarre i dati con ciclo while PHP 1
C [PHP] Metodo di una classe in sltra classe PHP 1
Shyson [WordPress] Mettere classe css WordPress 0
V [PHP] utilizzo di metodi statici in altra classe PHP 5
Sevenjeak [C#] Aiuto esportazione tema su libreria di classe ( dll ) .NET Framework 1
elpirata [PHP] [RISOLTO] Stampare classe css in base al risultato della query PHP 6
C Classe Prenotazione con 2 scelte Java 2
A modificare .jar con classe personalizzata Java 9
Rikk73 Passare come argomento in un metodo un parametro della classe istanziata PHP 0
M Visualizzare da una classe esistente ogni profilo utente PHP 1
napuleone Modificare attributi di una classe con js Javascript 2
C Upload immagini con classe non funzionante PHP 1
A chiamate con istanza di altra classe rispetto la classe di app. (plugin) PHP 1
M aggiungere classe al click Javascript 1
M Assegnare un id o classe a una variabile php PHP 5
P Inserire classe su script Google Analitics Magento 0
N Dare id ad elementi classe jQuery 1
otto9due Postare tweet con immagine cosa aggiungere a questa classe? PHP 0
C Errore con classe PHP 4
Marco_88 Aiuto Oggetti da Classe PHP 0
otto9due Qualcuno mi dice dove sbaglio in questa classe .. PHP 4
A Creare una classe espressione Java 1
F Aggiungere classe/id immagine jQuery 3
C Leggere variabili esterne ad una classe in php 5.2 PHP 6
L classe upload [Problema cartella] PHP 1

Discussioni simili