Повторное использование переменных при работе с PDO - PullRequest
3 голосов
/ 31 мая 2011

Мне нужно извлечь данные как минимум из 3 баз данных. Что-то не так с повторным использованием моих объектов PDO?

$dbh = new PDO('mysql:host=' . $host . ';dbname=' . $db_name, $user, $password);
$sth = $dbh->prepare($query1);

// do something

$dbh = new PDO('mysql:host=' . $host2 . ';dbname=' . $db_name2, $user2, $password2);
$sth = $dbh->prepare($query2);

//do something else

Извините за редактирование, но вот еще одно соображение.С каждым из них я, очевидно, должен проверить, было ли соединение успешным, и выдать исключение, если оно не было:

if (!$dbh) {
    $err=$dbh->errorInfo();
    throw new Exception('Could not connect: ' . $err[2]);
}

Я не думаю, что есть способ избежать этого, если я не создаю всесоединения одновременно и делаем if (!dbh1|!dbh2) { ... }.Просто что-то еще, чтобы рассмотреть.

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Когда вы присваиваете $dbh new PDO(), вы технически не используете свой объект pdo.Вы создаете новый экземпляр PDO и назначаете его переменной, которую вы ранее использовали.В этом нет ничего плохого, если вы понимаете, что происходит в вашей программе.

РЕДАКТИРОВАТЬ:

Я редактирую свой ответ, чтобы ответить на новый вопросВы добавили в свой предыдущий вопрос.

С каждым из них я, очевидно, должен проверить, было ли соединение успешным, и выдать исключение, если оно не было:

Вы можете окружить вашу попытку соединения впопытка отлова, которая является типичной стратегией для устранения ошибок соединения:

<?php
    try {
        $dbh = new PDO('mysql:host=localhost;dbname=databaseName', $userName, $password);

        foreach($dbh->query('SELECT * from TableName') as $row) {
            print_r($row);
        }

        $dbh = null;
    } catch (PDOException $ex) {
        print "Error!: " . $ex->getMessage() . "<br />";
        die();
    }
?>
2 голосов
/ 31 мая 2011

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

// connection to data warehouse
$dbh_dataWH = new PDO('mysql:host=' . $host . ';dbname=' . $db_name, $user, $password);
// connection to crm 
$dbh_crm = new PDO('mysql:host=' . $host2 . ';dbname=' . $db_name2, $user2, $password2);

Таким образом, вы сможете повторно использовать ваши объекты подключения, и код, по моему очень скромному мнению, будет намного понятнее для вас или любого другого, кто должен его поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...