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?
Essayez $q->rowCount()
. Les instructions préparées renverront le nombre de lignes affectées via cette méthode.
$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.';
}
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.
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
.