2009-04-20 11 views
5

Così ho usato il PDO di PHP come classe goto per il mio database per un po 'di tempo, sfortunatamente oggi dopo aver eseguito il debug per un po' sul server di un client (con PHP 5.2.6 installato) Scopro this. Abbiamo provato ad aggiornare alla versione stabile più recente (5.2.9) ma il problema persiste.PDO's rowCount() Non funziona su PHP 5.2.6+

Qualcuno ha trovato una soluzione alternativa?

+0

Non sono sicuro di cosa stai cercando, stai chiamando affected_rows() e stai tornando a zero per un'istruzione select? Una selezione non influisce su nessuna riga. –

+0

Sto cercando un equivalente PDO di mysql_num_rows() –

+0

nell'ultimo anno, come hai risolto? – Strae

risposta

6

È possibile farlo tramite MySQL stesso utilizzando the FOUND_ROWS() function, non sicuro se ci sono alternative migliori.

Modifica: Sembra che l'unica ragione possibile con MySQL sia perché recupera internamente tutte le righe dei risultati e le archivia nel buffer, per poter fornire tali informazioni. Vedi mysql_unbuffered_query(). Se si utilizza quella funzione invece di mysql_query(), la funzione mysql_num_rows() non funzionerà. Se è necessario conoscere il numero di righe durante l'utilizzo di PDO, è possibile recuperare tutte le righe da PDO in un array e quindi utilizzare count().

+2

+1 Neanche l'API C di MySQL può dirvi il numero di righe, prima di recuperarle tutte. –

+0

ben rowCount() viene eseguito solo dopo aver ottenuto risultati restituiti così credo che sarebbe già essere recuperati –

1

Si noti che non è necessario utilizzare rowCount() per le query SELECT poiché PDOStatement-> rowCount() restituisce il numero di righe interessate dall'ultima istruzione DELETE, INSERT o UPDATE eseguita dall'oggetto PDOStatement corrispondente.

Invece è possibile utilizzare fetchAll() in un array e quindi count().

8

L'unico modo in cui i database possono fornire un conteggio per il numero di righe è eseguendo la query e contando il numero di righe.

L'estensione mysql utilizza una modalità di query bufferizzata per impostazione predefinita che consente di recuperare l'intero set di dati in memoria prima che il controllo venga restituito a PHP e può iniziare a elaborare le righe.

PDO utilizza una modalità senza buffer per impostazione predefinita che porta a una minore latenza nel tempo di caricamento della pagina ed è in genere ciò che si desidera. Il compromesso è che rowCount() non restituirà informazioni valide fino a quando non è stato recuperato l'intero set di dati.

Quindi come si ottiene quel conteggio?

Facile:

$q = $db->query("SELECT ..."); 
$rows = $q->fetchAll(); 
$rowCount = count($rows); 
echo "There are $rowCount rows\n"; 
foreach ($rows as $row) { 
    print_r($row); 
} 

Ma che palle, perché interroga tutte le righe di fronte e rende la mia caricamento della pagina più lento, la vecchia estensione mysql non ha avuto questo problema !?

Ma questo è esattamente ciò che la vecchia estensione mysql sta effettivamente facendo sotto le copertine; è l'unico modo per ottenere quel punteggio.

+1

Ho avuto lo stesso problema e 'risolto' con il 'fetchAll ... count()' trucco. – Strae

+0

Sto lavorando su un'applicazione e volevo fare affidamento su 'rowCount()', ma non ero sicuro del motivo per cui non era attendibile. Stava per pubblicare una domanda, ma la tua risposta lo ha più che adeguatamente coperto. +1 a voi signore –