PHP5 + ACCESS

Tutta l'informatica

PHP5 + ACCESS

Messaggioda Fabbroz75 » mar ago 29, 2006 11:52 am

Ciao ragaz ^__^
Avendo la necessità ( purtoppo ) di dover fare una connessione ad un DB Access, mi sono scritto una routine ( partendo dalla mia fatta in ASP ) in PHP.

Posto il codice:

Codice: Seleziona tutto
<?php
$db = null;
$rs = null;
$SQLQuery = null;
$conn = null;
$database = null;
$stringa_di_connessione = null;

function OpenDB($db,$SQLQuery){
   $database = realpath($db);
   $conn = new COM("ADODB.Connection");
   $rs = new COM("ADODB.Recordset");
   $stringa_di_connessione = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=".$database;
   $conn->Open($stringa_di_connessione);
   $rs->Open($SQLQuery,$conn);
}

Function CloseCN(){
   $rs->close();
   $conn->close();
   unset($rs);
   unset($conn);
}


//** Main CODE...
   $db="../_frzdbdsn02/radica.mdb";
   OpenDB($db,"select * from contenuti");
   while (!$rs->eof) {
       print "Testo: ".$rs->fields["testo"]->value."<br>";
       $rs->MoveNext();
   }
   CloseCN();
//** end main code...
?>


Questa Routine non va...
Restituendomi:

Notice: Trying to get property of non-object in c:\Inetpub\wwwroot\rd\default.php on line 29

Notice: Trying to get property of non-object in c:\Inetpub\wwwroot\rd\default.php on line 30

Notice: Trying to get property of non-object in c:\Inetpub\wwwroot\rd\default.php on line 30
Testo:

Fatal error: Call to a member function MoveNext() on a non-object in c:\Inetpub\wwwroot\rd\default.php on line 31

*---------------------------------------------------

Mentre questa:

Codice: Seleziona tutto
<?php
$db = null;
$rs = null;
$SQLQuery = null;
$conn = null;
$database = null;
$stringa_di_connessione = null;

function OpenDB($db,$SQLQuery){
   $database = realpath($db);
   $conn = new COM("ADODB.Connection");
   $rs = new COM("ADODB.Recordset");
   $stringa_di_connessione = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=".$database;
   $conn->Open($stringa_di_connessione);
   $rs->Open($SQLQuery,$conn);
   
   //** Main CODE...
   while (!$rs->eof) {
       print "Testo: ".$rs->fields["testo"]->value."<br>";
       $rs->MoveNext();
   }
   $rs->close();
   $conn->close();
   unset($rs);
   unset($conn);
//** end main code...
   
}

   $db="../_frzdbdsn02/radica.mdb";
   OpenDB($db,"select * from contenuti");

?>


Va alla grande... solo che ho la necessità di scrivere il codice come la soluzione precendete...
Premetto che sto programmando da poco in PHP e che provengo da ASP

mi sapete aiutare? :(
A1200 Typhoon MKII (68030@40 68882@33 64mb SCSI2) | CF 1GB | HD30GB | IndivisionAGA | LCD 19" | OS3.9BB2 | WiFi

Fabrizio Radica
Creazione siti internet professionali
http://www.radicadesign.com

Alternative Italian Conference
http://aiconf.radicadesign.com
Avatar utente
Fabbroz75

Maestro
 
Messaggi: 429
Iscritto il: lun nov 08, 2004 4:39 pm
Località: Adria (Rovigo)

Re: PHP5 + ACCESS

Messaggioda riko » mar ago 29, 2006 3:49 pm

Ci sono due errori. Uno stilistico (grave) e uno contingente.
L'errore stilistico è l'uso esagerato di variabili globali.
L'errore contingente è che quelle variabili *non* sono globali (ma tu le stai usando come se lo fossero).

PHP fa schifo in tante cose, ma almeno lo scope delle variabili in questo caso lo fa giusto. Ovvero $rs che è *dentro* la funzione è diverso da $rs che è fuori.

Quando fai $rs->eof in effetti stai accedendo null, non l'oggetto COM creato prima.

Il modo corretto di programmare vuole un uso sostanzialmente nullo di globali (i globali sono ammessi solo se qualunque altra soluzione sarebbe un incubo, e anche li meglio se sono comunque oggetti abbastanza severi che permettono poche modifiche a se stessi).


Peraltro io non avrei neppure separato il codice come hai fatto tu. Ogni funzione deve avere *una* sola responsabilità.

OpenDB fa:
1) inizializza il db
2) costruisce l'oggetto com
3) apre la connessione
4) effettua la query

Oggigiorno questo sarebbe bene farlo con un oggetto, nel cui costruttore inizializzi le cose, nel cui distruttore fai quello che fai in CloseCN e con metodi apposta per fare la query e per scorrerla.

PHP ha un supporto per gli oggetti estremamente povero, ma non *così* povero.

Se comunque non vuoi programmare ad oggetti (male, malissimo!), puoi cavartela senza problemi anche con le funzioni.

Io farei una InitDB che crea la stringa di db, crea l'oggetto COM $conn, forma la stringa di connessione, apre la connessione *e* RITORNA $conn, in modo che lo puoi usare (e prende come parametro quello che per te è $db).

Una funzione che inizializza $rs (ritornandolo infine) con la stringa di query e il $conn che ti sei fatto ritornare (quindi prende due parametri).

Poi le due funzioni che puliscono $conn e $rs (non una sola *due* oggetti, *due* funzioni).

Il tuo codice principale alla fine sarà

$db="../_frzdbdsn02/radica.mdb";
$conn = OpenDB($db);
$rs = init_recordset($conn, $SQLQuery)

while (!$rs->eof) {
print "Testo: ".$rs->fields["testo"]->value."<br>";
$rs->MoveNext();
}

destroy_connection($conn)
destroy_recordset($rs)

Questo è un design accettabile. Ricorda: *no* globali. Le funzioni prendono informazioni attraverso i parametri e restituiscono come valore di ritorno (anche se in alcuni linguaggi puoi passare cose per riferimento, ma non te la complico ulteriormente).
Una funzione *un* compito.

Meglio usare oggetti quando possibile.

Quando possibile evitare PHP :)
-enrico
fibs = 0 : 1: [ a + b | (a, b) <- zip fibs (tail fibs) ]


Akropolix: Community OFF-TOPIC di IKSnet
http://www.akropolix.net/forum

"se do da mangiare a un affamato mi dicono che sono un santo, se mi chiedo perch? ? affamato mi dicono che sono un comunista" (Helder C?mara, Arcivescovo di Recife)
Avatar utente
riko

Supremo
 
Messaggi: 3329
Iscritto il: gio mar 04, 2004 4:28 pm
Località: Chiba City


Torna a Tecnologia, internet, coding

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti