2009-04-23 3 views
6

ho questo codice:Verifica della validità MySQL risorsa risultato

$rows = array(); 
$res = mysql_query($someQuery); 

if(!mysql_errno()) 
    while($row = mysql_fetch_assoc($res)) 
     $rows[] = $row; 

$someQuery è una query arbitraria che scrivo in una forma. Il mysql_errno prende il caso quando scrivo una query mysql con errori al suo interno. Ma, ho appena scoperto che quando faccio una query "Elimina da table_name", ovviamente non è un errore, ma allo stesso tempo il mysql_fetch_assoc fallisce con un "Warning: mysql_num_rows(): l'argomento fornito non è un risultato MySQL valido risorsa in /blah/blah/file.php sulla riga x ".

Ho provato a cercarlo nel manuale (forse sono solo cieco ...) ma c'è una funzione che posso usare per verificare se $ res è una risorsa valida per i risultati MySQL o no?

+0

possibile duplicato di [Avviso: mysql_fetch_ * si aspetta che il parametro 1 sia risorsa, errore dato booleano] (http://stackoverflow.com/questions/11674312/warning-mysql-fetch-expects-parameter-1-to-be -resource-boolean-given-error) – j0k

risposta

7

if ($res) dovrebbe funzionare correttamente per verificare se si tratta di una risorsa. is_resource() determinerà se è una risorsa valida.

Si potrebbe anche verificare mysql_affected_rows per cercare di determinare se si tratta di un INSERT/UPDATE/etc

0

Se si INSERISCA, AGGIORNA, ELIMINA o GOCCIA tramite mysql_query, restituirà solo true o false (in base al successo dell'operazione).

Non sono sicuro di cosa si aspetta che la risorsa contenga in questa istanza?

Se è necessario il numero di righe interessate, è possibile utilizzare mysql_affected_rows().

2

mysql_query() rendimenti true o false modo da poter controllare in questo modo:

if($res) { 
    // The query succeeded. 
} 
+8

Mentre questo è vero nel caso in cui la domanda è stata descritta, è un po 'fuorviante. mysql_query() restituisce true o false se la query ha modificato il database in qualche modo (DELETE, INSERT, DROP, ecc.). Ma se la query è SELECT, SHOW, DESCRIBE o EXPLAIN, restituisce una risorsa. –

0

Forse basta cambiare la condizione a:

if(!mysql_errno() && @mysql_num_rows($res) > 0) 

Il condizionale avrà esito negativo se non ci sono righe, e @ sarà s sollevare l'avviso.

3

Insieme a is_resource() è possibile utilizzare get_resource_type() per verificare se si tratta di una risorsa MySQL.

$res_type = is_resource($res) ? get_resource_type($res) : gettype($res); 

if(strpos($res_type, 'mysql') === false) { 
    echo 'Invalid resource type: ' . $res_type; 
} 

get_resource_type() può restituire "mysql link" o "mysql link persistent" a seconda del tipo di connessione.

+1

Se google porta qualcuno qui, la suddetta tecnica di soppressione degli avvisi non funziona per il tipo di risorsa '" odbc link "'. –