Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    Use of undefined constant DB_HOST - assumed 'DB_HOST'

    Codice PHP:
    // Server su cui risiede il database
    define('DB_HOST''localhost');

    // Username per accedere al database
    define('DB_USER''');
        
    // Password per accedere al database
    define('DB_PASS''');
        
    // Nome del database
    define('DB_NAME''');

    ...

    $conn mysql_connectDB_HOSTDB_USERDB_PASS ); 
    ed ho il seguente errore:

    Notice: Use of undefined constant DB_HOST - assumed 'DB_HOST'


    Non riesco a capire il perchè...
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Cosa c'e' tra la dichiarazione delle costanti e l'apertura della connessione?

    Per controllare se e' settata una costante puoi usare defined() - http://php.net/manual/en/function.defined.php

    P.S.: evita mysql_connect()... prova ad usare PDO

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Codice PHP:
    <?php

    // Includo il file di configurazione
    include_once "config.php";

    class 
    Database
    {
        
    // A static property to hold the single instance of the class
        
    private static $instance;
        
        private 
    $result;
        
    //private $num_rows;
        
        // Connessione
        
    private $conn;
        
        
        
    // Il costruttore è privato e per questo non può essere istanziato
        
    private function __construct() {
            
    $this->conn self::connect();
        }

        
    // All code that needs to get and instance of the class should call
        // this function like so: $db = Database::getInstance();
        
    public static function getInstance()
        {
            
    // If there is no instance, create one
            
    if (!isset(self::$instance)) {
                
    $c __CLASS__;
                
    self::$instance = new $c;
            }
            return 
    self::$instance;
        }
        
        
    // Metodo per connettersi al database
        
    public static function connect() {
            
            
    $conn mysql_connectDB_HOSTDB_USERDB_PASS );
            
            if ( !
    $conn ) {
                throw new 
    Exception__CLASS__ ': ' mysql_error() );
            } else {            
                
    mysql_select_dbDB_NAME$conn );
                
                return 
    $conn;
            }
        }    
    }
    Ecco qui puoi vedere cosa c'è.
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Il problema è che la classe Database che stai usando non riesce a vedere DB_HOST, DB_USER e DB_PASS, perché non sono all'interno del global scope.

    Leggi qui: http://php.net/manual/en/language.variables.scope.php

    Una possibile soluzione è di passare i parametri al costruttore o alla funzione connect(), tipo così:

    Codice PHP:
    private $host;
    private 
    $user;
    private 
    $pass;

    public function 
    __construct($host$user$pass) {
      
    $this->host $host;
      
    $this->user $user;
      
    $this->pass $pass;    

    Ti sconsiglio invece di usare il global scope, e' considerata ormai bad practice per motivi che onestamente non conosco (immagino di sicurezza, ma magari qualcuno piu' informato di me puo' illuminarci, o se ti interessa puoi approfondire il discorso per conto tuo).


  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Però qui c'è un problema, cioè che io non chiamo mai direttamente connect(), ma bensì richiamo getInstance, il quale se non esiste alcuna istanza della classe Database, istanzia un nuovo oggetto della classe database e lo restituisce altrimenti restituisce l'istanza già creata precedentemente.
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Quindi? Qual e' il problema?

    Prima di chiamare getInstance() immagino che da qualche parte hai un altro oggetto/metodo per creare l'istanza passandogli i parametri di connessione... correggimi se sbaglio

  7. #7
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ti sbagli.

    Io farò semplicemente:

    Codice PHP:
    $db Database::getInstance(); 
    getInstance() è statico quindi posso fare questa chiamata a metodo

    quindi immagino che dovrò fare una cosa del tipo:

    Codice PHP:

    Class ClasseInCuiMiServeIlDatabase {
         
    $db Database::getInstance();

         public 
    void foo() {
            
    $db->query("quilaquery");
            ...
         }

    per usare il database in un'altra classe .

    L'unica cosa che non riesco a capire e come passare i parametri di connessione al Database, poichè non richiamerò connect, ma verrà fatto internamente in Database, per questo usavo un file config.php con delle costanti.
    Con i sogni possiamo conoscere il futuro...

  8. #8
    Ah, forse ho capito.

    La classe Database che stai usando probabilmente era intesa da utilizzare come un "IoC container" per implementare la dependency injection.

    Se e' cosi' significa che non dovresti implementare nessun metodo connect() li' dentro, perche' la classe ha il solo scopo di ritornare un'istanza di se stessa (per astrarre le tue classi dal DBMS che andrai ad utilizzare).

    In ogni caso pero' devi avere un driver per connetterti al database. Nel tuo caso potresti tranquillamente usare PDO, facendo qualcosa del genere:

    Codice PHP:
    <?php



    try {
      
    $db = new PDO/* qui ci metti i parametri di connessione */ );
    } catch (
    PDOException $e) {
      echo 
    "PDOException: " $e->getMessage();
    }

    // inizializzo il container.
    // qui do' per scontato che ci sia un setter 
    // chiamato init() all'interno della classe Database
    Database::init($db);
    Successivamente all'interno delle tue classi che hanno bisogno del database dovrai semplicemente richiamare Database::getInstance(), come hai giustamente immaginato.


  9. #9
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Originariamente inviato da Simo990
    Il problema è che la classe Database che stai usando non riesce a vedere DB_HOST, DB_USER e DB_PASS, perché non sono all'interno del global scope.

    Leggi qui: http://php.net/manual/en/language.variables.scope.php
    Scusa, ma questo non è corretto per niente. Il link che hai postato si riferisce alle variabili e non alle costanti.
    Le costanti sono SEMPRE global
    Like superglobals, the scope of a constant is global. You can access constants anywhere in your script without regard to scope. For more information on scope, read the manual section on variable scope.
    http://www.php.net/manual/en/language.constants.php

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  10. #10
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Direi che sarà un problema dell'include. Come anche su http://forum.html.it/forum/showthrea...readid=1532265

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.