Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как в PHP удержать соединение к БД в сессии

16K
04 октября 2006 года
sav13
21 / / 01.10.2006
[COLOR="Red"]Дано:[/COLOR]
БД Oracle, Сервер Apache 2.0, PHP 5, модуль OCI
Требуется создать соединение с базой
[COLOR="Navy"]$xxx = oci_connect( ... );[/COLOR]
которое будет работать на нескольких страницах клиента без переподключения.

Например, через сохранения переменной $xxx в сессию PHP

[COLOR="red"]Цель:[/COLOR]
1. Работать с временной табличкой ORACLE, которая живет в рамках одного connectа, на нескольких страницах клиента
2. На одной страничке открыть транзакцию, на следующей что-то делать с базой, затем спросить про сохранение изменений и сделать COMMIT или ROLLBACK.
3. Создать пакет PL/SQL ORACLE. Насоздавать глобальных переменных, а на следующей странице прочитать их изменение.

[COLOR="red"]Проблема:[/COLOR] - после закрытия каждой стринички происходит автоматическое закрытие с базой ORACLE

Писать свой модуль работы с ORACLE на PHP влом.
2.8K
04 октября 2006 года
S|lent
65 / / 20.04.2005
Я думал на эту тему, в итоге сделал функцию, которая делает коннект к серверу и выбирает базу, код небольшой, и скрипт отрабатывает моментально. Тем более что у тебя автоматически закрывается подключение к базе после отработки скрипта на странице.
Код:
function mssql_conn()
    {
        include("connect.inc");
        global $db;
        global $select;
        $db = @mssql_pconnect ($Server, $User, $Pass);
        if ($db == false)
        {
            echo "Невозможно подключиться к базе данных.";
            echo '<br><br><input type="button" value="Подключиться к базе данных" &#111;&#110;Click="java script:location.reload()">';
            exit;
        }else
        {
            @mssql_select_db($Data_base, $db);
        }
    }

Соответственно на каждой странице, где тебе нужно, ты подгружешь эту функцию из файла и всё.
13
04 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=S|lent]Я думал на эту тему, в итоге сделал функцию, которая делает коннект к серверу и выбирает базу, код небольшой, и скрипт отрабатывает моментально. Тем более что у тебя автоматически закрывается подключение к базе после отработки скрипта на странице.
Код:
function mssql_conn()
    {
        include("connect.inc");
        global $db;
        global $select;
        $db = @mssql_pconnect ($Server, $User, $Pass);
        if ($db == false)
        {
            echo "Невозможно подключиться к базе данных.";
            echo '<br><br><input type="button" value="Подключиться к базе данных" &#111;&#110;Click="java script:location.reload()">';
            exit;
        }else
        {
            @mssql_select_db($Data_base, $db);
        }
    }

Соответственно на каждой странице, где тебе нужно, ты подгружешь эту функцию из файла и всё.[/QUOTE]
За такой код УВОЛИЛ бы тебя и пинок еще вдогонку дал!! Что за мания хранить пароли в файлах с расширением .inc?
2.8K
04 октября 2006 года
S|lent
65 / / 20.04.2005
ну это просто пример функции:) а на будующее, где лучше хранить эти данные?
13
04 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=S|lent]ну это просто пример функции:) а на будующее, где лучше хранить эти данные?[/QUOTE]
В файле с расширением .php
2.8K
04 октября 2006 года
S|lent
65 / / 20.04.2005
Отдельно делать include('connect.php')?
13
04 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=S|lent]Отдельно делать include('connect.php')?[/QUOTE]
Не создавать файлов с расширением .inc вообще
Разница в том что по умолчанию веб сервер не обрабатывает их как РНР файл, если их запросить из браузера. И если такой файл запросить - будет виден весь код, а значит и все твои пароли...
2.8K
04 октября 2006 года
S|lent
65 / / 20.04.2005
Большое человеческое спасибо, правда мы отвлеклись от темы форума.:)
13
04 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=sav13][COLOR="Red"]Дано:[/COLOR]
БД Oracle, Сервер Apache 2.0, PHP 5, модуль OCI
Требуется создать соединение с базой
[COLOR="Navy"]$xxx = oci_connect( ... );[/COLOR]
которое будет работать на нескольких страницах клиента без переподключения.

