Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2009, 09:35   #1
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
Вопрос mysql_connect - обработка исключений

Поискал в гугле, по PHP - форумам... Есть близкие вещи, но не то.
Суть такая - есть шлюз amfphp, php и flex. На php скрипт приходит запрос с параметрами, на который он должен ответить либо результатом подключения к базе, либо генерацией ошибки. Ошибки замечательно отлавливаются средствами Flex'а, тут проблем нет. Но. mysql_connect в зависимости от того, почему подключение не состоялось, генерирует конкретную ошибку, с конкретным кодом и текстом, а в возвращает - вне зависимости от причины - один и тот же false. Т.е. когда мне надо вывалить сообщение на flex-клиента, с описанием причины, на основании этого я действовать не могу. Остается такой вариант - не подавляя вывод ошибок в mysql_connect - перехватывать их на стороне клиента. Малоприятное и децентрализованное занятие, плюс ко всему шлюз amfphp вместо кода ошибки в данном случае передает строку "AMFPHP_RUNTIME_ERROR". Парсить строку с сообщением? Еще один кусок гомнокода...
Ребят, подскажите - можно ли внутри кода PHP 5 отловить ошибку, сгенерированную функциями вроде мускулконнекта?
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 06.02.2009, 10:52   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
Ребят, подскажите - можно ли внутри кода PHP 5 отловить ошибку, сгенерированную функциями вроде мускулконнекта?
А чего ж нельзя. Можно, если я правильно понял суть вопроса.
А зря вы кусок кода не выложили. По нему можно было поточнее сказать.
SkyM@n вне форума Ответить с цитированием
Старый 06.02.2009, 11:07   #3
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Хм. кусок- так кусок))
значится так.
Код:
...
private function setLink()
{
$this->link=mysql_connect($this->getDbhost(),$this->getDbuser(),$this->getDbpassword());
}
...
В случае, если подключение не состоялось - mysql_connect генерирует системную ошибку. А надо - перехватить ее, и вдоволь над ней поиздевавшись отправить дальше, в видоизмененной форме служить на благо отечества.

PS. Набрел на set_error_handler. Но. если я делаю так:
Код:
include "Except.php";
class SqlProxy
{
    public function SqlProxy($dbuser,$dbpassword)
    {
        set_error_handler('errorHandler');
    }

    function errorHandler($c, $m, $f, $l)
   {
	throw new Exception("test",123);
   }
...
то получаю в ответ на клиенте
Цитата:
set_error_handler() expects the argument (errorHandler) to be a valid callback
покурив тут:
http://ua.php.net/manual/en/language...types.callback
- пришел к такому:

Код:
<?php
class Except
{
	public static function errorHandler($c, $m, $f, $l)
	{
		trigger_error("test");
	}
}
?>
Код:
include 'Except.php';

class SqlProxy{

