web-dev-qa-db-fra.com

Les PDO étaient des lignes affectées lors de l'instruction d'exécution

J'ai trouvé plusieurs façons d'utiliser l'instruction exec pour PDO, mais je ne suis pas sûr que cela m'aide. Si j'ai bien compris, je dois utiliser la fonction execute () pour les instructions préparées. Je suis en train de mettre à jour une ligne avec des données d'entrée utilisateur. Je voudrais donc utiliser une instruction préparée à la place de l'appel query ().

Mon code est le suivant:

$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 />';
}

Le problème est que la requête elle-même est exempte d'erreur et qu'elle s'exécute correctement. Il n'y a donc aucun problème à stocker dans $ f. Cependant, j'ai besoin de savoir s'il a effectivement trouvé la ligne à mettre à jour, puis l'a mise à jour avec succès. En d'autres termes, j'ai besoin des lignes affectées. Quand googler et autres, cela continue à arriver à la déclaration exec, mais si je comprends bien, exec ne convient pas aux déclarations préparées? Aucune suggestion?

17
MaurerPower

Essayez $q->rowCount() . Les instructions préparées renverront le nombre de lignes affectées via cette méthode.

33
Marc B

$q->rowCount() renvoie le nombre de lignes affectées par la dernière instruction SQL (exécutée), où $q est l'instruction préparée, souvent appelée $stmt.

Donc, la plupart des utilisateurs qui lisent ceci pourraient vouloir quelque chose comme:

$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.';
}
17
Martin Thoma

Remarque: lors de la mise à jour d'une table avec des valeurs identiques, rowCount() renverra toujours 0. C'est un comportement normal. Vous pouvez le changer vous-même depuis PHP 5.3 en créant un objet PDO avec l'attribut suivant:

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

rowCount() renvoie ensuite le nombre de lignes que votre requête de mise à jour a réellement trouvées/correspondantes.

10
bodi0

La fonction rowCount() à partir d'instructions préparées de PDO renvoie les lignes affectées s'il s'agit d'une instruction UPDATE, DELETE ou INSERT. Sinon, il retourne le nombre de lignes renvoyées par l'instruction SELECT.

0
Emre Aydin