Например, через сохранения переменной $xxx в сессию PHP

[COLOR="red"]Цель:[/COLOR]
1. Работать с временной табличкой ORACLE, которая живет в рамках одного connectа, на нескольких страницах клиента
2. На одной страничке открыть транзакцию, на следующей что-то делать с базой, затем спросить про сохранение изменений и сделать COMMIT или ROLLBACK.
3. Создать пакет PL/SQL ORACLE. Насоздавать глобальных переменных, а на следующей странице прочитать их изменение.

[COLOR="red"]Проблема:[/COLOR] - после закрытия каждой стринички происходит автоматическое закрытие с базой ORACLE

Писать свой модуль работы с ORACLE на PHP влом.[/QUOTE]

Мне лично думается что это невозможно... Все равно что в одном скрипте открыть файл, а в другом его считать...
16K
05 октября 2006 года
sav13
21 / / 01.10.2006
[QUOTE=RussianSpy]Мне лично думается что это невозможно... Все равно что в одном скрипте открыть файл, а в другом его считать...[/QUOTE]

Я тоже пришел к тому же выводу. :(

Единственный вариант, ставить сервер приложений, например JBOSS, и обращаться к базе из PHP не через OCI, а через SOAP и всю логику работы с базой держать на сервере приложений.
Ну или писать свой сервер приложений.

Была глупая мечта, что все гораздо проще и нужно просто волшебный флажочек в php.ini указать:)
7.3K
05 октября 2006 года
JB13
64 / / 05.09.2005
oci_pconnect -- Устанавливает постоянное соединение с сервером Oracle
2.8K
05 октября 2006 года
S|lent
65 / / 20.04.2005
[QUOTE=JB13]oci_pconnect -- Устанавливает постоянное соединение с сервером Oracle[/QUOTE]

пока скрипт не завершит свою работу. Как только интерпретатор увидит ?> соединение с сервером баз данных закроется автоматически.
16K
06 октября 2006 года
sav13
21 / / 01.10.2006
[QUOTE=JB13]oci_pconnect -- Устанавливает постоянное соединение с сервером Oracle[/QUOTE]

Да и дескриптор подключения в переменной сессии как хранить?
Там только текстовые переменные хранятся
7.3K
06 октября 2006 года
JB13
64 / / 05.09.2005
Честно говоря я с Oracle работал очень мало, я взял эту функцию по аналогии с mysql_pconnect. Что касаемо mysql_pcoonect (из мануала):

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

Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется рабочим для будущего использования (mysql_close() также не закрывает постоянные соединения)

По идее принцип должен быть тот же.
13
06 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=JB13]Честно говоря я с Oracle работал очень мало, я взял эту функцию по аналогии с mysql_pconnect. Что касаемо mysql_pcoonect (из мануала):

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

Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется рабочим для будущего использования (mysql_close() также не закрывает постоянные соединения)

По идее принцип должен быть тот же.[/QUOTE]

