2012-05-09 11 views
15

He encontrado muchas formas de utilizar la declaración ejecutiva para PDO, pero no estoy seguro de que me ayude. Mi entendimiento es que tengo que usar la función execute() para las declaraciones preparadas. Estoy actualizando una fila con datos de la entrada del usuario, por lo que me gustaría usar una declaración preparada en lugar de la llamada a la consulta().PDO fueron filas afectadas durante la ejecución de la declaración

Mi código es el siguiente:

$dbh = buildDBConnector(); 
$sql = "UPDATE tb_users 
    SET authState=1 
    WHERE id = ? AND authPass = ?"; 
$q = $dbh->prepare($sql); 
$f = $q->execute(array($id,$authPass)); 
if($f){ 
    echo '<br />Success<br />'; 
}else{ 
    echo '<br />Failure<br />'; 
} 

La cuestión es que la consulta en sí está libre de errores y ejecuta bien, así que no hay falta de almacenamiento en $ f. Sin embargo, necesito saber si realmente encontró la fila para actualizar y luego la actualizó exitosamente. En otras palabras, necesito las filas afectadas. Cuando Google y tal, sigue llegando a la declaración del ejecutivo, pero desde mi entender, el ejecutivo no es para las declaraciones preparadas? ¿Alguna sugerencia?

+0

Advertencia: si el valor * ya * está configurado (la actualización se ejecuta dos veces, tal vez desde un botón de envío doble clic), la segunda vez causaría un error aunque los datos estén correctos. Para la experiencia del usuario, podría ser más confiable hacer una declaración de selección luego para ver si el registro existe con el valor correcto 'select authState from tb_users where id =? y authPass =? '. Ningún resultado significa que la identificación o contraseña no existe. (ps Espero que hash las contraseñas! mira pbdkf2!) –

Respuesta

29

Probar $q->rowCount(). Las declaraciones preparadas devolverán el número de filas afectadas a través de ese método.

+7

ten en cuenta que, de forma predeterminada, MySQL devuelve el número de filas realmente cambiadas, y no el número de filas coincidentes con la cláusula where (emisión de actualización con los mismos valores que los existentes no cambian la fila) –

+1

Sé que mucha gente busca esta pregunta a juzgar por las cosas que he leído en toda la web, ¡excelente trabajo en la respuesta rápida! El $ f no era necesario cuando todo estaba dicho y hecho, puede terminar de la siguiente manera: if ($ q-> rowCount()) {... – MaurerPower

+6

USE: $ q-> rowCount() ESTO DA UN ERROR: $ f-> rowCount() –

14

$q->rowCount() devuelve el número de filas afectadas por la última instrucción SQL (ejecutada) donde $q es la instrucción preparada que a menudo se llama $stmt.

Así que la mayoría de los usuarios que lean esto podría querer algo como:

$pdo = new PDO($dsn, $username, $password); 
$sql = "UPDATE tb_users SET authState=1 WHERE id = ? AND authPass = ?"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array($id, $authPass)); 

if ($stmt->rowCount()){ 
    echo 'Success: At least 1 row was affected.'; 
} else{ 
    echo 'Failure: 0 rows were affected.'; 
} 
-2

i piensan DOP rowCount() es inútil en MySQL con una sola consulta UPDATE. porque siempre devuelve 0;

ex: 
TABLE{id=1, col1="A"} 
UPDATE TABLE SET col1="AA" WHERE id=1; 
rowCount will return 0; 

also 
UPDATE TABLE SET col1="AA" WHERE id=999; 
rowCount will return 0; 

so rowCount() is useless in this case. 

no he probado todavía con esta consulta de actualización de tabla SET col1 = "AA"

0

de rowCount() de las declaraciones declaraciones preparadas filas afectadas si se trata de una declaración UPDATE, DELETE o INSERT DOP. De lo contrario, devuelve cuántas filas se devuelven desde la declaración SELECT.

7

Una nota al margen: al actualizar una tabla con valores idénticos rowCount() devolverá siempre 0. Este es un comportamiento normal. Se puede cambiar por sí mismo a partir de PHP 5.3 mediante la creación de un objeto de orden de pago atributo siguiente:

<? php 
$p = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true)); 
?> 

El rowCount() para luego retornar el número de filas de su actualización en realidad consulta encontrado/igualada.

+0

¡No tenía idea de que esto fuera algo!¡Todo el sí! – Gurnzbot

Cuestiones relacionadas