[risolto] Undefined variable: in programmazione oop

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
Massa, Italy
salve, ho questo classe che sto facendo ma non riesco a capire perché mi da errore:
PHP:
connessione effetuata
Notice: Undefined variable: db in /media/dati/www/prove/database.php on line 13

Fatal error: Call to a member function query() on a non-object in /media/dati/www/prove/database.php on line 13

il codice della query è cosi:
PHP:
//query sulla tabella 
 function Query($sql){
	  $return_sql = $db->query($sql) or die($db->error);
	  return $return_sql;
  }

e il codice che sto provando è cosi:
PHP:
<?php
ini_set('error_reporting', E_ALL);
ini_set("display_errors", 1);
include_once("database.php");

$db=new Database();
$db->connect("localhost","root","root","myDatabase");
echo "connessione effetuata";	
$sql ="INSERT INTO Uscite (importo)values('1.200,30');";
$db->Query($sql);
?>

come posso risolvere il problema ?

grazie mille e buona giornata.
 
$db da dove lo prendi? Per caso è una proprietà della classe? Se si devi utilizzare $this
PHP:
$this->db->query($sql) or die($this->db->error);

Sennò utilizza global (anche se è concettualmente scorretto)
PHP:
global $db;
 
ciao la classe e questa:
PHP:
<?PHP
class Database {
	
  var $db;
	
//connessione al DBMS
 function Connect($db_host, $db_utente, $db_password, $db_nomedb){
	$db = new mysqli($db_host, $db_utente, $db_password, $db_nomedb);
  }

//query sulla tabella 
 function Query($sql){
	  $return_sql = $this->db->query($sql) or die($this->db->error);
	  return $return_sql;
  }

//estrazione di un record
 function FetchRow($sql){
	  $rows = $db->fetch_assoc($sql);
	  return $rows;
  }

//conteggio dei records
 function FetchNum($sql){
	  $num = $db->num_rows($sql);
	  return $num;
  }

//estrazione dei records  
  function FetchArray($sql){
	  $array = $db->fetch_array($sql);
	  return $array;
  }

//chiusura della connessione
 function Close(){
	$db->close;
  }
}
?>

mi aiuti a vedere come mai non funziona?

ti ringrazio molto.

buona giornata
 
ora mi dice cosi:
Fatal error: Call to a member function query() on a non-object in /media/dati/www/prove/database.php on line 13
 
PHP:
class Database {

    var $db;

//connessione al DBMS 
    function Connect($db_host, $db_utente, $db_password, $db_nomedb){
        $this->db = new mysqli($db_host, $db_utente, $db_password, $db_nomedb);
    }

//query sulla tabella  
    function Query($sql){
        $return_sql = $this->db->query($sql) or die($this->db->error);
        return $return_sql;
    }

//estrazione di un record 
    function FetchRow($sql){
        $rows = $this->db->fetch_assoc($sql);
        return $rows;
    }

//conteggio dei records 
    function FetchNum($sql){
        $num = $this->db->num_rows($sql);
        return $num;
    }

//estrazione dei records   
    function FetchArray($sql){
        $array = $this->db->fetch_array($sql);
        return $array;
    }

//chiusura della connessione 
    function Close(){
        $this->db->close();
    }
}

Per connettere sarebbe più ideale utilizzare __construct()
 
ho un'altro problema.. il select fetch array

io ho fatto cosi nella index.php
PHP:
$data = $db->Query("SELECT * FROM Uscite; ");

while($f = $data->FetchArray($sql))
{
	echo "".$f["importo"]."";
}

$db->close();

ma mi da:
Fatal error: Call to undefined method mysqli_result::FetchArray() in /media/dati/www/prove/index.php on line 13
che vuol dire?

grazie mille
 
__construct() serve per inizializzare la classe, puoi semplicemente mettere i parametri di connect li e connettere

L'altro errore vuol dire quello che c'è scritto, cioè che FetchArray non esiste perché Query() ritorna il risultato di una query mysqli e non la stessa classe, quindi semmai dovresti chiamare fetch_array()
 
__construct() serve per inizializzare la classe, puoi semplicemente mettere i parametri di connect li e connettere

L'altro errore vuol dire quello che c'è scritto, cioè che FetchArray non esiste perché Query() ritorna il risultato di una query mysqli e non la stessa classe, quindi semmai dovresti chiamare fetch_array()

ok, ti ringrazio e ho capito..

per l'array come faccio fare una funzione che posso fare un'if che posso usare assoc e l'altro if posso usare array,
e usarlo come ti ho scritto prima..

mi protesti aiutarmi a creare questa funzione con gli if ?

grazie mille. saluti.
 
PHP:
    //query sulla tabella  
    function Query($sql){
        $return_sql = $this->db->query($sql) or die($this->db->error);
        return $return_sql;
    }

Quel modo di catturare gli errori va semplicemente contro tutto il senso di usare una classe per il tuo layer di astrazione.
Ti consiglierei di dire a mysqli di tornare gli errori come eccezioni tramite il report_mode, così che tu possa usare il paradigma try/catch nei tuoi script per gestirli
 
PHP:
    //query sulla tabella  
    function Query($sql){
        $return_sql = $this->db->query($sql) or die($this->db->error);
        return $return_sql;
    }

Quel modo di catturare gli errori va semplicemente contro tutto il senso di usare una classe per il tuo layer di astrazione.
Ti consiglierei di dire a mysqli di tornare gli errori come eccezioni tramite il report_mode, così che tu possa usare il paradigma try/catch nei tuoi script per gestirli

ho fatto cosi come mi hai detto:
PHP:
function Query($sql){
		try {
        $return_sql = $this->db->query($sql);
        return $return_sql;
		} 
		catch (mysqli_sql_exception $e) {
          echo $e->__toString();
       }
    }

e nella index di prova ho messo cosi:
PHP:
<?php
ini_set('error_reporting', E_ALL);
ini_set("display_errors", 1);
include_once("database.php");
$db=new Database();
$db->connect("localhost","root","root","myDatabase");
echo "connessione effetuata";	
$sql ="INSERT INTO Uscite (importo)values('2,30')+;";
$db->Query($sql);
$db->close();
?>

non dovrebbe darmi un errore di sintassi perché ci ho messo il + in fondo alla query?

grazie mille e buona giornata e grazie a tutti per gli aiuti.

vi ringrazio molto.
 
Nel costruttore della tua classe, dopo aver creato la connessione con mysqli devi comunicare al driver di notificare gli errori sottoforma di eccezioni, così:
PHP:
/* activate reporting */
$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_STRICT;

A questo punto il try/catch dovrebbe segnalarti l'errore nella query.
 
riuscito e grazie mille. ecco il codice se gli serve a qualcun altro.

PHP:
function __construct($db_host, $db_utente, $db_password, $db_nomedb){
		/* activate reporting */
		$driver = new mysqli_driver();
		$driver->report_mode = MYSQLI_REPORT_ALL; 
        $this->db = new mysqli($db_host, $db_utente, $db_password, $db_nomedb);
    }

in questo modo me lo segnala.
ti ringrazio molto.
 

Discussioni simili