2012-05-09 11 views
15

私はPDO用のexecステートメントを使用する多くの方法を見つけましたが、それが私を助けているかどうかはわかりません。私の理解は、準備された文のためにexecute()関数を使わなければならないということです。私は、ユーザー入力からのデータで行を更新しているので、query()呼び出しの代わりにprepared statementを使用したいと思います。次のようにPDOが実行ステートメントの実行中に影響を受ける行

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

$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は準備されたステートメントのためではありませんか?助言がありますか?

+0

警告:値が*すでに*設定されている場合(更新が2回実行された、おそらくダブルクリックされた送信ボタンから)、2回目はデータが正常であってもエラーが発生します。ユーザーエクスペリエンスのために、後にselectステートメントを実行してレコードが正しい値で存在するかどうかを確かめることができます。 'select authState from tb_users where id =? authPass =? 'となります。結果がないと、IDまたはパスワードが存在しないことを意味します。 (psでパスワードをハッシュしてください!) –

答えて

29

try $q->rowCount() Preparedステートメントは、そのメソッドを介して影響を受ける行の数を返します。

+7

デフォルトでは、MySQLは実際に変更された行の数を返し、where句でマッチした行の数は返しません。既存のものは行を変更しません) –

+1

私は多くの人が私がウェブ全体で読んだことで判断するこの質問を探すのを知っています。 ($ q-> rowCount()){... – MaurerPower

+6

USE:$ q-> rowCount()これはエラーを返します:$ f-> rowCount() –

14

$q->rowCount()は、最後に実行されたSQL文の影響を受ける行数を返します。$qは、しばしば$stmtと呼ばれるプリペアドステートメントです。

だから、これを読んで、ほとんどのユーザーはのようなものをお勧めします:私はPDOをrowCount(だと思う

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

)は、単一のUPDATEクエリを使用してMySQLに無用です。常に0を返すためです。

ex: 
TABLE{id=1, col1="A"} 
UPDATE TABLE SET col1="AA" WHERE id=1; 
rowCount will return 0; 

also 
UPDATE TABLE SET col1="AA" WHERE id=999; 
rowCount will return 0; 

so rowCount() is useless in this case. 

私はこのクエリUPDATE表のSET COL1 = "AA"

0

PDOのrowCount()それはUPDATEDELETEまたはINSERT文の場合は行に影響を与えて準備された文が戻るからで、まだテストしていません。それ以外の場合は、SELECT文から返される行の数を返します。

7

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

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

rowCount()、あなたの更新クエリが実際に見つかっ/マッチした行数を返します。

+0

私はこれが事であるとは思わなかった!!すべてのはい! – Gurnzbot

関連する問題