Реализация ПДО, код до сих пор правильно?


Я решил пойти PDO и приступили к реализации его на одном из моих web-проектов. Я не обладают достаточными навыками программирования, но обычно может справиться с некоторые учебники и форумы.

Вот мой код так далеко, и она работает нормально, но как правильный код относительно подбирая ошибок, синтаксис, порядок и begintransaction и т. д.? Я ничего missunderstood? Что-нибудь ненужную?

connect.php

 <?php
try {
    $DBH = new PDO("mysql:host=$host;dbname=$database", $username, $password, array(
        PDO::ATTR_PERSISTENT => true
    ));
    $DBH -> exec("set names utf8");
}
catch(PDOException $e) {
    echo $e->getMessage();
}
?>

query.php

try {  
        $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $DBH->beginTransaction();   

        $STH = $DBH->prepare('SELECT id from users where uid = :uid');
        $STH->setFetchMode(PDO::FETCH_ASSOC); 
        $STH->bindParam(':uid', $uid); // $uid value is set
        $STH->execute();

        $uid_in_db = $STH->rowCount();
        if($uid_in_db==0){ //=new user, insert info in db.
            $STH = $DBH->prepare("INSERT INTO USERS (uid,namn) VALUES (:uid, :name)");
            $STH->bindParam(':uid', $uid);
            $STH->bindParam(':namn', $_POST['namn']); // a value posted form user input
            $STH->execute();
        }

        $DBH->commit(); // 

    } catch (Exception $e) {
        $DBH->rollBack();
        echo "Fel: " . $e->getMessage();
    }
}else{
    $error=1;
}


819
4
задан 18 апреля 2011 в 02:04 Источник Поделиться
Комментарии
1 ответ

Вместо проверки на столкновения жидкости перед вставкой, я бы поставил уникальный ключ на столбец, а затем написать код резервный на случай (очень маловероятно), когда сталкиваются. Таким образом, вы можете упростить свою логику и уменьшить количество запросов к одному вместо двух. Вы также не нуждаетесь в операции, если вы реализуете это изменение, так как есть только 1 запрос.

//you can remove the outer try/catch since only the execute() should possibly fail
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //<~ put this in the initialize of the db connection
$STH = $DBH->prepare("INSERT INTO USERS (uid,namn) VALUES (:uid, :name)");
$STH->bindParam(':uid', $uid);
$STH->bindParam(':namn', $_POST['namn']); // a value posted form user input
try {
$STH->execute();
} catch( PDOException $e ) {
//deal with collision
}

3
ответ дан 18 апреля 2011 в 02:04 Источник Поделиться