allora il problema del fetch array e' che la risorsa resitutita dalla funzione mysql_query non e' una risorsa mysql.

In pratica da quello che ho visto c' dovrebbe essere un errore non tracciato nella query.

Quando esegui le query e' sempre buona norma tenere tracia se la query viene eseguita correttemente o no.

Esempio

Codice PHP:
$q =" select * from tabella where id='".$id."' AND filtro=1 order by colonna asc limit 0,10";

/*
Ora hai 2 modi per controllare l'errore
1) il modo piu' veloce ma meno controllabile
*/

$ris mysql_query($q) or die("ERRORE DI QUERY :".mysql_error() );

/*2)UN controllo un poco piu' avanzato che nn termina l'esecuzione della pagina*/
$dati =null;
if( 
$ris =@mysql_query($q)  )
{
     
/*
     codice di gestione risultato
     ESEMPIO :
     */
     
while($curr mysql_fetch_array($ris))
          echo 
"".$curr[id]." ---".$curr[filtro]."
"
;
}
else
     echo 
"ERRORE : ".mysql_error(); 

Inoltre e' vero che se l'id e' numrico e' bene non metterlo tra apici in quanto mysql lo puo' veder come stringa invece che come numero. Ma e' anche vero che se non ci sono controlli preliminari se metti una stringa al posto di un numero la query fallisce brutalmente dando errori.
Li sta al programmatore scegliere come passare i dati alla stringa di query.
usando la funzione is_numeric o la funzione floor/ceil/abs .... si possono controllare da codice i valor del campo id anche per evitare injection tipo se uno user passasse come paramentro dell'id questa stringa? "1 OR 1=1 UNION select * from users" Potrebbero nascere pèroblemi.

Cmq ti consiglio di inserire un controllo errore nell'esecuzione delle query che ti consenta sempre di tenere traccia di cosa si impalla e cosa no. Ovviamente poi ci si puo' costruire un logger sopra ma qui si va OT.


EDIT :
P.S. attento ad usare le "OR" nelle query, che come istruzioni logiche non sono esclusive per cui basta che uno dei tre casi sia vero per restituire dati.