2016-07-13 34 views
0

Hier mein Skript ist:eine Ausnahme werfen, wenn Transaktion gibt es

try{ 

    $dbh_conn->beginTransaction(); 

    $user_id = $_POST['iuser_id']; 
    $token = hash('sha512', bin2hex(openssl_random_pseudo_bytes(16)).$user_id); 

    $stmt = $dbh_conn->prepare("UPDATE resend_pass SET active = 0 WHERE user_id = ?"); 
    $stmt->execute(array($user_id)); 

    $stm = $dbh_conn 
    ->prepare("INSERT INTO resend_pass(user_id, token, date_time) 
       SELECT ?, ?, unix_timestamp() 
       FROM dual 
       WHERE NOT EXISTS(SELECT count(*) AS num_week, 
            FROM resend_pass 
            WHERE user_id = ? 
            AND date_time > unix_timestamp() - 604800 
            HAVING num_week > 11 ;"); 
    $stm->execute(array($user_id, $token, $user_id)); 

    // no row inserted (either there is lots of reuqests or duplicate token) 
    if (!$stm->rowCount()) { throw new Exception('something is wrong'); } 

    $dbh_conn->commit(); 

    /* sending an email contains reset_password_token here */ 

    $_SESSION["TopMSG"] = "<div class='msg_success'>has been sent</div>"; 
    header('location: ../login'); 
    exit; 

} catch(Exception $e) { 

    $dbh_conn->rollBack(); 

    $_SESSION["TopMSG"] = "<div class='msg_success'>$e</div>"; 
    header('location: ../login'); 
    exit; 

} 

Wie Sie sehen dort ein throw vor commit() ist. Ist das gut? Eigentlich, wenn ich es ausführe, wird es nicht funktionieren und löst diesen Fehler aus:

Fatal error: Uncaught exception 'Exception' in C:\xampp\htdocs\myweb\others\login.php:341 Stack trace: #0 C:\xampp\htdocs\myweb\application\other.php(35): login->resend_password_check() #1 C:\xampp\htdocs\myweb\index.php(150): require_once('C:\xampp\htdocs...') #2 {main} thrown in C:\xampp\htdocs\myweb\others\login.php on line if (!$stm->rowCount()) { throw new Exception('something is wrong'); }

Wie kann ich es beheben?

+0

Sie Namespaces verwenden? Scheint, dass der Code die Exception-Klasse nicht findet. BTW: Es ist in Ordnung, Ausnahmen vor dem Commit auszulösen. PS .: Ich weiß, dass dies nicht der Kontext ist, aber es ist nicht gut, den Code zu verlassen. Lassen Sie die Anfrage fließend beenden –

Antwort

0

php Schwerwiegender Fehler ist nicht abfangbar.

Wenn Sie PDO verwenden, schreiben Sie nicht wrow new Exception ('etwas stimmt nicht'); weil PDO haben bereits diesen Ausdruck PDOException

für axample:

try{ 
    $dbh_conn->beginTransaction(); 
    ....... 
    ....... 
    $stm->execute(array($user_id, $token, $user_id)); 
    ...... 
    $dbh_conn->commit(); 

}catch(PDOException $e) { 
    print_r($e->getMessage());//Show excption message 
    $dbh_conn->rollBack(); 
    $_SESSION["TopMSG"] = "<div class='msg_success'>$e</div>"; 

    //header('location: ../login'); 
    exit; 
} 
+0

Falsch .. meine Abfrage ist 'INSERT .. SELECT 'und es wirft keine Ausnahme, wenn keine Zeile eingefügt. Deshalb habe ich diesen 'throw' geschrieben. –

+0

@Martin AJ PDO fangen diesen Fehler INSERT .. SELECT.Write print_r ($ e-> getMessage()); in catch block und du wirst davon überzeugt sein –

+0

ein pdo fehler ist kein php fatal. es kann wie alles andere gefangen werden. es wird nur dann fatal, wenn NOTHING die Ausnahme abfängt (die sowieso nicht geworfen werden, wenn Sie sie nicht explizit aktivieren). –