При большой нагрузке на сервер постоянное соединение не канает... Проверено.
7.3K
06 октября 2006 года
JB13
64 / / 05.09.2005
А если использовать ADODB http://phplens.com/lens/adodb/ ?
Если установить постоянное соединение вообще нельзя, то можно создавать таблицы с разными именами, например table_userid, только при этом возникает два минуса.
1 - при большом кол-во пользователей, будет много таблиц
2 - нужно заморочиться с алгоритмом для их удаления
13
06 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=JB13]А если использовать ADODB http://phplens.com/lens/adodb/ ?
Если установить постоянное соединение вообще нельзя, то можно создавать таблицы с разными именами, например table_userid, только при этом возникает два минуса.
1 - при большом кол-во пользователей, будет много таблиц
2 - нужно заморочиться с алгоритмом для их удаления[/QUOTE]
Более дебильной идеи давно не слышал...
7.3K
06 октября 2006 года
JB13
64 / / 05.09.2005
Это как вариант. У тебя есть варианты лучше? предлагай.
13
06 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=JB13]Это как вариант. У тебя есть варианты лучше? предлагай.[/QUOTE]
Ты сам понял что сказал? "Если нельзя создать постоянное соединение, то давайте создадим много таблиц"
А давайте запустим воздушного змея... Или перекрасим монитор в розовый цвет... а вдруг поможет
7.3K
06 октября 2006 года
JB13
64 / / 05.09.2005
Я не говорю, что идея хорошая, я поэтому и написал там минусы. Если скажем сайт для локальной сети, где пользователей несколько десятков, а заморачиваться не хочется, то почему бы и нет.
В общем предлагаю по этому поводу не спорить. Фиговая, так фиговая и фиг с ним.
13
06 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=JB13]Я не говорю, что идея хорошая, я поэтому и написал там минусы. Если скажем сайт для локальной сети, где пользователей несколько десятков, а заморачиваться не хочется, то почему бы и нет.
В общем предлагаю по этому поводу не спорить. Фиговая, так фиговая и фиг с ним.[/QUOTE]
Я только одного не понял: как связаны между собой подключение к БД и количество таблиц... Поясни этот момент
7.3K
06 октября 2006 года
JB13
64 / / 05.09.2005
Да никак не связаны.
Заходит на сайт пользователь, ему присваивается какое-нибудь id и для него создается отдельная таблица с необходимыми данными. На всех страницах происходит обращение именно к его таблице (или нескольким в зависимости от задачи). Когда таблица становится не нужна - удаляем. т.е. - вроде как временная таблица, только не для сессии с бд, а для каждого пользователя отдельно.
13
06 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=JB13]Да никак не связаны.
Заходит на сайт пользователь, ему присваивается какое-нибудь id и для него создается отдельная таблица с необходимыми данными. На всех страницах происходит обращение именно к его таблице (или нескольким в зависимости от задачи). Когда таблица становится не нужна - удаляем. т.е. - вроде как временная таблица, только не для сессии с бд, а для каждого пользователя отдельно.[/QUOTE]
И что ты собираешься в ней хранить? Зачем таблица? для таких целей существуют сессии... И так я и не понял при чем здесь постоянное подключение к БД
16K
06 октября 2006 года
sav13
21 / / 01.10.2006
Если поднять первоночальный вопрос, то интересует на одной WEB-страничке открыть транзакцию к БД, на второй что-то поделать, а на третьей завершить транзакцию (или откатить).

Такое можно сделать, если подключение к БД постоянное, так-как иначе по закытию каждой странички происходит AUTOCOMMIT.
7.3K
06 октября 2006 года
JB13
64 / / 05.09.2005
[QUOTE=sav13][COLOR="Red"]Дано:[/COLOR]
БД Oracle, Сервер Apache 2.0, PHP 5, модуль OCI
Требуется создать соединение с базой
[COLOR="Navy"]$xxx = oci_connect( ... );[/COLOR]
которое будет работать на нескольких страницах клиента без переподключения.

Например, через сохранения переменной $xxx в сессию PHP
[/QUOTE]

Я лишь просто предлагаю, как в самом простом варианте реализовать некоторое подобие временной таблицы. Т.е. как можно поступить, если не получается установить постоянное соединение. Не факт, что такое решение подойдет в данном конкретном случае, нужно подробнее смотреть что за задача.
13
06 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=sav13]Если поднять первоночальный вопрос, то интересует на одной WEB-страничке открыть транзакцию к БД, на второй что-то поделать, а на третьей завершить транзакцию (или откатить).

Такое можно сделать, если подключение к БД постоянное, так-как иначе по закытию каждой странички происходит AUTOCOMMIT.[/QUOTE]
Если требуется такое извращение - значит подход к решению задачи неверен. Распиши для чего тебе вообще это нужно. Тут умных людей много - насоветуют что-нибудь.

