Пусть имеется некоторая система на php, к которой можно подключать модули. Каждый подключаемый модуль - php класс. Система, естественно, подключается к mysql обычным mysql_connect, при этом все следующие mysql_query будут использовать созданное единственное соединение автоматически. Проблема: ограничение прямого доступа к mysql для подключаемых модулей. Т.е. необходимо сделать так, чтобы вызов функции mysql_query внутри подключенного модуля не давал возможности выполнить какой-либо SQL-запрос, используя созданное системой подключение. Есть какой-нибудь вариант локализации действия mysql_connect (за исключением mysql_close перед подключением модуля)? Или, быть может, реально сделать так?: система подключилась к MySQL; id подключения для использования в "своих" SQL-запросах был сохранен в защищенной переменной; затем сделать что-нибудь магическое, чтобы все последующие mysql_query не могли работать без явного указания идентификатора подключения к mysql.
Когда работаешь с php, любое "нет" необходимо учиться читать как "нет, но если извратиться - то можно". :wink: Итак, учимся читать мануалы и извращаться: В функциях mysql есть некий страшный параметр link_identifier: Это идентификатор подключения к MySQL. Если он не указан, функция жадно бросается на последний созданный. Значит, надо сделать так, чтобы последний созданный был бесполезным, но его создание не вызывало никаких ошибок. Единственное, что мне пришло в голову, это открыть два соединения и закрыть последнее, а дальше юзать идентификатор, полученный от первого: PHP: <? $cs1=mysql_connect('localhost','root','pass', 'test', true); // создаем первое подключение $cs2=mysql_connect('localhost','root','pass', 'test', true); // сразу же создаем второе подключение mysql_close($cs2); // и тут же его закрываем echo "<b>Я хорошая часть кода!</b><br>"; mysql_select_db('test', $cs1); // используя настоящее подключение выбираем БД $res = mysql_query("SELECT * FROM `test`", $cs1); // делаем из нее выборку (указывая id правильного подключения) while ($a = mysql_fetch_array($res)) // забираем результат echo print_r($a,1)."<br>"; // и выводим echo "<b>А я потенциально опасный модуль!</b><br>"; $res = mysql_query("SELECT * FROM `test`"); // а теперь пробуем сделать выборку без явного указания id подключения if (!$res) // проверяем результат mysql_query echo "Error"; // а дальше комментировать не имеет смысла. Ибо будет Error, как я и хотел. else while ($a = mysql_fetch_array($res)) echo print_r($a,1)."<br>"; ?> Вывод кода: Примечание: на сервере не должно существовать доступа к БД без пароля от имени пользователя root, т.к. не найдя рабочего подключения к БД, функция mysql_query попытается создать его от имени пользователя root. Последний параметр true в mysql_connect - это bool $new_link, который необходимо выставить в единицу, чтобы было создано новое соединение, не смотря на то, что его параметры совпадают с уже созданным. Время: Выполнение скрипта, к сожалению, замедляется на время создания нового соединения. Т.ч. метод требует обязательной оптимизации Что я получил от этого: Ограничение доступа к MySQL для модулей, написанных для CMS сторонними разработчиками. Предоставляя ограниченный функционал через быстрый API ядра цмс-ки, автор системы может не бояться за mysql-криворукость разработчиков модулей и наличие в них sql-уязвимостей, т.к. ущерб будет локализован областью влияния модуля.
Ошибка вашего вопроса тут. Вы принимаете за «естественное» то, что естественным не является. И уж тем более, не является естественным в ключе вашей задачи.
Не будем обсуждать мимо темы,)) Да. Используется ADODB или подобный фреймворк. Но вопрос от этого не меняется - mysql_query при drive=mysql в ADODB все равно будет работать.
Ответ этого тоже не поменяется, не нужно пользоватся mysql_* функциями. Однако, упорствовать в своем заблуждении — ваше исключительное право. Засим, откланяюсь.