Использование PEAR для работы с БД. Ошибки БД отображаются для пользователей. Как остановиться? - PullRequest
2 голосов
/ 20 февраля 2012

Я унаследовал сайт, который использует PEAR для обработки всех вызовов БД.

Это пример того, как он обрабатывает запрос:

$result = $conn->query($sql);
if(PEAR::isError($result)) 
{ 
   die('<b>Error:</b>&nbsp;'.$result->getMessage().'
   <br/><b>Debug Info</b>:&nbsp;'.$result->getDebugInfo()); 
}
$row = $result->fetchRow(DB_FETCHMODE_ASSOC);

Это именно такна сотнях страниц этого сайта.Проблема заключается в том, что всякий раз, когда возникает какая-либо ошибка БД (например, ошибка синтаксиса SQL), он отображает ВСЮ ошибку и связанный запрос непосредственно пользователю из-за $result->getDebugInfo(), что является большим НЕТ-НЕТ дляочевидные причины безопасности.

Вместо того, чтобы показывать ошибку моим пользователям, я хочу, чтобы сайт просто отправлял мне электронные письма всякий раз, когда возникает ошибка БД, и отправлял мне по электронной почте содержимое $result->getDebugInfo(), а непоказ его пользователям, чтобы я мог быть предупрежден о проблеме и отладить ее, избегая при этом угрозы безопасности.

Теперь я подумал, что это будет так же просто, как поиск функции getDebugInfo() в библиотеке PEAR.и изменить его, чтобы сделать выше, но это не сработало, что очень озадачивает.Я нашел функцию только в одном месте, которое было основным файлом класса PEAR.php, и оно выглядит так:

function getDebugInfo()
{       
    return $this->getUserInfo();
}

Независимо от того, какие изменения я внесу в эту функцию, они НЕ отражаются, когда $result->getDebugInfo() называется в сценарии, который невероятно озадачивает и заставляет меня вырывать волосы.Я даже пытался закомментировать функцию ВЕСЬ, и она ЕЩЕ отображает код ошибки для моих пользователей, как если бы это был HAL, и он полностью контролировал свои действия, пока я его маленький миньон.Поговорим о недоумении (я теперь лысый)!

Так как же мне заставить мой сайт перестать показывать ошибку PEAR и код SQL моим пользователям и вместо этого отправлять мне по электронной почте?

1 Ответ

0 голосов
/ 20 февраля 2012

Найдите

die('<b>Error:</b>&nbsp;'.$result->getMessage().'
   <br/><b>Debug Info</b>:&nbsp;'.$result->getDebugInfo()); 

и замените на

handleQueryError($result);

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

...