ЗЫ такой хрени даже в многовалютной биллинговой системе не встречал.
15
06 октября 2006 года
shaelf
2.7K / / 04.05.2005
[QUOTE=RussianSpy]В файле с расширением .php[/QUOTE]
И по возможности выше корня. При большом желании можно только один php файл держать в корне (контроллер), а остальные вынести выше. Удобно)
16K
06 октября 2006 года
sav13
21 / / 01.10.2006
[QUOTE=RussianSpy]Если требуется такое извращение - значит подход к решению задачи неверен. Распиши для чего тебе вообще это нужно. Тут умных людей много - насоветуют что-нибудь.

ЗЫ такой хрени даже в многовалютной биллинговой системе не встречал.[/QUOTE]

Я задал вполне конкретный вопрос про постоянный CONNECT.

Ответ "Это принипиально невозможно потому что ..." меня тоже устраивает.
Ответ "Это извращение" в данном контексте выглядет как "Я не знаю".

Если интересна суть проблемы, то есть куча объектов на PL/SQL работающих внутри ORACLE. Если я делаю оператор NEW для объекта PL/SQL, то это объект живет только внутри одного коннекта, то есть ьлдбко на одной WEB странички.

Решение данного вопроса уже найдено - использовать JBOSS как промежуточный сервер приложения и ображаться к нему из PHP чрез SOAP протокол.
13
06 октября 2006 года
RussianSpy
3.0K / / 04.07.2006
[QUOTE=sav13]Я задал вполне конкретный вопрос про постоянный CONNECT.

Ответ "Это принипиально невозможно потому что ..." меня тоже устраивает.
Ответ "Это извращение" в данном контексте выглядет как "Я не знаю".

Если интересна суть проблемы, то есть куча объектов на PL/SQL работающих внутри ORACLE. Если я делаю оператор NEW для объекта PL/SQL, то это объект живет только внутри одного коннекта, то есть ьлдбко на одной WEB странички.

Решение данного вопроса уже найдено - использовать JBOSS как промежуточный сервер приложения и ображаться к нему из PHP чрез SOAP протокол.[/QUOTE]
Успехов в работе.;)
25K
04 января 2007 года
unfrankness
2 / / 04.01.2007
Цитата: RussianSpy
При большой нагрузке на сервер постоянное соединение не канает... Проверено.



Это точно. А как быть-то в этом случае? Какими средствами/функциями/способами решить эту вставшую передо мной проблему? Подскажите, где что почитать или помогите кодом, пожалуйста :)
Мне нужно выполнить элементарный запрос к таблице БД и вывести этот резалт на экран. А при работе с mysql_connect(...) php-скрипт вылетает по таймеру через 30 сек. Сервер говорит, что постоянно к нему коннектиться нельзя и это не рационально...

13
04 января 2007 года
RussianSpy
3.0K / / 04.07.2006
Цитата: unfrankness
Это точно. А как быть-то в этом случае? Какими средствами/функциями/способами решить эту вставшую передо мной проблему? Подскажите, где что почитать или помогите кодом, пожалуйста :)
Мне нужно выполнить элементарный запрос к таблице БД и вывести этот резалт на экран. А при работе с mysql_connect(...) php-скрипт вылетает по таймеру через 30 сек. Сервер говорит, что постоянно к нему коннектиться нельзя и это не рационально...



Код в студию...

23K
05 января 2007 года
lost_shadow
13 / / 05.01.2007
Флажочек в студию!
25K
05 января 2007 года
unfrankness
2 / / 04.01.2007
Цитата: RussianSpy
Код в студию...



Благодарю за отзыв, я смог сам разобраться... Теперь проблема в другом (правда, немного не по теме рубрики): не подскажете, почему при сортировке данных в запросе по русскому алфавиту данные результата сортируются по буквам "какого-то нерусского" алфавита, а именно: б, в, ч, д, е, ц, к и т.п.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог