2016-07-13 8 views
0

が私のコードです:insert .. selectが実際に行を挿入したかどうかはどのように知ることができますか?ここで

$stm = $dbh 
->prepare("INSERT INTO resend_pass(user_id, token, date_time) 
      SELECT ?, ?, unix_timestamp() 
      FROM dual 
      WHERE NOT EXISTS(SELECT count(*) AS num_week, 
            COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))),0) as num_day, 
            COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 hour))),0) as num_hour, 
            COALESCE(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 minute))),0) as num_1min 
            FROM resend_pass 
           WHERE user_id = ? 
            AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 WEEK)) 
           HAVING num_week > 11 OR num_day > 5 OR num_hour > 3 OR num_1min > 0);"); 

if($stm->execute(array(10, 'token', 10))){ 
    echo 'inserted'; 
} else { 
    echo 'failed'; 
} 

私のスクリプトは常に何行が挿入されていない場合でも、insertedを印刷します。どうして?それをどうやって修正することができますか?

私はthis approachを使用して正常に挿入されたかどうかを知りました。

答えて

-1

INSERT ... SELECTは、INSERTのすべての行がSELECTによって返されたときに成功したとみなされます。 SELECTがゼロの行を返した場合、ステートメントは正常にゼロ行を挿入します。

と判断する場合は、行が挿入されている場合、影響を受ける行の数をテストする必要があります。 PDOでは、これは次のような `PDOStatement :: rowCount()メソッドを照会することによって行われます。

try { 
    $stm = $dbh->prepare("INSERT .. SELECT query"); 
    $stm->execute(); 
    if ($stm->rowCount() > 0) { 
     echo 'inserted'; 
    } else { 
     throw new Exception('No rows inserted'); 
    } 
} catch(Exception $e) { 
    echo $e; 
} 
+0

グレート+1 ..あなたのコードを書き換えて、 'if'ステートメントの代わりに' try/catch'を使ってください。このようにif($ stm-> rowCount()> 0)throw; '。また、*「行が見つかりません」*と「失敗」*は私にとっては同じです。 –

+0

PDOが例外をスローすることができるのかどうか分かりませんか? –

+0

また、 '$ stm-> execute(array(10、 'token'、10))'を 'if'文から書くことができると思います。 –

1

executeエラーがあった場合のみfalseを返します。エラーがなかったため、スクリプトに「挿入された」と表示されます。つまり、クエリは正常に実行されました。どの程度

if($stm->execute(...)===false): 
    //there was an error 
elseif($stm->rowCount()<1): // $stm->affected_rows if you use MySQLi 
    //no row was inserted 
else: 
    //at least one row was inserted 
endif 

Documentation here.

+0

ありがとう、upvote。しかし、私はPDOを使用しますが、MySQLは使用しません。 –

+1

私はそれに応じて私の答えを編集しました – BeetleJuice

+0

PDOは例外をスローするので、execute()の結果をチェックするのは無意味です –

0

:あなたが行が実際に挿入されたかどうかを知る必要がある場合、代わりにrowCount()関数を呼び出す

レコードがあなたのSQLのWHERE句の条件を満たしていないので、何も挿入されませんでしたmysqli_affected_rows() http://php.net/manual/es/mysqli.affected-rows.php

あなたはPDOを使用している場合は、関数使用して、あなたは0123を試してみたいことがあります(私は考えることはあなたのケースです)。

プリペアドステートメントは、そのメソッドを介して影響を受ける行の数を返します。

+1

ええ、 'rowCount()'が私が探しているものだと思います。ありがとうございますupvote。 –

関連する問題