2010-01-03 30 views
6

Bien, entonces he estado usando un PDO wrapper para un proyecto en el que estoy trabajando, y estoy tratando de averiguar si una consulta DELETE fue exitosa o no. Aquí está el código que estoy utilizando:¿Cómo puedo recuperar el número de filas eliminadas con PDO?

/** 
* A pretty straight-forward query to delete a row from the verification 
* table where user_id is $user_id and code is $code 
*/ 
$result = $this->database->query("DELETE FROM verification " . 
           "WHERE user_id = %u AND code = %s", 
           $user_id, 
           $code); 

/** 
* This function will grab the PDO's exec() return, which should 
* return the number of rows modified. 
*/ 
if($this->database->getNumAffected($result) > 0) 
    return true; 
else 
    return false; 

El problema es, si la consulta DELETE en realidad elimina una fila o no, $ this-> base de datos-> getNumAffected ($ resultado) siempre devuelve '0'.

Puede ver el contenedor, pero básicamente $ this-> database-> getNumAffected ($ result) simplemente devuelve exactamente el mismo valor que PDO :: exec() devolvería.

I probado este código sin la envoltura (directamente en DOP), y que tenía el mismo problema, pero a la inversa: que siempre se devuelve '1' (. Si una fila se ha eliminado o no)

Cualquier ayuda sería apreciado enormemente.

EDIT: Basado en this SO pregunta, estoy haciendo todo bien ... No entiendo por qué esto no está funcionando.

Respuesta

2

No funciona como se esperaba debido a que el 'envoltorio' que está utilizando no utilizar nunca PDO :: exec() - que envuelve todo lo en un comunicado DOP. De acuerdo con una rápida lectura del código fuente de la versión 2.2.6 de la clase 'base de datos' a partir de la URL proporcionada, el método de 'consulta' debe devolver una matriz que contiene el identificador de instrucción:

502 $statement = $this -> getDatabaseConnection() -> prepare ($query); 
... 
587 $ret = array ($statement, func_get_args(), $lastIndex); 
588  
589 return ($ret); 

Por lo tanto, suponiendo que su $this->database->query() llama a este método de clase de base de datos 'query, debe poder hacer $result[0]->rowCount().

Tenga en cuenta que la afirmación de la respuesta anterior de que "el contenedor que [utiliza] utiliza una versión diferente de rowCount() debido a un error que existe con la función rowCount()" no es verdadero - el contenedor implementa a numRows, pero esto no es lo mismo que PDOStatement::rowCount(), que está intacto dentro del identificador de extracto devuelto desde database::query().

+0

No estoy seguro de lo que quiere decir con que no utiliza exec(), presiona Ctrl + F y escribe execute (. Gracias por la respuesta. –

+2

Quiero decir que no usa PDO :: exec(), pero usa PDOStatement :: execute(), que es algo totalmente diferente. Probablemente sería útil ir a php.net/pdo y conocer la diferencia entre el objeto PDO (y su método 'exec()') y el PDOStatement object (y su método 'execute()'). Hay algunas diferencias realmente críticas allí. – TML

+0

Ah, está bien, eso tiene sentido. Muchas gracias por la respuesta, y lo investigaré. No lo sé tanto sobre PDO, como cuando comencé a aprenderlo (lo cual fue provocado por la persona que hizo este envoltorio), me dieron inmediatamente un envoltorio para usar en su lugar. La única ventaja del envoltorio que veo es que tienes que escribir variables, por lo que si es del tipo incorrecto (por ejemplo, una cadena cuando debería ser un entero), devuelve un error. Oh, quise decir esto en mi primer comentario: entiendo que numRows() es muy diferente de rowCount(), y debido a la forma en que funciona numRows(), no lo uso. –

4
$query = $this->database->prepare("DELETE FROM verification WHERE user_id = :user_id AND code = :code", array('user_id' => $user_id, 'code' => $code)); 
$query->execute(); 

if ($query->rowCount() > 0) { 
    return TRUE; 
} 
return FALSE; 
+0

Hmm, la envoltura que estoy utilizando utiliza una versión diferente de rowCount() debido a un error que existe con la función rowCount(). El numRows() en el contenedor simplemente hace una consulta SELECT COUNT (*), por lo que esto no funcionará para el contenedor. –

Cuestiones relacionadas