webentwicklung-frage-antwort-db.com.de

PDO waren Zeilen während der Ausführungsanweisung betroffen

Ich habe viele Möglichkeiten gefunden, die exec-Anweisung für PDO zu verwenden, aber ich bin mir nicht sicher, ob sie mir hilft. Mein Verständnis ist, dass ich die Funktion execute () für vorbereitete Anweisungen verwenden muss. Ich aktualisiere eine Zeile mit Daten aus Benutzereingaben, daher möchte ich anstelle des Aufrufs "query ()" eine vorbereitete Anweisung verwenden.

Mein Code lautet wie folgt:

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

Das Problem ist, dass die Abfrage selbst fehlerfrei ist und fehlerfrei ausgeführt wird, sodass es nicht fehlgeschlagen ist, sie in $ f zu speichern. Ich muss jedoch wissen, ob es tatsächlich die zu aktualisierende Zeile gefunden hat und diese dann erfolgreich aktualisiert hat. Mit anderen Worten, ich brauche die betroffenen Zeilen. Wenn Sie googeln und so, kommt es immer wieder zur exec-Anweisung, aber meines Erachtens ist exec nicht für vorbereitete Anweisungen? Irgendwelche Vorschläge?

17
MaurerPower

Versuchen Sie $q->rowCount() . Prepared-Anweisungen geben die Anzahl der betroffenen Zeilen über diese Methode zurück.

33
Marc B

$q->rowCount() gibt die Anzahl der Zeilen zurück, die von der letzten (ausgeführten) SQL-Anweisung betroffen sind, wobei $q die vorbereitete Anweisung ist, die häufig als $stmt bezeichnet wird.

Daher möchten die meisten Benutzer, die dies lesen, so etwas wie:

$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

Eine Randnotiz: Beim Aktualisieren einer Tabelle mit identischen Werten rowCount() wird immer 0 zurückgegeben. Das ist normales Verhalten. Sie können es seit PHP 5.3 selbst ändern, indem Sie ein PDO-Objekt mit folgendem Attribut erstellen:

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

Die rowCount() gibt dann zurück, wie viele Zeilen Ihre Aktualisierungsabfrage tatsächlich gefunden/gefunden hat.

10
bodi0

PDOs rowCount() aus vorbereiteten Anweisungen gibt betroffene Zeilen zurück, wenn es sich um eine UPDATE-, DELETE- oder INSERT-Anweisung handelt. Andernfalls wird zurückgegeben, wie viele Zeilen von der SELECT-Anweisung zurückgegeben werden.

0
Emre Aydin