Логирование запросов MySQL

tanyaKAZ

Новичок
Передо мной стоит задача добавить в самописный движок механизм логирования запросов MySQL

вариант с изменением настроек в my.cnf или изменение глобальных переменных средствами SQL мне не подходит. Недостаточно прав доступа.

Механизм логирования должен быть реализован в самом движке.
В рамках модулей движка осуществляется доступ к базе данных с помощью sql запросов. Как правило таким образом:

$query = '...';
$query = mysql_make_qw($query , ...,...);
$result = mysql_query($query) or die('Ошибка .....' . $query . ' ' . mysql_error());

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

Моя проблема заключается в том, что мне придется пересмотреть весь код всего движка и заменить строку $result = mysql_query($query) or die('Ошибка .....' . $query . ' ' . mysql_error());

на , например

if (!$result = mysql_query($query) )
{
//вызов метода, записывающего сообщение об ошибке в файл
}

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

P.S. Есть идея реализовать механизм с помощью исключений, но это не решит главный вопрос, мне все равно придется пересмотреть весь код.
 

С.

Продвинутый новичок
Поскольку представленный код очень чайнический, то стоит воспользоваться поводом и пересмотреть весь код. Тем более, что там пересматривать? Поправить в 3-5 местах.
 

tanyaKAZ

Новичок
>> Поскольку представленный код очень чайнический, то стоит воспользоваться поводом и пересмотреть весь код. Тем более, что там пересматривать? >> Поправить в 3-5 местах.

не стоит торопиться с выводами о коде. Это лишь общая схема, достаточная для того, чтобы предложить помощь или нет., а запросов в движке много. Объем кода большой.
Вы знаете другой способ послать запрос на выполнение средствами mysql кроме как использование функций mysql_query . А выкладывать классы в тему форума для того чтобы получить совет не вижу смысла
 

riff

Новичок
Добавь функцию my_query и вызывай её, а уж она пущай вызывает mysqli_query и логирует.
придется пересмотреть весь код всего движка и заменить строку $result = mysql_query($query) or...
 

С.

Продвинутый новичок
Да что за пересмотрофобия? Будто код на железобетонной плите выбит или поиск по файлам еще не изобрели. Работы на 10 минут, охов и ахов -- полтонны.
 

riff

Новичок
С.,
Да что за пересмотрофобия?
Страшно заглядывать в старые, тёмные уголки кода. Ладно если просто заменить, а если вспоминать придётся как оно там работало?...
 

tanyaKAZ

Новичок
С.,
Страшно заглядывать в старые, тёмные уголки кода. Ладно если просто заменить, а если вспоминать придётся как оно там работало?...
В моем случае придется просто заменить. У меня была идея переопределить функцию mysql_query . Но для этого потребуется установка новых модулей php . Не все хостинг - провайдеры это поддерживают ...
Я думала, что можно перехватить вызов функции php ... той же mysql_query()...
Были также попытки реализовать такой алгоритм ... Мы ведь можем с помощью функции mysql_error() получить строку с сообщением об ошибке. Можно было пустить в бесконечном цикле обращение к этой функции - как бы ее слушатель. И как-то распараллелить процессы. Но средств для реализации такого алгоритма я не вижу в php ... pcntl не подходит ...
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Обертку использовать над модулей php вы не догадались?
 

riff

Новичок
У меня была идея переопределить функцию mysql_query . Но для этого потребуется установка новых модулей php . Не все хостинг - провайдеры это поддерживают ...
Можно было пустить в бесконечном цикле обращение к этой функции - как бы ее слушатель. И как-то распараллелить процессы. Но средств для реализации такого алгоритма я не вижу в php ... pcntl не подходит ...
После такого я чувствую себя чайником, и мне стыдно за свой примитивный ответ.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
То есть вы представляете себе как "слушать обращения", "распараллелить" и "переопределить", но тем не менее, до сих пор не додумались написать свой класс-обертку для работы с mysql? То есть написать класс/набор методов, где вся работа была бы вынесена в свои методы, и mysql_query, от которого давно надо отказаться, дергался бы только внутри класса в паре мест.

