Come spesso accade, questa domanda è confusa da morire. Le persone vengono qui con in mente due diversi compiti :
- Devono sapere quante righe nella tabella
- Devono sapere se una query ha restituito delle righe
Sono due compiti assolutamente diversi che non hanno nulla in comune e non possono essere risolti con la stessa funzione. Ironia della sorte, per nessuno dei duePDOStatement::rowCount()
deve essere utilizzata la funzione effettiva .
Vediamo perché
Conteggio delle righe nella tabella
Prima di usare DOP ho semplicemente usato mysql_num_rows()
.
Significa che hai già fatto male. L'utilizzo mysql_num_rows()
o il rowCount()
conteggio del numero di righe nella tabella è un vero disastro in termini di consumo delle risorse del server. Un database deve leggere tutte le righe dal disco, consumare la memoria sul server di database, quindi inviare tutto questo mucchio di dati a PHP, consumando anche la memoria del processo PHP, caricando il server senza motivo.
Inoltre, selezionare le righe solo per contarle semplicemente non ha senso. È count(*)
invece necessario eseguire una query. Il database conteggerà i record dall'indice, senza leggere le righe effettive e quindi verrà restituita solo una riga.
A tal fine, il codice suggerito nella risposta accettata è equo.
Contando le righe numeriche restituite.
Il secondo caso d'uso non è così disastroso quanto piuttosto inutile: nel caso tu abbia bisogno di sapere se la tua query ha restituito dei dati, hai sempre i dati stessi!
Ad esempio, se stai selezionando solo una riga. Va bene, puoi usare la riga recuperata come flag:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
Nel caso in cui sia necessario ottenere più righe, è possibile utilizzare fetchAll()
.
fetchAll()
è qualcosa che non vorrò perché a volte potrei avere a che fare con set di dati di grandi dimensioni
Sì, certo, per il primo caso d'uso sarebbe due volte più cattivo. Ma come abbiamo già appreso, non selezionare le righe solo per contarle, né con rowCount()
né fetchAll()
.
Ma nel caso in cui utilizzerai effettivamente le righe selezionate, non c'è nulla di sbagliato nell'uso fetchAll()
. Ricorda che in un'applicazione web non dovresti mai selezionare un numero enorme di righe. Solo le righe che saranno effettivamente utilizzati in una pagina web dovrebbero essere selezionati, quindi hai avuto modo di uso LIMIT
, WHERE
o di una clausola simile nel vostro SQL. E per una quantità così moderata di dati è tutto a posto fetchAll()
. E ancora, basta usare il risultato di questa funzione nella condizione:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
E naturalmente sarà una follia assoluta eseguire una query aggiuntiva solo per dire se l'altra query ha restituito delle righe, come suggerito nelle due risposte principali.
Contando il numero di righe in un set di risultati di grandi dimensioni
In un caso così raro quando è necessario selezionare una quantità enorme di righe (ad esempio in un'applicazione console), è necessario utilizzare una query senza buffer , al fine di ridurre la quantità di memoria utilizzata. Ma questo è il caso reale quando rowCount()
non sarà disponibile , quindi non è utile anche per questa funzione.
Quindi, questo è l'unico caso d'uso in cui potrebbe essere necessario eseguire una query aggiuntiva, nel caso in cui sia necessario conoscere una stima ravvicinata del numero di righe selezionate.