    public function SqlProxy($dbuser,$dbpassword)
    {
        ...
        set_error_handler(array('Except','errorHandler'));
    }
на клиенте получаю следующую ерунду c
Цитата:
hanel disconnected, channel disconnected, [object],[object]
. - один из признаков косяков в php-скрипте.
предупреждая вопросы - просто без выкрутасов trigger_error и throw new Exception (пока я не пытаюсь сделать кастомный перехват ошибок) передают ошибки в клиента без проблем.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!

Последний раз редактировалось crazy horse; 06.02.2009 в 19:15.
crazy horse вне форума Ответить с цитированием
Старый 06.02.2009, 13:31   #4
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Тогда надо буит читнуть вот тут: http://ua2.php.net/exceptions
SkyM@n вне форума Ответить с цитированием
Старый 06.02.2009, 18:11   #5
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Если написал что не просили не ругайтесь
Вариантов вагон и маленькая тележка...
1)set_error_handler - установить обработчик ошибок, поскольку Вы пишете обработчик для определённого участка кода устанавливаете обработик перед выполнением кода а после вызываете ф-ю restore_error_handler().
Никаких параметров ф-ии отправлять не надо параметры будут "даны" скрыто
PHP код:
function error_f ($num,$str,$file,$line){
//$num - номер класса ошибки (8-notice сразу лучше исключить
//обработку тк в быдлокоде их сотни) 
//$str - вообщем-то текст сообщения кот обычно возвращает php
//$file - в каком скрипте
//$line - строка в кот произошла ошибка
$return_sql_check='Error sql connection';
}
set_error_handler("error_f");
//вызов ф-ии
restore_error_handler() 
2)try-catch - перехват исключительной ситуации, и заглушить @
PHP код:
try{
  
//вызов ф-ии
  
if(!$this->link){
    throw new 
Exception('Error sql connection');
  }
}catch(
Exception $expection){
  
$return_sql_check=$expection->getMessage();

3)@
PHP код:
private function setLink()
{
$this->link=@mysql_connect($this->getDbhost(),$this->getDbuser(),$this->getDbpassword());
if(!
$this->link$return_sql_check='Error sql connection';

4)mysql_error
PHP код:
private function setLink()
{
$this->link=@mysql_connect($this->getDbhost(),$this->getDbuser(),$this->getDbpassword());
if(
mysql_error<>null$return_sql_check='Error sql connection';

Если Вам надо обрабатывать конкретные ошибки используйте варианты 1-4, если нужно отследит сам факт отсутствия соединения то я бы использовал вариант 2, который Вам известен
Стрелок-охотник

Последний раз редактировалось mv28jam; 06.02.2009 в 18:23. Причина: обьявление в обработку вписал
mv28jam вне форума Ответить с цитированием
Старый 06.02.2009, 18:32   #6
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Спасибо. Однако, как я уже говорил, все эти варианты, кроме первого, вернут мне только невозможность установить коннект. , же хочу знать - почему: то-ли юзверь ввел невалидные данные, то-ли попросту отвалился мускул. Сама функция mysql_connect дает этот ответ, но, к сожалению, его необходимо перехватить (выдается именнно error а не exception) и видоизменив, передать на стандартный вывод ошибок или исключений. Первый вариант - близок, но попытки его использовать приводят к ошибкам, которые описаны моим постом выше. Может просто у меня уже голова не варит, но я не могу понять, почему.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 06.02.2009, 18:39   #7
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

crazy horse,
Информация о ишибках мускула выдается так:
echo mysql_errno() . ": " . mysql_error() . "\n";
SkyM@n вне форума Ответить с цитированием
Старый 06.02.2009, 18:53   #8
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Я же написал что варианты 1 и 4, вам надо просто сделать перебор ошибок по номерам или сообщению.
1)функцию set_error_handler надо вызывать с параметром названия пользовательской ф-ии обработчика, error_f в моём примере, а на вход этой ф-ии ошибка будет подана втоматически в виде её параметров
PHP код:
function error_f ($num,$str,$file,$line){//!!!!!!!!!!Здесь идёт обработка! 
//$num - номер класса ошибки (8-notice сразу лучше исключить 
//обработку тк в быдлокоде их сотни)  
//$str - вообщем-то текст сообщения кот обычно возвращает php 
//$file - в каком скрипте 
//$line - строка в кот произошла ошибка 
$sql_error=$str;
if(
$sql_error<>null){ 
  switch (
$sql_error){
    case 
'текст ошибки': echo 'sql error 1';break;
    
//и так далее перебором всех ошибок
  
}  

set_error_handler("error_f"); 
//вызов ф-ии 
restore_error_handler() 
4)
PHP код:
private function setLink() 

$this->link=@mysql_connect($this->getDbhost(),$this->getDbuser(),$this->getDbpassword()); 
$sql_error=mysql_error();
if(
$sql_error<>null){ 
  switch (
$sql_error){
    case 
'текст ошибки': echo 'sql error 1';break;
    
//и так далее перебором всех ошибок
  
}  
  

Стрелок-охотник

Последний раз редактировалось mv28jam; 06.02.2009 в 18:57.
mv28jam вне форума Ответить с цитированием
Старый 06.02.2009, 19:10   #9
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

2mv28jam
я понимаю, что обработка идет в теле функции, описанной в кач-ве параметра set_error_handler. Тут суть такая - у меня этот ф-я вызывается в конструкторе объекта, который после выполнения запроса уничтожается. Вызывать её локально - смысла нет. Дальше. Echo у меня не пашет - клиент не браузер, а flash, по протоколу AMF. Но он замечательно принимает и распознает ошибки и эксэпшены, передаваемые пыхом. Поэтому я из тела обработчика выплюнул наружу кастомный эксепшн. Вобщем - вне обработчика - это работает. А внутри - ни он, ни банальный trigger_error.

2SkyM@n & mv28jam
за mysql_error() - огромное спасибо! Это как надо было заработаться, чтобы забыть о нем?)))

касательно set_error_handler - вопрос остается открытым. Не пашет он у меня. Видимо прошу его плохо.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 07.02.2009, 00:29   #10
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
касательно set_error_handler - вопрос остается открытым. Не пашет он у меня. Видимо прошу его плохо.
А что говорит? Или молчит?
SkyM@n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Fatal error: Call to undefined function mysql_connect() Air Помощь студентам 1 17.01.2009 12:41
Обработчик исключений Delphi xxxPascalxxx Помощь студентам 5 30.11.2008 06:37
Обработка исключений ввода в TMaskedEdit joker Общие вопросы Delphi 8 11.06.2008 15:02
обновление в блоге - Обработка исключений в Delphi Pblog Обсуждение статей 0 11.09.2007 18:40