PHP: Как я могу получить идентификатор ссылки MySQL для уже открытого соединения? - PullRequest
4 голосов
/ 26 августа 2009

Когда вы открываете соединение MySQL с помощью mysql_connect (), он возвращает идентификатор ссылки. Но что, если вы захотите снова получить этот идентификатор ссылки в скрипте? (например: плагин, который должен открыть новое соединение с базой данных и по-прежнему иметь доступ к старому.)

Я ищу способ вернуть идентификатор ссылки на последнее соединение, открытое mysql_connect (). Есть ли функция, которая делает это?

Ответы [ 6 ]

7 голосов
/ 11 января 2012

Даже если объяснение Anti Veeranna верно, - это очень простой способ сделать то, что вы хотите. Если вы прочитаете документацию для mysql_connect () , вы обнаружите, что у этой функции есть 4-й параметр, "new_link", который по умолчанию равен false . Если вы снова вызовете mysql_connect () с теми же параметрами, что, вероятно, имеет место, оно не создаст новое соединение, а вместо этого вернет идентификатор ресурса старого.

В любое время;)

2 голосов
/ 26 августа 2009

Нет, нет. Вы должны сами записать идентификаторы ссылок. Вы можете определить идентификатор ссылки как свойство класса, чтобы вы могли легко получить к нему доступ из своих методов и не беспокоиться о том, чтобы передавать его как переменную снова и снова.

1 голос
/ 28 августа 2009

Спасибо всем за ответы.

Я закончил тем, что открыл свое собственное соединение, и когда мой плагин был готов, последняя строка повторно открывает исходное соединение, чтобы остальная часть основного скрипта могла использовать базу данных, которую он ожидает. Это неряшливо, я знаю, но не похоже, что в этом случае есть лучший вариант. : /

Обновление :: Я отправил это как запрос к функции на php.net. Ссылка: http://bugs.php.net/bug.php?id=49400

0 голосов
/ 26 августа 2009

Вы должны либо сохранить идентификатор ссылки самостоятельно, как упомянуто в других ответах, ИЛИ вы можете просто опустить его, функции mysql_ * могут повторно использовать существующий дескриптор

mysql_query help объясняет это так:

resource mysql_query  ( string $query  [, resource $link_identifier  ] )

link_identifier

    The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed.

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

0 голосов
/ 26 августа 2009

Вы должны хранить ручку в переменной.

$link = mysql_connect($host, $login, $pass);

И вы можете повторно использовать $ link в вашем скрипте перед новым HTTP-запросом.

0 голосов
/ 26 августа 2009

Используйте mysql_pconnect, это будет делать то, что вы хотите.

Сначала при подключении функция сначала пытается найти (постоянную) ссылку, которая уже открыта с тем же хостом, именем пользователя и паролем. Если он найден, вместо открытия нового соединения будет возвращен идентификатор для него.

Вы также можете использовать статический или одноэлементный класс для обработки пула соединений.

<?php
class dbConnectionPooler
{
    static var $connections = array();

    private static function createConnection($host, $username, $password, $db) {
        $connection = mysql_pconnect($host, $username, $password);

        if (FALSE !== $connection) {
            $result = mysql_select_db($db, $connection);

            if (FALSE !== $result) {
                self::$connections[self::getConnectionHash($host, $username, $password, $db)] = $connection;

                return $connection;
            }
        }
    }    

    private static function getConnectionHash($host, $username, $password, $db) {
        return md5($host. $username. $password. $db); // use your favourite hashing function here
    }

    public static function getConnection($host, $username, $password, $db) {
        $connectionHash = self::getConnectionHash($host, $username, $password, $db);

        if (array_key_exists($connectionHash, self::$connections)) {
            return self::$connections[$connectionHash];
        } else {
            return self::createConnection($host, $username, $password, $db);
        }

        return false;
    }
}

$connection = dbConnectionPooler::getConnection("dbhost", "dbuser", "dbpassword", "mydb");
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...