web-dev-qa-db-ja.com

PDOは実行ステートメント中に影響を受けた行でした

PDOのexecステートメントを使用する多くの方法を見つけましたが、それが私に役立つかどうかはわかりません。私の理解では、準備済みステートメントにはexecute()関数を使用する必要があります。ユーザー入力のデータで行を更新しているので、query()呼び出しの代わりに準備済みステートメントを使用したいと思います。

私のコードは次のとおりです:

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

問題は、クエリ自体にエラーがなく、正常に実行されるため、$ fに保存しても失敗しないことです。ただし、更新する行が実際に検出され、それが正常に更新されたかどうかを知る必要があります。つまり、影響を受ける行が必要です。グーグルなどのとき、それはexecステートメントに到達し続けますが、私の理解から、execは準備されたステートメント用ではありませんか?助言がありますか?

23
MaurerPower

$q->rowCount() を試してください。準備されたステートメントは、そのメソッドを介して影響を受ける行の数を返します。

45
Marc B

$q->rowCount() は、最後の(実行された)SQLステートメントの影響を受ける行数を返します。ここで、$qは、$stmtと呼ばれることが多い準備済みステートメントです。

したがって、これを読むほとんどのユーザーは、次のようなものを望みます。

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

補足:同じ値でテーブルを更新する場合、rowCount()は常に_0_を返します。これは正常な動作です。 PHP 5.3なので、次の属性でPDOオブジェクトを作成することにより、自分で変更できます。

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

rowCount()は、更新クエリが実際に検出/一致した行数を返します。

19
bodi0

PDOのrowCount()UPDATEDELETEまたはINSERTステートメントの場合、準備されたステートメントから影響を受ける行を返します。それ以外の場合は、SELECTステートメントから返された行数を返します。

1
Emre Aydin