[PHP] metodo di una classe per estrarre i dati con ciclo while

amhal

Utente Attivo
17 Feb 2011
86
1
8
Buongiorno a tutti, ho cominciato da poco a programmare in OOP e mi sono intoppato nel creare un metodo di una classe per l'estrazione di tutti i dati che vada bene per tutte le query che vengono eseguite. Per essere più chiaro posto il codice creato:


PHP:
 //preparazione query
    public function prepare($query){
        $this->query = $query;
        return true;
    }//fine metodo prepare  
    
    //metodo dell'esecuzione della query
    public function query(){
    
        if(isset($this->query)){
            //controllo se la query è valida
            $this->result = $this->mysqli->query($this->query);
                //controllo se result è valido
                if(!$this->result){
                    exit('errore nella query %s '.$this->mysqli->error);
                    return false;               
                }//fine if nidificata       
        }//fine if   
    }//fine metodo esecuzione query
    
    //estrazione dei dati, $type varia a seconda di come voglio i dati estratti: array,oggetto
    public function fetch($type){
        //processo $type in uno switch
        switch($type){
            case 'array':
               while($row = $this->result->fetch_object()){
              
                return $row;
                }
            break;
            
            case 'object':           
                
                while($row = $this->result->fetch_object()){
                    return $row;
                }

            break;
        }//fine switch
        
        $this->result->close()
        
    }//fine metodo fetch estrazione dati
la parte che non mi funziona è il ciclo while nel metodo fetch sia nel caso object sia nel caso array, se nella index.php includo la classe e lancio i metodi, mi viene a video solo un record del database invece di tutti e 7 presenti. di seguito posto il codice della index

PHP:
require_once('database/class_login.php');
$obj = new access_db();

$obj->prepare("select * from utenti");
$obj->query();
$row = $obj->fetch('object');

echo $row->nome;
come faccio a eseguire correttamente il ciclo while nel metodo fetch della classe e poter utilizzare tutti i record nella index.php?

grazie in anticipo
 

marino51

Utente Attivo
28 Feb 2013
2.739
141
63
Lombardia
vorrei suggerirti una via diversa perchè credo che quello che stai facendo sia già o ti porti fuori strada,
nella mia poca e confusa esperienza, ho definito questi metodi che mi sono sufficienti per tutte le query fin'ora incontrate,

PHP:
  public function queryS( $sql, $params=array() ) // return the retrieved dataset
  {
    return $this->BindParams( $sql, $params )->fetchALL();
  }

  public function queryM( $sql, $params=array() ) // return the counter of the involved rows (insert, update, delete)
  {
    return $this->BindParams( $sql, $params )->rowCount();
  }

  public function queryC( $sql, $params=array() ) // return the retrieved element
  {
    $res = ($this->BindParams($sql, $params)->fetch()); return empty($res) ? "" : current($res);
  }

  public function query( $sql, $params=array() ) // return $sth, the object for subsequent operation
  {
    return $this->BindParams( $sql, $params );
  }
queryS risolve una select e restituisce l'intero set dei dati trovati,
queryM restituisce il numero delle righe coinvolte nell'operazione, ha soprattutto lo scopo di controllare l'efficacia dell'operazione stessa
queryC ritorna l'unico elemento della select, esempio "count(*)" oppure un codice espressamente cercato, in ogni caso un unico valore
query permette invece la gestione successiva di quanto è stato "trovato"

il risultato lo si ottiene con questo esempio,
PHP:
$sql = "SELECT * FROM PERIODI WHERE id_periodo IN( ?, ?, ? ) and id_struttura=?";
foreach ( $db->query( $sql, array( 11, 13, 15, 2 ) ) as $row )
  echo $row['id_periodo']."&emsp;".$row['id_struttura']."&emsp;".$row['data_inizio']."&emsp;".$row['data_fine']."<br />";
ps, se la query non avesse parametri (perchè codificati all'interno), si semplifica così, "$db->query( $sql )"

valuta la differenza con quanto stai facendo
 
Ultima modifica: