Newsgroup: it.comp.www.php
Titolo: [LUNGO] per ESPERTI : Ottimizzazione Interbase Class

Ciao a tutti,
Sto utilizzando una classe per gestire una connessione Interbase da
trasportarmi a mo di variabile di sessione tra una pagina e l'altra del mio
sito in php.
Il tutto gira splendidamente e la classe (che se a qualcuno interessa posso
postare) è utilissima per ottimizzare le operazioni su interbase senza
ripetere continuamente le classiche operazioni.
La questione nel mio bel file ib_class.inc è la procedura query :
function exec_query($Query_String) {
if (!$this->Link_ID)
 $this->connect();
$this->Error = "";
$this->Query_ID = @ibase_query ($this->Link_ID,$Query_String);
if (ibase_errmsg())
{ 
 $this->Error=ibase_errmsg();
 return;
}
$this->Row = -l; 
//se e' andtata a buon fine allora posso settare la classe 
$this->Query_Stmt=$Query_String; 
//COMMIT se e' una operazione di modifica 
if ((stristr($Query_String, "INSERT") != "")||
(stristr($Query_String, "UPDATE") != "")||
(stristr($Query_String, "CREATE") != "")||
(stristr($Query_String, "DELETE") != ""))
{
 ibase_commit();
}
//ritorno il link al risultato (e' gia' settato quello della classe) 
return $this->Query_ID;
}
questa funziona egregiamente, tanto che quando voglio fare una query, la sola riga da scrivere è una cosa come questa :
$db->exec_query($ssql);
dove $db è la mia variabile di sessione creata e registrata dopo l'autenticazione dell'utente.
Quando voglio creare una interrogazione :
    $ssql = "SELECT * FROM MIATABELLA";
    $db->exec_query($ssql);
    $db->metadata();
    $db->num_fields();
    if ($db->Error != "")
    {
     //segnalo errore
    }
    else  
     if ($db->affected_rows() > 0)
     {
       while ($db->next_record())
       {
        for ($i=0 ; $i < $db->Num_Fields ; $i++)
        {
         $campo = $db->Fields_Info[$i]["alias"];
         switch ($campo)
         {
          case "nomedelcampointeressato" :
           $variabile = $db->Record[$i];
           break;
          default :
           break;
         }//switch
        }//for
       }//whi
le
     }//if
le procedure che uso in questa parte di codice sono :
per creare l'array associativo con le proprietà dei campi della tabella
risulato :
function metadata() {
$c=0;
while ($campo = ibase_field_info($this->Query_ID,$c))
{
 $info[$c]["name"] = $campo["name"];
 $info[$c]["alias"] = $campo["alias"];
 $info[$c]["relation"] = $campo["relation"];
 $info[$c]["length"] = $campo["length"];
 $info[$c]["type"] = $campo["type"];
 $info[$c]["index"] = $c;
 $c++;
}
$this->Fields_Info=$info;
//array viene anche ritornato
return $info;
}
per il numero di campi della tabella risultato :
function num_fields() {
$this->Num_Fields = ibase_num_fields ($this->Query_ID);
}
per la riga successiva dalla tabella risultato :
function next_record() {
if ($this->Record = ibase_fetch_row($this->Query_ID))
{
 $this->Row += 1;
 $stat = 1;
}
else
{
 if ($this->Auto_Free)
 {
  $this->free_result();
 }
 $stat = 0;
}
//ritorno stat: 1=0K, 0=nessun reord & effettuato il free se c'è auto_free
return $stat;
}
Il punto è che vorrei ottimizzare il metodo della query in modo da non dover
accedere al valore dei campi tramite indice, ma tramite nome del campo
$db->Record["nomecampo"]; un pò come quando non uso gli oggetti per
interbase e faccio :
      $stmt = 'SELECT * FROM MIATABELLA';
      $sth = ibase_query ($dbh, $stmt);
      echo '<TABLE BORDER="1" CELLPADDING="1" CELLPADDING="1">';
      echo '<TH>CAMPO1</TH><TH>CAMPO2</TH><TH>CAMPO3</TH>';
      while ($row = ibase_fetch_object ($sth))
       {
        echo '<TR>';
        echo '<TD>' . $row->CAMPO1 . '</TD>';
        echo '<TD>' . $row->CAMPO2 . '</TD>';
        echo '<TD>' . $row->CAMPO3 . '</TD>';
        echo '</TR>';
       }
      echo '</TABLE>';
Come posso fare per ottenere dai miei metodi risultati come
$db->Record["nomecampo"] ? Avete qualche idea ?
Grazie e scusate la lunghezza !
--
RaSca
http://web.tiscalinet.it/rascasoft

Grazie e scusate la lunghezza !
Prego; fammi sapere se funziona.
Leonardo
-- 
Nior thainig ar major i dtus an lae chugainn,
is ni rabhamar fein ann i gcoir na gceart
ach mar sheolfai aoireacht bo gan aoire,
ar thaobh na greine de Sliabh na mBan.

 Prego; fammi sapere se funziona.
Grazie al codice che mi hai passato, con le modifiche del caso, direi che
funziona tutto egregiamente.
L'ho inserito nella mia ib_class e sto testando, sembra davvero tutto OK !
Se questa parte č a posto, pubblicherň l'ib_class sul mio sito, in modo da
renderla disponibile a piů persone possibili...
Grazie e mille per l'aiuto e le idee.
--
RaSca
http://web.tiscalinet.it/rascasoft