PDA

View Full Version : Controllo esistenza colonna di un record in un database Access da PHP con ADO


eureka63
10-09-2007, 13:39
Ho un database MS Access che leggo con PHP con connessione ADO. Ho scritto una funziona che mi ritorna in maniera formattata HTML tutti i record di una generica tabella. Passo query ed elenco campi (quest'ultimo viene usato per creare l'intestazione della tabella) come parametri alla funzione.

Il codice è il seguente:
print "<tr>";
for ($j = 1; $j < $numargs; $j++) {
print "<td>";
print $rs->Fields ["$arg_list[$j]"]->value;
print "</td>";
}
print "</tr>\n";Nel caso di una tabella dinamica (una pivot table) il cui elenco colonne cambia in funzione del contenuto della tabella stessa (mi serve a fare dei conteggi) il codice però da errore nei casi in cui una delle colonne elencate non esiste (perchè appunto non esiste nessun record con quel valore nella tabella di partenza).

Come faccio a controllare l'esistenza di una certa colonna? Avevo provato con la funzione array_key_exists()
if (array_key_exists("$arg_list[$j]", $rs->Fields)) {
...
}
ma restituisce sempre FALSE anche per i campi presenti.

Qualcuno sa come fare?

usernameIsAlreadyInUse
10-09-2007, 13:46
Cosi dovresti riuscire a leggere le informazioni che ti servono

$query = "SELECT * FROM Employee LIMIT 1";
$result = mysql_query($query);
$fields = mysql_num_fields($result);

for($count=0;$count<$fields;$count++) {
$field = mysql_fetch_field($result,$count);
echo "<p>$field->name $field->type ($field->max_length)</p>";
}

eureka63
10-09-2007, 13:52
Cosi dovresti riuscire a leggere le informazioni che ti servono

Hum, io sto usando Access e non MySQL e la lista dei possibili campi la passo già come parametro. Vorrei che, se un campo non esiste, venga saltato.

usernameIsAlreadyInUse
10-09-2007, 13:54
Presumo che tu faccia una query usando quella lista di campi, quindi se uno dei campi non c'è dovrebbe darti errore l'esecuzione della query...o sbaglio?

eureka63
10-09-2007, 14:08
Presumo che tu faccia una query usando quella lista di campi, quindi se uno dei campi non c'è dovrebbe darti errore l'esecuzione della query...o sbaglio?Esatto, quando arrivo nel campo che non c'è, viene restituito l'errore

Warning: printsqltable():
Invoke() failed: Exception occurred.
Source: ADODB.Fields
Description: Item cannot be found in the collection corresponding to the requested name or ordinal.
in Statistics.php on line 177printsqltable() è la mia funzione nel file Statistics.php

usernameIsAlreadyInUse
10-09-2007, 14:14
Ma l'errore te lo da in fase di esecuzione della query o quando incominci a stamparti i campi, se te lo da nel secondo caso potresti racchiudere l'istruzione in un try...catch e risolvi.

eureka63
10-09-2007, 14:23
Ma l'errore te lo da in fase di esecuzione della query o quando incominci a stamparti i campi, se te lo da nel secondo caso potresti racchiudere l'istruzione in un try...catch e risolvi.In fase di esecuzione.

Non ho mai usato try and catch. Ci proverò se non trovo come far funzionare la array_key_exists() che in teoria dovrebbe servire proprio a questo scopo (se non ho capito male).

usernameIsAlreadyInUse
10-09-2007, 14:26
Come ti dicevo, visto che il problema te lo da in fase di esecuzione della query, non puoi usare il try...catch e nemmeno altre istruzioni php perchè è ado che ti da l'errore, dovresti cercare a questo punto di intervenire sulla lista di campi che passi in modo da passarglieli correti.

eureka63
10-09-2007, 14:34
Come ti dicevo, visto che il problema te lo da in fase di esecuzione della query, non puoi usare il try...catch e nemmeno altre istruzioni php perchè è ado che ti da l'errore, dovresti cercare a questo punto di intervenire sulla lista di campi che passi in modo da passarglieli correti.Ops, avevo capito male. Vedrò cosa posso fare.

usernameIsAlreadyInUse
10-09-2007, 14:36
In alternativa puoi fare sempre una select * poi farti restituire i nomi dei campi e cilcando li confronti con quelli della tua lista e stampi solo quelli che ti interessano, però creado che eseguire precisamente la queri corretta sia la soluzione migliore.