2009-04-20 18 views
5

Así que he estado usando el PDO de PHP como clase de base de datos por un tiempo, desafortunadamente hoy después de depurar por un tiempo en el servidor de un cliente (con PHP 5.2.6 instalado) descubro this. Intentamos actualizar a la versión estable más reciente (5.2.9), pero el problema persiste.PDC's rowCount() No funciona en PHP 5.2.6+

¿Alguien ha encontrado una solución?

+0

No estoy seguro de lo que está buscando, ¿está llamando a affected_rows() y vuelve a cero para una instrucción seleccionada? Una selección no afecta ninguna fila. –

+0

Estoy buscando un equivalente PDO de mysql_num_rows() –

+0

en el último año, ¿cómo lo resolvió? – Strae

Respuesta

6

Puede hacerlo a través de MySQL mediante el uso de the FOUND_ROWS() function, no estoy seguro si hay mejores alternativas.

Editar: Parece que la única razón por la que esto fue posible con MySQL es porque internamente extrajo todas las filas de resultados y las guardó en el búfer, para poder darle esta información. Ver mysql_unbuffered_query(). Si usa esa función en lugar de mysql_query(), la función mysql_num_rows() no funcionará. Si realmente necesita saber el número de filas mientras utiliza PDO, puede obtener todas las filas de PDO en una matriz y luego usar count().

+2

+1 Ni siquiera la API C de MySQL puede indicarle el número de filas, antes de obtenerlas todas. –

+0

bien rowCount() solo se ejecuta DESPUÉS de obtener resultados devueltos, así que creo que ya se buscaron –

1

Observe que no debe usar rowCount() para consultas SELECT ya que PDOStatement-> rowCount() devuelve el número de filas afectadas por la última instrucción DELETE, INSERT o UPDATE ejecutada por el objeto PDOStatement correspondiente.

En su lugar, puede usar fetchAll() en una matriz y luego count().

8

La única forma en que las bases de datos pueden darle un recuento para el número de filas es ejecutando la consulta y contando el número de filas.

La extensión mysql utiliza un modo de consulta almacenado de forma predeterminada que hace que todo el conjunto de datos se almacene en la memoria antes de devolver el control a PHP y puede comenzar a procesar las filas.

PDO utiliza un modo sin búfer por defecto, lo que conduce a una latencia más baja en el tiempo de carga de la página y generalmente es lo que desea. La compensación es que rowCount() no devolverá información válida hasta que se haya recuperado todo el conjunto de datos.

Entonces, ¿cómo se obtiene ese conteo?

Fácil:

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

Pero eso apesta porque consulta todas las filas en la delantera y hace que mi carga de la página más lenta, la extensión MySQL de edad no tenía este problema !?

Pero eso es exactamente lo que la antigua extensión de mysql está haciendo bajo las sábanas; es la única forma de lograrlo.

+1

Tengo el mismo problema y 'resuelto' con el truco 'fetchAll ... count()'. – Strae

+0

Estoy trabajando en una aplicación y quería confiar en 'rowCount()', pero no estaba seguro de por qué no era confiable. Estaba a punto de publicar una pregunta, pero su respuesta la cubrió más que adecuadamente. +1 a usted señor –