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は準備されたステートメント用ではありませんか?助言がありますか?
$q->rowCount()
を試してください。準備されたステートメントは、そのメソッドを介して影響を受ける行の数を返します。
$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.';
}
補足:同じ値でテーブルを更新する場合、rowCount()
は常に_0
_を返します。これは正常な動作です。 PHP 5.3なので、次の属性でPDOオブジェクトを作成することにより、自分で変更できます。
_<? php
$p = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
?>
_
rowCount()
は、更新クエリが実際に検出/一致した行数を返します。
PDOのrowCount()
がUPDATE
、DELETE
またはINSERT
ステートメントの場合、準備されたステートメントから影響を受ける行を返します。それ以外の場合は、SELECT
ステートメントから返された行数を返します。