Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problemi con una funzione e la programmazione ad oggetti

    Ciao ragazzi,
    sto avviandomi alla programmazione ad oggetti e ci sono diverse cose che non mi sono troppo chiare...

    Ad esempio non capisco come potere risolvere il seguente errore:

    Fatal error: Call to a member function on a non-object

    ottenuto quando cerco di richiamare una funzione che al suo interno prevede chiamate ad una classe esterna...

    Nello specifico, cerco di richiamare tramite

    $prova = validate_username($_POST['username']);

    la seguente funzione

    Codice PHP:
    function validate_username($username)
    {
        global 
    $db$lang$userdata;

        
    // Remove doubled up spaces
        
    $username preg_replace('#\s+#'' 'trim($username)); 
        
    $username phpbb_clean_username($username);

        
    $sql "SELECT username 
            FROM " 
    USERS_TABLE "
            WHERE LOWER(username) = '" 
    strtolower($username) . "'";
        if (
    $result $db->sql_query($sql))
        {
            while (
    $row $db->sql_fetchrow($result))
            {
                if ((
    $userdata['session_logged_in'] && $row['username'] != $userdata['username']) || !$userdata['session_logged_in'])
                {
                    
    $db->sql_freeresult($result);
                    return array(
    'error' => true'error_msg' => $lang['Username_taken']);
                }
            }
        }
        
    $db->sql_freeresult($result);

        
    $sql "SELECT group_name
            FROM " 
    GROUPS_TABLE 
            WHERE LOWER(group_name) = '" 
    strtolower($username) . "'";
        if (
    $result $db->sql_query($sql))
        {
            if (
    $row $db->sql_fetchrow($result))
            {
                
    $db->sql_freeresult($result);
                return array(
    'error' => true'error_msg' => $lang['Username_taken']);
            }
        }
        
    $db->sql_freeresult($result);

        
    $sql "SELECT disallow_username
            FROM " 
    DISALLOW_TABLE;
        if (
    $result $db->sql_query($sql))
        {
            if (
    $row $db->sql_fetchrow($result))
            {
                do
                {
                    if (
    preg_match("#\b(" str_replace("\*"".*?"preg_quote($row['disallow_username'], '#')) . ")\b#i"$username))
                    {
                        
    $db->sql_freeresult($result);
                        return array(
    'error' => true'error_msg' => $lang['Username_disallowed']);
                    }
                }
                while(
    $row $db->sql_fetchrow($result));
            }
        }
        
    $db->sql_freeresult($result);

        
    $sql "SELECT word 
            FROM  " 
    WORDS_TABLE;
        if (
    $result $db->sql_query($sql))
        {
            if (
    $row $db->sql_fetchrow($result))
            {
                do
                {
                    if (
    preg_match("#\b(" str_replace("\*"".*?"preg_quote($row['word'], '#')) . ")\b#i"$username))
                    {
                        
    $db->sql_freeresult($result);
                        return array(
    'error' => true'error_msg' => $lang['Username_disallowed']);
                    }
                }
                while (
    $row $db->sql_fetchrow($result));
            }
        }
        
    $db->sql_freeresult($result);

        
    // Don't allow " and ALT-255 in username.
        
    if (strstr($username'"') || strstr($username'"') || strstr($usernamechr(160)))
        {
            return array(
    'error' => true'error_msg' => $lang['Username_invalid']);
        }

        return array(
    'error' => false'error_msg' => '');

    e l'errore si riferisce a questa riga:

    $db->sql_freeresult($result);


    Grazie per l'aiuto

  2. #2
    per poter richiamare un metodo della classe, $db deve essere un'istanza di quella classe, quindi prima di richiamare un metodo $db deve essere inizializzato in questo modo: $db=new NomeCostruttore();




    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  3. #3
    Non ho capito bene dove devo inizializzare il metodo... prima di cercare di applicare quella funzione al mio $_POST?

    In ogni caso ti allego anche la classe:
    Codice PHP:
    class sql_db
    {

        var 
    $db_connect_id;
        var 
    $query_result;
        var 
    $row = array();
        var 
    $rowset = array();
        var 
    $num_queries 0;

        
    //
        // Constructor
        //
        
    function sql_db($sqlserver$sqluser$sqlpassword$database$persistency true)
        {

            
    $this->persistency $persistency;
            
    $this->user $sqluser;
            
    $this->password $sqlpassword;
            
    $this->server $sqlserver;
            
    $this->dbname $database;

            if(
    $this->persistency)
            {
                
    $this->db_connect_id = @mysql_pconnect($this->server$this->user$this->password);
            }
            else
            {
                
    $this->db_connect_id = @mysql_connect($this->server$this->user$this->password);
            }
            if(
    $this->db_connect_id)
            {
                if(
    $database != "")
                {
                    
    $this->dbname $database;
                    
    $dbselect = @mysql_select_db($this->dbname);
                    if(!
    $dbselect)
                    {
                        @
    mysql_close($this->db_connect_id);
                        
    $this->db_connect_id $dbselect;
                    }
                }
                return 
    $this->db_connect_id;
            }
            else
            {
                return 
    false;
            }
        }

        
    //
        // Other base methods
        //
        
    function sql_close()
        {
            if(
    $this->db_connect_id)
            {
                if(
    $this->query_result)
                {
                    @
    mysql_free_result($this->query_result);
                }
                
    $result = @mysql_close($this->db_connect_id);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }

        
    //
        // Base query method
        //
        
    function sql_query($query ""$transaction FALSE)
        {
            
    // Remove any pre-existing queries
            
    unset($this->query_result);
            if(
    $query != "")
            {
                
    $this->num_queries++;

                
    $this->query_result = @mysql_query($query$this->db_connect_id);
            }
            if(
    $this->query_result)
            {
                unset(
    $this->row[$this->query_result]);
                unset(
    $this->rowset[$this->query_result]);
                return 
    $this->query_result;
            }
            else
            {
                return ( 
    $transaction == END_TRANSACTION ) ? true false;
            }
        }

        
    //
        // Other query methods
        //
        
    function sql_numrows($query_id 0)
        {
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                
    $result = @mysql_num_rows($query_id);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_affectedrows()
        {
            if(
    $this->db_connect_id)
            {
                
    $result = @mysql_affected_rows($this->db_connect_id);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_numfields($query_id 0)
        {
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                
    $result = @mysql_num_fields($query_id);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_fieldname($offset$query_id 0)
        {
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                
    $result = @mysql_field_name($query_id$offset);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_fieldtype($offset$query_id 0)
        {
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                
    $result = @mysql_field_type($query_id$offset);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_fetchrow($query_id 0)
        {
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                
    $this->row[$query_id] = @mysql_fetch_array($query_id);
                return 
    $this->row[$query_id];
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_fetchrowset($query_id 0)
        {
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                unset(
    $this->rowset[$query_id]);
                unset(
    $this->row[$query_id]);
                while(
    $this->rowset[$query_id] = @mysql_fetch_array($query_id))
                {
                    
    $result[] = $this->rowset[$query_id];
                }
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_fetchfield($field$rownum = -1$query_id 0)
        {
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                if(
    $rownum > -1)
                {
                    
    $result = @mysql_result($query_id$rownum$field);
                }
                else
                {
                    if(empty(
    $this->row[$query_id]) && empty($this->rowset[$query_id]))
                    {
                        if(
    $this->sql_fetchrow())
                        {
                            
    $result $this->row[$query_id][$field];
                        }
                    }
                    else
                    {
                        if(
    $this->rowset[$query_id])
                        {
                            
    $result $this->rowset[$query_id][0][$field];
                        }
                        else if(
    $this->row[$query_id])
                        {
                            
    $result $this->row[$query_id][$field];
                        }
                    }
                }
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_rowseek($rownum$query_id 0){
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }
            if(
    $query_id)
            {
                
    $result = @mysql_data_seek($query_id$rownum);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_nextid(){
            if(
    $this->db_connect_id)
            {
                
    $result = @mysql_insert_id($this->db_connect_id);
                return 
    $result;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_freeresult($query_id 0){
            if(!
    $query_id)
            {
                
    $query_id $this->query_result;
            }

            if ( 
    $query_id )
            {
                unset(
    $this->row[$query_id]);
                unset(
    $this->rowset[$query_id]);

                @
    mysql_free_result($query_id);

                return 
    true;
            }
            else
            {
                return 
    false;
            }
        }
        function 
    sql_error($query_id 0)
        {
            
    $result["message"] = @mysql_error($this->db_connect_id);
            
    $result["code"] = @mysql_errno($this->db_connect_id);

            return 
    $result;
        }

    // class sql_db

    // if ... define 

  4. #4
    Nessun aiutino? :master:

  5. #5
    Guarda che nel post precedente al ultimo tuo c'è tutto quello che ti serve per risolvere il problema.

    In pratica funziona cosi....

    La classe che hai postato è per l'appunto una classe ovvero un insieme di campi dati, costruttori, distruttori e metodi.

    Un oggetto non è una classe. OGGETTO non è sinonimo di CLASSE ma bensi ne è una istanza.
    Quindi per chiarire il concetto di un certo tipo di classe ce ne è una sola (esempio la tua classe DB) di oggetti volendo ce ne possono essere mille mila ma tutti del tipo DB (tua classe).

    Generalizzando ancora di più una classe la possiamo immaginare come uno stampo per fare i biscotti mentre i singoli biscottini sono i tuoi oggetti tutti a forma della tua classe ma ognuno per i fatti suoi.

    Concludendo ti viene fuori quell'errore perchè stai utilizzando la variabile db come una variabile a caso e non come oggetto della tua classe DB.

    Per rendere db un ogggetto devi costruire un oggetto della classe DB uno e assegnarlo alla variabile db utilizzando l'apposito costruttore che nel tuo pezzo di codice è commentato come CONSTRUCTOR

    $db= new sql_db($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true);

    dove al posto di quelle variabili ci metti le cose giuste.

    Spero che sia tutto chiaro
    Erebigal

  6. #6
    Sei molto gentile e ti ringrazio...

    tuttavia continuo a non capire cosa devo fare per richiamare correttamente la funzione validate_username in

    $prova = validate_username($_POST['username']);

    per non incorrere nell'errore suddetto...

    Scusami

  7. #7
    Ok....allora in 2 parole hai presente la riga sotto la dichiarazione della tua funzione hai una variabile

    global $db giusto??

    C'è un posto specifico dove la inizializzi? Perchè se non la inizializzi succede proprio quello che tu non vuoi.

    Dove inizializzi la variabile db??????? Dove ti costruisci l'oggetto? Se la risposta è da nessuna parte allora devi farlo altrimenti siamo sempre da capo.

    Se non sei convinto fai una prova. Nel file di configurazione o dove vuoi tu scrivi

    $db=new sql_db($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true); (sempre con le cose giuste)

    devi essere sicuro che il file della classe sia accedibile da dove chiami il costruttore


    ....dovrebbe essere tutto....
    Erebigal

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.