Стоит поискать по этому форуму, например есть http://phpclub.ru/talk/threads/Пятница-Говнокод-Парсинг-плейсхолдеров.76371/ такая тема, где в первом посте есть ссылка на библиотеку. Есть куча оберток, в том числе старая от Котерова и куча других.
 

tanyaKAZ

Новичок
То есть вы представляете себе как "слушать обращения", "распараллелить" и "переопределить", но тем не менее, до сих пор не додумались написать свой класс-обертку для работы с mysql? То есть написать класс/набор методов, где вся работа была бы вынесена в свои методы, и mysql_query, от которого давно надо отказаться, дергался бы только внутри класса в паре мест.

Стоит поискать по этому форуму, например есть http://phpclub.ru/talk/threads/Пятница-Говнокод-Парсинг-плейсхолдеров.76371/ такая тема, где в первом посте есть ссылка на библиотеку. Есть куча оберток, в том числе старая от Котерова и куча других.
все ясно, спасибо. Естественно я в курсе того, как написать класс обертку. ... сглупила немного (такое бывает). В моем движке я использую такую обертку. В принципе и в движке для которого, мне нужно написать логирование подобный класс используется. В нем правда только одна функция , позволяющая защитить код от sql - инъекций.
Мне хотелось попытаться решить задачу с минимальным вмешательством в код. Написать некий универсальный механизм, который не потребует "чистить код", что-то типа надстройки ... добавил функцию в код в одном месте и логирование запустилось.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Так если у тебя есть обертка, тогда не вижу вообще проблем...
 

С.

Продвинутый новичок
Так если у тебя есть обертка, тогда не вижу вообще проблем...
VVV
подобный класс используется. В нем правда только одна функция , позволяющая защитить код от sql - инъекций.
Вот он вызывается во второй строке:
$query = '...';
$query = mysql_make_qw($query , ...,...);
$result = mysql_query($query) or die('Ошибка .....' . $query . ' ' . mysql_error());
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
С., Я так понял, что это простая функция, которая делает что-то с запросом, а обертки что-то я не вижу...
 

С.

Продвинутый новичок
Просто все, что утверждает эта дама, надо делить на 3.14. Терминами она жонглирует хорошо.
 

tanyaKAZ

Новичок
С., Я так понял, что это простая функция, которая делает что-то с запросом, а обертки что-то я не вижу...
Ранее я уже писала, что обертка реализована в моем движке.
Мне нужно написать код для другого - стороннего движка.
Вы говорите о том, что "Так если у тебя есть обертка, тогда не вижу вообще проблем" . Обертка то есть, только в другом движке?
Перенести его на мой движок - хорошо перенесу.
Но в этом случае, мне придется как бы то ни было заменить все фрагменты типа

$query = '...';
$query = mysql_make_qw($query , ...,...);
$result = mysql_query($query) or die('Ошибка .....' . $query . ' ' . mysql_error());

на новый код, использующий конструкции моего класса "обертки"

я же обратилась на этот форум, чтобы спросить совет - возможно кто-то знает методы или механизмы, которые позволят не переделывать проект, не лезть в код, а анализировать, например, значение mysql_error() параллельно с работой проекта, не мешая ему.

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ок, теперь понятно, что у вас и где, то есть обертки просто нет на месте. Но вот при чем тут mysql_error() я до сих пор не понимаю.

PS: За это время можно было успеть переписать половину проекта имхо
 

hell0w0rd

Продвинутый новичок
А еще можно взять абсолютно любой современный редактор, найти кнопку "Replace in project/files" и везде заменить mysql_query на все что вам нужно
Потом найти кнопку поиска по регулярному выражению и выпилить вот это
Код:
or die('Ошибка .....' . $query . ' ' . mysql_error());
 
Сверху