Как в PHP удержать соединение к БД в сессии
БД 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 влом.
Код:
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="Подключиться к базе данных" onClick="java script:location.reload()">';
exit;
}else
{
@mssql_select_db($Data_base, $db);
}
}
{
include("connect.inc");
global $db;
global $select;
$db = @mssql_pconnect ($Server, $User, $Pass);
if ($db == false)
{
echo "Невозможно подключиться к базе данных.";
echo '<br><br><input type="button" value="Подключиться к базе данных" onClick="java script:location.reload()">';
exit;
}else
{
@mssql_select_db($Data_base, $db);
}
}
Соответственно на каждой странице, где тебе нужно, ты подгружешь эту функцию из файла и всё.
Код:
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="Подключиться к базе данных" onClick="java script:location.reload()">';
exit;
}else
{
@mssql_select_db($Data_base, $db);
}
}
{
include("connect.inc");
global $db;
global $select;
$db = @mssql_pconnect ($Server, $User, $Pass);
if ($db == false)
{
echo "Невозможно подключиться к базе данных.";
echo '<br><br><input type="button" value="Подключиться к базе данных" onClick="java script:location.reload()">';
exit;
}else
{
@mssql_select_db($Data_base, $db);
}
}
Соответственно на каждой странице, где тебе нужно, ты подгружешь эту функцию из файла и всё.[/QUOTE]
За такой код УВОЛИЛ бы тебя и пинок еще вдогонку дал!! Что за мания хранить пароли в файлах с расширением .inc?
ну это просто пример функции:) а на будующее, где лучше хранить эти данные?
В файле с расширением .php
Отдельно делать include('connect.php')?
Не создавать файлов с расширением .inc вообще
Разница в том что по умолчанию веб сервер не обрабатывает их как РНР файл, если их запросить из браузера. И если такой файл запросить - будет виден весь код, а значит и все твои пароли...
Большое человеческое спасибо, правда мы отвлеклись от темы форума.:)
БД 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]
Мне лично думается что это невозможно... Все равно что в одном скрипте открыть файл, а в другом его считать...
Я тоже пришел к тому же выводу. :(
Единственный вариант, ставить сервер приложений, например JBOSS, и обращаться к базе из PHP не через OCI, а через SOAP и всю логику работы с базой держать на сервере приложений.
Ну или писать свой сервер приложений.
Была глупая мечта, что все гораздо проще и нужно просто волшебный флажочек в php.ini указать:)
oci_pconnect -- Устанавливает постоянное соединение с сервером Oracle
пока скрипт не завершит свою работу. Как только интерпретатор увидит ?> соединение с сервером баз данных закроется автоматически.
Да и дескриптор подключения в переменной сессии как хранить?
Там только текстовые переменные хранятся
Во-первых, при соединении, функция пытается найти уже открытый (постоянный) указатель на тот же сервер с тем же пользователем и паролем. Если он найден, возвращён функцией будет именно он, вместо открытия нового соединения.
Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется рабочим для будущего использования (mysql_close() также не закрывает постоянные соединения)
По идее принцип должен быть тот же.
Во-первых, при соединении, функция пытается найти уже открытый (постоянный) указатель на тот же сервер с тем же пользователем и паролем. Если он найден, возвращён функцией будет именно он, вместо открытия нового соединения.
Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется рабочим для будущего использования (mysql_close() также не закрывает постоянные соединения)
По идее принцип должен быть тот же.[/QUOTE]
При большой нагрузке на сервер постоянное соединение не канает... Проверено.
http://phplens.com/lens/adodb/ ?
Если установить постоянное соединение вообще нельзя, то можно создавать таблицы с разными именами, например table_userid, только при этом возникает два минуса.
1 - при большом кол-во пользователей, будет много таблиц
2 - нужно заморочиться с алгоритмом для их удаления
А если использовать ADODB
Если установить постоянное соединение вообще нельзя, то можно создавать таблицы с разными именами, например table_userid, только при этом возникает два минуса.
1 - при большом кол-во пользователей, будет много таблиц
2 - нужно заморочиться с алгоритмом для их удаления
http://phplens.com/lens/adodb/ ?
Если установить постоянное соединение вообще нельзя, то можно создавать таблицы с разными именами, например table_userid, только при этом возникает два минуса.
1 - при большом кол-во пользователей, будет много таблиц
2 - нужно заморочиться с алгоритмом для их удаления[/QUOTE]
Более дебильной идеи давно не слышал...
[QUOTE=JB13]А если использовать ADODB
Если установить постоянное соединение вообще нельзя, то можно создавать таблицы с разными именами, например table_userid, только при этом возникает два минуса.
1 - при большом кол-во пользователей, будет много таблиц
2 - нужно заморочиться с алгоритмом для их удаления[/QUOTE]
Более дебильной идеи давно не слышал...
Это как вариант. У тебя есть варианты лучше? предлагай.
Ты сам понял что сказал? "Если нельзя создать постоянное соединение, то давайте создадим много таблиц"
А давайте запустим воздушного змея... Или перекрасим монитор в розовый цвет... а вдруг поможет
В общем предлагаю по этому поводу не спорить. Фиговая, так фиговая и фиг с ним.
В общем предлагаю по этому поводу не спорить. Фиговая, так фиговая и фиг с ним.[/QUOTE]
Я только одного не понял: как связаны между собой подключение к БД и количество таблиц... Поясни этот момент
Заходит на сайт пользователь, ему присваивается какое-нибудь id и для него создается отдельная таблица с необходимыми данными. На всех страницах происходит обращение именно к его таблице (или нескольким в зависимости от задачи). Когда таблица становится не нужна - удаляем. т.е. - вроде как временная таблица, только не для сессии с бд, а для каждого пользователя отдельно.
Заходит на сайт пользователь, ему присваивается какое-нибудь id и для него создается отдельная таблица с необходимыми данными. На всех страницах происходит обращение именно к его таблице (или нескольким в зависимости от задачи). Когда таблица становится не нужна - удаляем. т.е. - вроде как временная таблица, только не для сессии с бд, а для каждого пользователя отдельно.[/QUOTE]
И что ты собираешься в ней хранить? Зачем таблица? для таких целей существуют сессии... И так я и не понял при чем здесь постоянное подключение к БД
Такое можно сделать, если подключение к БД постоянное, так-как иначе по закытию каждой странички происходит AUTOCOMMIT.
БД Oracle, Сервер Apache 2.0, PHP 5, модуль OCI
Требуется создать соединение с базой
[COLOR="Navy"]$xxx = oci_connect( ... );[/COLOR]
которое будет работать на нескольких страницах клиента без переподключения.
Например, через сохранения переменной $xxx в сессию PHP
[/QUOTE]
Я лишь просто предлагаю, как в самом простом варианте реализовать некоторое подобие временной таблицы. Т.е. как можно поступить, если не получается установить постоянное соединение. Не факт, что такое решение подойдет в данном конкретном случае, нужно подробнее смотреть что за задача.
Такое можно сделать, если подключение к БД постоянное, так-как иначе по закытию каждой странички происходит AUTOCOMMIT.[/QUOTE]
Если требуется такое извращение - значит подход к решению задачи неверен. Распиши для чего тебе вообще это нужно. Тут умных людей много - насоветуют что-нибудь.
ЗЫ такой хрени даже в многовалютной биллинговой системе не встречал.
И по возможности выше корня. При большом желании можно только один php файл держать в корне (контроллер), а остальные вынести выше. Удобно)
ЗЫ такой хрени даже в многовалютной биллинговой системе не встречал.[/QUOTE]
Я задал вполне конкретный вопрос про постоянный CONNECT.
Ответ "Это принипиально невозможно потому что ..." меня тоже устраивает.
Ответ "Это извращение" в данном контексте выглядет как "Я не знаю".
Если интересна суть проблемы, то есть куча объектов на PL/SQL работающих внутри ORACLE. Если я делаю оператор NEW для объекта PL/SQL, то это объект живет только внутри одного коннекта, то есть ьлдбко на одной WEB странички.
Решение данного вопроса уже найдено - использовать JBOSS как промежуточный сервер приложения и ображаться к нему из PHP чрез SOAP протокол.
Ответ "Это принипиально невозможно потому что ..." меня тоже устраивает.
Ответ "Это извращение" в данном контексте выглядет как "Я не знаю".
Если интересна суть проблемы, то есть куча объектов на PL/SQL работающих внутри ORACLE. Если я делаю оператор NEW для объекта PL/SQL, то это объект живет только внутри одного коннекта, то есть ьлдбко на одной WEB странички.
Решение данного вопроса уже найдено - использовать JBOSS как промежуточный сервер приложения и ображаться к нему из PHP чрез SOAP протокол.[/QUOTE]
Успехов в работе.;)
Цитата: RussianSpy
При большой нагрузке на сервер постоянное соединение не канает... Проверено.
Это точно. А как быть-то в этом случае? Какими средствами/функциями/способами решить эту вставшую передо мной проблему? Подскажите, где что почитать или помогите кодом, пожалуйста :)
Мне нужно выполнить элементарный запрос к таблице БД и вывести этот резалт на экран. А при работе с mysql_connect(...) php-скрипт вылетает по таймеру через 30 сек. Сервер говорит, что постоянно к нему коннектиться нельзя и это не рационально...
Цитата: unfrankness
Это точно. А как быть-то в этом случае? Какими средствами/функциями/способами решить эту вставшую передо мной проблему? Подскажите, где что почитать или помогите кодом, пожалуйста :)
Мне нужно выполнить элементарный запрос к таблице БД и вывести этот резалт на экран. А при работе с mysql_connect(...) php-скрипт вылетает по таймеру через 30 сек. Сервер говорит, что постоянно к нему коннектиться нельзя и это не рационально...
Мне нужно выполнить элементарный запрос к таблице БД и вывести этот резалт на экран. А при работе с mysql_connect(...) php-скрипт вылетает по таймеру через 30 сек. Сервер говорит, что постоянно к нему коннектиться нельзя и это не рационально...
Код в студию...
Флажочек в студию!
Цитата: RussianSpy
Код в студию...
Благодарю за отзыв, я смог сам разобраться... Теперь проблема в другом (правда, немного не по теме рубрики): не подскажете, почему при сортировке данных в запросе по русскому алфавиту данные результата сортируются по буквам "какого-то нерусского" алфавита, а именно: б, в, ч, д, е, ц, к и т.п.