Обработка ошибок

Ashotovich

Новичок
Обработка ошибок

День добрый.

Подскажите, пожалуйста, как в PHP производить обработку ошибок Oracle? То есть чтобы на экран в случае неправильного ввода (например - повтора в ключевом поле) выводилось не
"Warning: OCIStmtExecute: ORA-00001: unique constraint (<>.<>) violated in c:\oracle\ora81\apache\...\aaaaa.php on line 17",
а сообщение
"Вы ввели повторяющееся значение. Пожалуйста, измените значение в поле №...".
Лучше всего это сделать средствами команд OCI8.

Заранее благодарю за помощь.
 

PhpDeveloper

Guest
А чем тебе не нравится то, что пишет сам Oracle?
 

Ashotovich

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

Ashotovich

Новичок
То бишь как вторую часть задачи решить я знаю:


$exec=OCIExecute($stmt);
if (!$exec)
{
echo "<HTML><PRE>";
print "Вы допустили ошибку при вводе. Повторите ввод данных";
echo "</PRE></HTML>\n";
}


А вот как уюрать сообщения Оракла... Не знаю =(
 

Sank

Guest
а секция Error handling and logging в php.ini - это не то?
 

PhpDeveloper

Guest
Автор оригинала: Ashotovich
Тем, что информация может во-первых - отпугнуть пользователей (представляю, сколько мне придется выслушать истерик по телефону!), а во-вторых - дать избыточную информацию потенциальному злоумышленнику. Короче, не нравятся мне эти ошибки.
Твоя программа должна контролировать переменные получаемые от пользователя. Если переменые не корректные, твоя программа должна САМА выводить ошибку, а не посылать все в Oracle.
 

Ashotovich

Новичок
Автор оригинала: PhpDeveloper
Твоя программа должна контролировать переменные получаемые от пользователя. Если переменые не корректные, твоя программа должна САМА выводить ошибку, а не посылать все в Oracle.
Если закладывать проверку формата и пр. данных для каждого поля, то это существенно замедлит работу программы из-за необходимости постоянно связываться с БД для проверки. А так - послал данные сразу из нескольких полей. Если ошибка - вывод соотв. сообщения, а не ошарашивание пользователя кучей информации об Оракле, Апаче, местом расположения PHP, загадочными цифрами и пр.
 

PhpDeveloper

Guest
Ну зачем тебе связываться с БД.

Неужели твоя программа сама не знает что, например, $age - это возраст, и то что он он имеет тип integer.

Продумай логику своей программы.
 

Ashotovich

Новичок
Да нет же. Дело не в этом. Конкретная проблема: пользователю позволяется заполнение ключевого поля таблицы БД. Если значение ключевого поля дублируется, то Оракл выдает сообщение об ошибке. Без проверки в БД не тут обойтись.
Так вот, как в такой ситуации поступить? Как получить код ошибки для последующей обработки в PHP?
 

PhpDeveloper

Guest
Автор оригинала: Ashotovich
Да нет же. Дело не в этом. Конкретная проблема: пользователю позволяется заполнение ключевого поля таблицы БД. Если значение ключевого поля дублируется, то Оракл выдает сообщение об ошибке. Без проверки в БД не тут обойтись.
Так вот, как в такой ситуации поступить? Как получить код ошибки для последующей обработки в PHP?
Проблема в логике твоей программы.

Например я как-то делал подписку на новости. Юзер мог ввести свой e-mail адрес и нажать кнопку 'подписаться'. Понятно, что e-mail адрес - первичный ключ. Разумеется его значение не должно дублироваться. Так вот, программа проверяла "внесен ли адрес в список рассылки", если внесен выводила соотв сообщение 'ваш адрес уже внесен в список рвссылки', а не 'Вы ввели повторяющееся значение. Пожалуйста, измените значение в поле №...'

Не нужно заменять стандартные средста обработки ошибок своими собственными. Иногда, конечно, бывает удобно добавить чтото от себя.
 

Ashotovich

Новичок
Прости, конечно, но какое имеет значение, что пишет программа - 'ваш адрес уже внесен в список рассылки', или 'Вы ввели повторяющееся значение. Пожалуйста, измените значение в поле №...'?
Главное же не в этом, а что, в твоем случае, программе приходилось лезть в БД, смотреть, есть ли там там этот e-mail адрес и только потом принимать решение - вносить его в БД или же выдать сообщение об ошибке 'ваш адрес уже внесен в список рассылки'. А если полей много? Допустим, десять. Что, десять раз коннектиться к базе и проверять?
Понимаешь, мне не нужно детальное сообщение об ошибке - в каком поле и чего не то. Мне нужно объяснить пользователю, что он что-то не так сделал. Не важно в каком поле. Просто - ок / не ок. Теоретически это действительно можно сделать, как я и описал. А сообщения об ошибках отключить в php.ini...
 

PhpDeveloper

Guest
У меня страницы всегда генерились PHP менее чем за 0.1 секунды. Запросов к БД тьма-тьмущая. Все возможные ошибки контролируются на каждом уровне абстракции. В БД посылается только корректный запрос. Если я вдруг увижу подобное сообщение от БД, это будет означать ошибку в моей программе, а не в запросе пользователя.

Картинка 7КБ грузиться ~ 2 сек.
 

Ashotovich

Новичок
Угу... Очобенно это будет летать в каком-нибудь Соликамске... Минимизировать трафик надо, иначе с нашими телефонными линиями в регионах можно сразу проект закрывать.
 

Ashotovich

Новичок
Это я к тому, что реализовывать все в программе - тяжко и трафик жрет. =)
 

PhpDeveloper

Guest
Трафик тут ни при чем. Все выполняется на стороне сервера.
 

Ashotovich

Новичок
Тож верно... Но писать влом - жуть. Грузануть чтоль человека, который тело БД пишет на Pl_sql? =)))
 

PhpDeveloper

Guest
Я давно понял что тебе переписывать программу - лень. На твоем месте мне тоже было бы лень.
 

young

Новичок
>> А вот как уюрать сообщения Оракла... Не знаю =(
PHP:
$exec = @OCIExecute($stmt);
if (!$exec) {
  echo "<HTML><PRE>";
  print "Вы допустили ошибку при вводе. Повторите ввод   данных";
  echo "</PRE></HTML>\n";
}
Использовать @
 
Сверху