[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не открывать новое соединение, если старое открыто
inpost
Допустим сайт на процедурке, и где-то в начале был обычный mysql_connect, далее интегрируется под ту же страницу внешний скрипт или класс, к примеру, который работает на mysqli , какой-нибудь сингл-тон. На данный момент было уже 1 открытое соединение с БД, можно ли его перехватить и заставить работать mysqli с ним напрямую (или тот же синглтон по работе с БД (новое соединениие)). Это я к тому, что синглтон открывает соединение с mysqli через наследование класса mysqli, в construct вызывается parent::__construct, где идёт соединение с БД (это как пример).
Всё, что я хочу, так это в случае существующего соединения уже работать непосредственно с ним, а не открывать новое.



Спустя 3 часа, 26 минут, 24 секунды (5.05.2011 - 20:52) sergeiss написал(а):
Я бы так попробовал сделать.... Есть такая функция
int mysql_errno ([ resource $link_identifier ] )

Идентификатор соединения тут не обязателен (см. хэлп). Поэтому надо вызвать функцию без параметров. Если соединения с мускулем не было установлено... "If no connection is found or established, an E_WARNING level error is generated."
Надо перехватить это предупреждение. Возможно, посредством блока try-catch, хотя утверждать это однозначно не буду, не проверял в данном случае.

Я обычно проще делаю... В нужном месте просто "тупо" через require_once подключаю скрипт подключения к БД и ни секунды лишней не парюсь.

PS. А зачем вторую тему об этом же создал???

Спустя 6 минут, 19 секунд (5.05.2011 - 20:59) inpost написал(а):
Основной сайт работает на mysql , где-то там был mysql_connect.

Теперь мой класс работает непосредственно через класс mysqli, который тоже при наследовании синглтоном требует указания параметров БД, тогда получится, что будет открыто второе соединение? Даже если я узнаю, что соединение на данный момент открыто, то не нужно вообще параметров указывать для класса mysqli?

Спустя 6 минут, 2 секунды (5.05.2011 - 21:05) sergeiss написал(а):
Цитата (inpost @ 5.05.2011 - 21:59)
Даже если я узнаю, что соединение на данный момент открыто, то не нужно вообще параметров указывать для класса mysqli?

Можно подумать, что я или кто-то тут автор твоего класса... Я ж не знаю, что и как там у тебя делается. Но в самом общем случае, если не вникать в детали именно твоего класса, то ты можешь работать с открытым линком к БД, не указывая его в явном виде. Это и с мускулем, и с Постгре, и с другими БД так (если работаешь с библиотеками функций из ПХП).

Спустя 37 минут, 54 секунды (5.05.2011 - 21:42) neadekvat написал(а):
Если первое соединение открыто с помощью mysql_connect, а второе с помощью mysqli, то вряд ли второе может перехватить первое. Это ж даже разные библиотки.
Вот если бы и второе соединение открывалось с помощью mysql_connect - то другой вопрос.

Спустя 7 минут, 25 секунд (5.05.2011 - 21:50) inpost написал(а):
Тогда немного расширю вопрос, что насчет двух отдельных случаев, если, допустим, первый вариант 2 разные библиотеки по работе с мускулом: mysql & mysqli, а второй вариант: работа непосредственно с mysqli , то есть неизвестный под неизвестным именем уже работает с библиотекой где-то за пределами моей видимости, я пишу легко интегрирующийся скрипт, который должен не открывать своё собственное соединение к БД, а перехватывать уже открытое, как быть тогда?

Спустя 4 минуты, 29 секунд (5.05.2011 - 21:54) sergeiss написал(а):
Вот такая хрень работает, только что проверил:
$err=mysql_errno();
if( $err === false )
echo 'Не найдено ни одного подключения к мускулю<br>';
else
echo 'Подключение к мускулю имеется!!!<br>';

Что касается MySQLi... Проверяй, поможет ли это тебе. Возможно, что да :) Я с Мускулем очень мало работал.

Либо, как вариант, что-то подобное найти для "мускуль-Ай".

Спустя 3 минуты, 37 секунд (5.05.2011 - 21:58) Arni написал(а):
MySQLi даст возможность сделать несколько подключений без проблем.

Спустя 10 минут, 14 секунд (5.05.2011 - 22:08) inpost написал(а):
echo '<pre>';
$db = mysql_connect(DBSERVER,DBUSER,DBPASSWORD) or die(mysql_error());
mysql_select_db(DATABASE,$db) or die(mysql_error());
$res = mysql_query("SELECT * FROM `table`");
$row = mysql_fetch_assoc($res);
print_r($row);

// Доступ к данным выше не имею, но я знаю, что соединение уже было открыто, или могло быть открыто.
// Там может быть как mysql , так и mysqli как процедурка или ооп.
// Далее синглтон, про который я говорил ранее:


class DB extends MySQLi {
private static $instance;
public static function _() {
if(!self::$instance) {
$cn = __CLASS__;
self::$instance = new $cn(DBSERVER,DBUSER,DBPASSWORD,DATABASE);
}
return self::$instance;
}
}

$result = DB::_()->query("SELECT * FROM `table`");
while($row = $result->fetch_assoc()) {
print_r($row);
}


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.