2010-04-23 15 views
13

DOP apparentemente non ha mezzi per contare il numero di righe restituite da una query di selezione (mysqli ha la variabile num_rows).PHP DOP - Num Righe

C'è un modo per fare questo, a corto di utilizzare count($results->fetchAll())?

+1

possibile duplicato di http://stackoverflow.com/questions/460010/work-around-for-php5s-pdo-rowcount-mysql-issue - Questa domanda è uguale alla tua. La risposta accettata è ciò che desideri. – zombat

+5

Ho visto quella domanda, ma la risposta fa schifo. Eseguire una seconda query sul db solo per vedere il numero di righe che ora viene memorizzato in un set di record è davvero stupido. – Ian

risposta

12

Secondo il manuale, v'è un metodo PDOStatement->rowCount; ma non dovrebbe essere usato (citando):

Per la maggior parte dei database, PDOStatement::rowCount() non restituire il numero di righe interessate da una dichiarazione SELECT.
utilizzare invece PDO::query() a rilasciare una dichiarazione SELECT COUNT(*) con gli stessi predicati come vostro destinato SELECT dichiarazione, quindi utilizzare PDOStatement::fetchColumn() al recuperare il numero di righe che verranno essere restituiti.
L'applicazione può quindi eseguire l'azione corretta.


Se si dispone già di un set di record, e volete sapere quante linee sono in esso, dovrete recuperare i dati, utilizzando uno dei metodi fetch*; e usa il conteggio, come hai suggerito tu.

+7

Sì, quindi il mio problema. Com'è possibile che PDO * non abbia una funzione num_rows? Ogni altro connettore db lib fuori ci ce l'ha. – Ian

+0

Se possiedi i dati, puoi contare il numero di linee che contiene da solo * (come hai suggerito) *; quindi suppongo che non ci sia * reale * necessità di un metodo per farlo ... –

+5

Afferrando tutti i dati solo per il conteggio, quindi buttare via quell'array è molto dispendioso, specialmente se è un grande array .. – Ian

0

Un'altra opzione che potrebbe essere più vicina alla variabile num_rows in mysqli e alla funzione API C corrispondente mysql_num_rows(). È quello di utilizzare la funzione di MySQL FOUND_ROWS() che restituisce le stesse informazioni, senza dover contare tutti i record nel risultato di nuovo.

Esempio:

$pdoDB->query('SELECT FOUND_ROWS()')->fetchColumn() 
+0

al giorno d'oggi questa risposta non ha senso perché puoi contare il conteggio in modo regolare –

2

Sebbene DOP apparentemente ha tutti i mezzi per contare il numero di righe restituite da una query di selezione per mysql, ciò che è più importante è che non v'è inutile per tale funzione in il primo posto.

Ogni volta che avete un idea di utilizzare rowCount() per una query SELECT, sarebbe sia superfluo o addirittura dannoso. Vedere PDO rowCount():

  • nel caso in cui si hanno i dati già selezionati, questa funzione è superfluo, come si può semplicemente contare i dati
  • nel caso in cui si desidera utilizzare questa funzione per ottenere solo il conteggio, sarebbe dannoso, come non dovresti mai selezionare i dati solo per contarli. Selezionare solo il conteggio, utilizzando invece SELECT (*).
+2

Hai persino letto la risposta accettata a questa domanda? Dalla documentazione di PDO: "Se l'ultima istruzione SQL eseguita dalla PDOStatement associata era un'istruzione SELECT, alcuni database potrebbero restituire il numero di righe restituite da tale istruzione.Tuttavia, questo comportamento non è garantito per tutti i database e non dovrebbe essere invocato per applicazioni portatili. " – Ian

+3

Bene, se stai chiedendo l'applicazione portatile, non taggare la tua domanda con mysql allora. –

+0

come devo andare a contare allora? sto usando una query PHP MySQL più avanti nel documento HTML per visualizzare i dati dal database, ma l'elemento in cui voglio visualizzare il conteggio arriva prima del recupero e della visualizzazione dei dati ??? – Anthony