mysqli_num_rows() expects parameter 1 to be mysqli_result php - fix

Giorgio Borelli

Se anche tu durante il tuo sviluppo "web" fatto con PHP e MySql hai ricevuto l'errore:

"mysqli_num_rows() expects parameter 1 to be mysqli_result"

e non hai idea di come questo si sia potuto verificare, allora sei nel posto giusto per capire cosa sia successo, il perché del verificarsi del messaggio d'errore e come risolverlo in pochi secondi. Andiamo a vedere come fare.

Suppongo tu abbia un pezzo di codice php molto simile a questo:

 

//... open database
$resultset = mysqli_query($link,'SELECT * FROM MyTable WHERE id='.$idpost) or die(mysqli_error($link));
//... close database
return mysqli_num_rows($resultset);

 

A questo punto all'esecuzione dello script php, proprio alla riga interessata dal comando mysqli_num_rows(), vedi segnalarti da parte dell'interprete PHP l'errore "mysqli_num_rows() expects parameter 1 to be mysqli_result"

La mysqli_num_rows() normalmente ritorna un intero indicante il numero di record coninvolti nella query precedente (resultset), in questo caso ritorna però un messaggio di errore e sembra che questo sia legato al parametro passatogli, il resultset, che altro non è che una risorsa di ogetti restituito dalla query mysqli_query (l'interrogazione SELECT al database MySql), ed il problema infatti sta proprio lì e non tanto nella mysqli_num_rows, infatti la mysqli_query quando tutto va a buon fine (nell'interrogazione SELECT dal database) restituisce un insieme di oggetti (gli oggetti records chiamati tecnicamente mysqli_result) ma se per un qualche motivo la query fallisce o vi è un errore nella sua sintassi questa restituisce FALSE.

Ecco svelato l'arcano dell'errore, la mysqli_num_rows in caso di errore della query riceve come parametro un FALSE e non un insieme di oggetti mysqli_result (che è il parametro aspettato) fornendo così in uscita quel messaggio di errore.

Per evitare che esso compaia, dobbiamo fare un controllo a monte, quindi scriveremo il nostro codice in questo modo:

 

//... open database
$resultset = mysqli_query($link,'SELECT * FROM MyTable WHERE id='.$idpost) or die(mysqli_error($link));
//... close database
if($resultset)
    return mysqli_num_rows($resultset);
else 
return 0;

 

In questo caso abbiamo aggiunto un controllo if, che verifica che il resultset ritornato non sia FALSE, qualsiasi cosa che non sia null o false passerà il controllo if assegnando alla mysqli_num_rows un parametro corretto, ed eviteremo così in maniera preventiva manifestarsi dell'errore "mysqli_num_rows() expects parameter 1 to be mysqli_result".

L'unica cosa a cui porre attenzione è che nel caso di utilizzo dello statement if - else, se facciamo ritornare il valore 0 (zero) in caso di FALSE, non ci accorgeremmo di un possibile errore, magari di battitura, nella query SQL al nostro database, e saremmo indotti a pensare che non vi siano records ritornati, pertanto sarebbe meglio tornare un messaggio di errore di tipo testuale così da poterne verificare poi a livello di codice una qualche eventuale anomalia, cosa fattibilissima poiché essendo PHP un linguaggio non fortemente tipizzato, una sua funzione può anche tornare tipi diversi.

Per altre domande o dubbi poneteli tramite l'apposito spazio dei commenti.

Categorie: PHP

Tags: ,

Aggiungi Commento

biuquote
Loading