Chiamata a una funzione membro di query() on a non-object

Ottengo questo errore:

Chiamata a una funzione membro di query() on a non-object.

Anche quando utilizzo altri MySQLi funzioni, che mi dà lo stesso errore, ma per quella funzione.

Mio connection.php:

<?php
$mysqli = new mysqli("localhost","user","pass","db");
if(mysqli_connect_errno()){
  trigger_error('Connection failed: '.$mysqli->error);
}

?>

La mia funzione:

function form_year($find, $value, $from, $vehicletype){
    //Query setup
    $autoquery = "SELECT    
                        Year, 
                        Vehicle, 
                        Brand, 
                        Model, 
                        Type, 
                    FROM 
                        vehicle_tbl
                    WHERE
                        Vehicle = '".$vehicletype."'
                    GROUP BY
                        Year";
    $autoresult = $mysqli->query($autoquery);

    $search = array("%value%", "%options%");
    $rows = file_get_contents("tpl/options.html");
    while($row = $autoresult->fetch_assoc()){
        $replace = array($row[$value], $row[$value]);
        $tr .= str_replace($search, $replace, $rows);
    }
    return str_replace($find, $tr, $from);
}

Funzione e il collegamento è incluso nel caso in cui la funzione viene chiamata

La funzione non ha $mysqli nell’ambito.

OriginaleL’autore Sinan Samet | 2013-01-28

4 risposte

  1. 7

    Rapido/sporco fix:

      function form_year($find, $value, $from, $vehicletype){
        //Query setup
        global $mysqli;
        $autoquery = "SELECT  [...]
    Grazie, sei fantastico!!! Sono nuovo di mysqli ma questa risposta sembra abbastanza logica.
    Il problema globale è che non verifica la variabile che si sta utilizzando. Quindi, se si chiama la funzione prima di effettuare la connessione al database è stato fatto, si otterrà un errore.
    Grazie terrò a mente!

    OriginaleL’autore Green Black

  2. 1

    Tuo $mysqli oggetto è in ambito globale, non nel campo di applicazione della funzione. Si dovrebbe passare il mysqli oggetto alla funzione come parametro, in modo tale che vi hanno accesso. Quindi, qualcosa di simile a questo:

    function form_year($find, $value, $from, $vehicletype, $db){
        ...
        $autoresult = $db->query($autoquery);
        ...
    }

    Nota vorrei anche aggiungere alcuni convalida in funzione per assicurarsi una corretta mysqli è stato passato un oggetto, ma che non è mostrato.

    la risposta utile 🙂 Grazie

    OriginaleL’autore Mike Brant

  3. 1

    Si potrebbe desiderare di provare a eliminare la virgola dopo Type come questo potrebbe essere un errore di sintassi di MySQL stringa. Anche cercare di eco $mysqli->error e guardare ciò che si dice.

    Ah questo è solo perché ho editted i nomi di tabella e si è dimenticato che la virgola non c’ 😛 Ma grazie! La risposta di cui sopra aiutato

    OriginaleL’autore Samuel Teuber

  4. 0

    Hai per assicurarsi che il vostro $mysqli è disponibile in un determinato ambito(che non è il caso nella vostra funzione). Qualche soluzione disponibile: globale, passando per gli argomenti, singleton. Personnaly faccio di solito singleton per la mia connessione al database, qualcosa di simile:

    class DB {
    private static $_instance;
    
    public static function get() {
        if(!isset(self::$_instance)) {
            self::$_instance = new mysqli("localhost","user","pass","db");
            if(mysqli_connect_errno()) {
                trigger_error('Connection failed: '.self::$_instance->error);
            }
        }
        return self::$_instance;
    }
    }
    
    //Calling
    
    $autoresult = DB::get()->query($autoquery);

    OriginaleL’autore Rosme

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *