¿PDO dos consultas, una para filas encontradas y otra para resultados?

Actualmente hago dos consultas cuando uso declaraciones preparadas. Uno para obtener los resultados y otro para obtener el número de filas encontradas. Anteriormente podía hacer esto con una consulta con mysql_num_rows. Con consultas más grandes, no quiero tener que copiar y pegar la consulta y usar COUNT cada consulta. ¿Hay alguna manera de hacer esto en una consulta como con mysql_num_rows?

 $connectdb->prepare("SELECT * FROM users WHERE username=:username");
        $connectdb->prepare("SELECT COUNT(*) FROM users WHERE username=:username");
    $query = $connectdb->execute(array(':username'=>$username));                                    
            $numrows = $query->fetchColumn();

             if($numrows!=0) {
               while(false !==($row = $query->fetch()))
               {

preguntado el 04 de julio de 12 a las 05:07

3 Respuestas

La declaración ya tiene el número de filas: PDOStatement::rowCount()

Así que usa $query->rowCount(); y solo tu primera consulta

PD: su código no parece que funcione. El correcto debe ser:

$stmt = $connectdb->prepare("SELECT * FROM users WHERE username=:username");
$stmt->execute(array(':username'=>$username));                                    
...

Respondido 04 Jul 12, 05:07

Creo que el recuento de filas no es para consultas seleccionadas. - user892134

@user892134: ¿tú crees o sabes? ¿Has revisado el enlace de documentación que di? - zerkms

sí, dice "PDOStatement::rowCount() devuelve el número de filas afectadas por una instrucción DELETE, INSERT o UPDATE". - user892134

@ user892134: ¿ha intentado leer más? Hay más de 1 párrafo allí - zerkms

Sí, para consultas de selección dice "Para la mayoría de las bases de datos, PDOStatement::rowCount() no devuelve el número de filas afectadas por una declaración SELECT. En su lugar, use PDO::query() para emitir una declaración SELECT COUNT(*) con el mismos predicados que su declaración SELECT prevista, luego use PDOStatement::fetchColumn() para recuperar la cantidad de filas que se devolverán. Su aplicación puede realizar la acción correcta. " - user892134

$query=$connectdb->prepare("SELECT * FROM users WHERE username=:username");
    $query->execute(array(':username'=>$username));                                    
            $numrows = $query->rowCount();

Respondido 04 Jul 12, 05:07

Tienes 3 opciones disponibles en PDO:

1) lo que tienes actualmente, usando COUNT():

$numrows = $query->fetchColumn();

2) fetchColumn() sin ejecutar la consulta en sí:

$pdo->query("SELECT COUNT(*) from users")->fetchColumn(); 

3) rowCount() NOTA - aparentemente no funciona en MySQL, y no recomiendo esto:

PDOStatement::rowCount();

EDITAR - Para aclarar - Número 3, esta es una referencia del PDO Doc:

Para la mayoría de las bases de datos, PDOStatement::rowCount() no devuelve el número de filas afectadas por una instrucción SELECT. En su lugar, use PDO::query() para emitir una declaración SELECT COUNT(*) con los mismos predicados que su declaración SELECT prevista, luego use PDOStatement::fetchColumn() para recuperar el número de filas que se devolverán. Su aplicación puede entonces realizar la acción correcta.

Respondido 04 Jul 12, 05:07

"fetchColumn() sin ejecutar la consulta en sí": esta frase es confusa. La consulta se ejecuta antes. - zerkms

@random, no con sentencias SELECT. - user892134

Actualizado con la referencia de PDO Doc, disculpe la confusión. - arrendajo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.