[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Возможен ли двойной return
GET
Здравствуйте, совсем наверное глупый вопрос.

Есть функция в скрипте.

Типа такой:

function error($a)
{
$_SESSION['error']=$a;
return;
}

// код
...
else
{
error($a1);
return;
}
//код
...
else
{
error($a2);
return;
}


Короче связку
else{error($a1);return;}
приходится много раз делать.
Я понимаю, что смысл return внутри функции и внутри самого скрипта разный, но нет ли способа не писать 20 раз это в скрипте, чтоб выйти, а писать только
else error($a1);
например?

Можно конечно писать на прямую $_SESSION['error']='1a'; и т.д. но смысл тот же.





Спустя 2 минуты, 45 секунд (14.06.2012 - 13:33) inpost написал(а):
Зачем тебе return писать? Вообще не понимаю...

Спустя 5 минут, 8 секунд (14.06.2012 - 13:38) GET написал(а):
inpost
ну да внутри функции можно не писать...

но чтоб выйти из скрипта не дожидаясь завершения скрипта и не писать проверок типа продолжить если ошибок выше нет

Спустя 1 минута, 11 секунд (14.06.2012 - 13:40) GET написал(а):
Чтоб сразу остановить скрипт и вернутся назад...в браузере там ничего не выводится это обработчик ошибок

Спустя 11 минут, 27 секунд (14.06.2012 - 13:51) inpost написал(а):
A.B.C.
return пишется ВНУТРИ функции, а не при её вызове... там то ему точно нет места. Ты что-то сам запутался в том, что тебе надо.

Спустя 3 минуты, 54 секунды (14.06.2012 - 13:55) GET написал(а):
inpost
return - тот что в функции выйдет из нее, вернет значение и т.д. я про return, который вернется из инклюдиемого файла...внутри которого функция, чтоб он и из функции вышел и из подключаемого файла одновременно.

Спустя 2 минуты (14.06.2012 - 13:57) GET написал(а):
index.php
include'1.php';

1.php
function error($a)
{
$_SESSION['error']=$a;
return;
}
// код
...
else
{
error($a1);
return;// вернутся в index.php
}

Спустя 6 минут, 39 секунд (14.06.2012 - 14:04) inpost написал(а):
А, понял. Нет, по крайней мере я не знаю. Ты выходишь только из данного уровня через return.

Спустя 14 секунд (14.06.2012 - 14:04) TMake написал(а):
A.B.C. exit('Error'); тебе поможет раз и на всегда.
вообще не вижу смысла для такой реализации как у тебя.
Пользуйся throw new Exception();

Спустя 1 минута, 43 секунды (14.06.2012 - 14:06) GET написал(а):
Да...это не реально наверное, я просто подумал, может типа exit; метод существует только он не останавливает скрипт полностью, а выходит из текущего, даже если находится внутри функции.

stepan Я хочу ошибку в логи занести, а не просто exit;

Спустя 8 минут, 31 секунда (14.06.2012 - 14:14) GET написал(а):
Цитата
Пользуйся throw new Exception();


спасибо, даже не знал про это.

Спустя 15 минут, 46 секунд (14.06.2012 - 14:30) neadekvat написал(а):
Исключение останавливает выполнение программы. Не надо пихать его везде и всюду.

По тому, что ты показал:

function log($msg)
{
file_put_contents('log.log', $msg, FILE_APPEND);
}

function some()
{
...
return err($msg); // NULL
}

Спустя 34 минуты, 23 секунды (14.06.2012 - 15:04) GET написал(а):
Спасибо.

Еще вопрос хотел задать по ошибкам.

Если я перехватываю все ошибки при помощи set_error_handler, записываю их в лог файл, тогда в запросах к БД нужно ставить
or die(mysql_error());
чтоб и прекратить работу скрипта и занести ошибку.

Правильно я понял? Существуют ли ошибки некритичные mysql_error(), т.е. как бы предупреждения из за которых останавливать (or die) скрипт не надо.

Ну например часть информации вышла в цикле запроса а какая-нибудь строка некорректна или типа того, как тогда быть?

Спустя 6 минут, 42 секунды (14.06.2012 - 15:11) neadekvat написал(а):
Запросы обычно делают через обертку, чтобы это было явно:

function sql_query($sql)
{
$query = mysql_query($sql);
if ($query)
return $query;

// записываем ошибку в лог, останавливаем выполнение скрипта
}


Если при запросе к бд есть ошибка, то на сайте не должно отображаться ничего, кроме, собственно, сообщения для пользователя о том, что сайт временно недоступен.

Спустя 3 минуты, 14 секунд (14.06.2012 - 15:14) GET написал(а):
Спасибо.


Спустя 2 минуты, 56 секунд (14.06.2012 - 15:17) johniek_comp написал(а):
я делаю так

mysql_query() or die($logs->write(mysql_error()));


а метод write мне еще останавливает скрипт и выводит что сайт не доступен

Спустя 10 минут, 34 секунды (14.06.2012 - 15:28) GET написал(а):
johniek_comp

разве or die не останавливает?

Спустя 7 минут, 27 секунд (14.06.2012 - 15:35) TMake написал(а):
Цитата (A.B.C. @ 14.06.2012 - 16:28)
разве or die не останавливает?

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

Спустя 4 минуты, 27 секунд (14.06.2012 - 15:40) GET написал(а):
stepan

не понимаю...остановка же не в самом методе write, там как я понимаю идет запись ошибки и вывод странички о недоступности сайта, так ведь. Т.е. это последние что делает скрипт перед die.

Спустя 7 минут, 58 секунд (14.06.2012 - 15:47) TMake написал(а):
A.B.C. организовано логирование. apache и так логирует все что нужно, поэтому это лишнее, конечно если оно не используется для чего то...

Спустя 3 минуты, 22 секунды (14.06.2012 - 15:51) GET написал(а):
Ок. Спасибо.

Спустя 9 минут, 6 секунд (14.06.2012 - 16:00) killer8080 написал(а):
Цитата (A.B.C. @ 14.06.2012 - 15:04)
Если я перехватываю все ошибки при помощи set_error_handler, записываю их в лог файл, тогда в запросах к БД нужно ставить
or die(mysql_error());
чтоб и прекратить работу скрипта и занести ошибку.


Во первых set_error_handler() не перехватывает все ошибки.
Во вторых конструкцию or die(mysql_error()); в продакшине, уже можно считать уязвимостью, т.к. через неё взломщик может получить информацию о внутренней структуре каталогов сервера, названиях и структуре таблиц бд, и т.п. и использовать собранную инфу для атаки. Поэтому её допустимо использовать только при отладке, и главное не забывать убирать.
Поэтому все ошибки перехватывать и писать в лог, как уже писали выше, а юзеру показывать стандартную страницу с ошибкой, и не забывать при этом выдавать 503 статус код, чтоб поисковики не приняли текст ошибки за реальный контент. По перехвату ошибок на дклабе есть хорошая статейка.

Спустя 2 часа, 32 минуты, 1 секунда (14.06.2012 - 18:32) johniek_comp написал(а):
я примерно описал, а не скопировал код с проекта! вы что настолько тупые???

Спустя 1 час, 35 минут, 24 секунды (14.06.2012 - 20:07) killer8080 написал(а):
Цитата (johniek_comp @ 14.06.2012 - 18:32)
я примерно описал, а не скопировал код с проекта! вы что настолько тупые???

Чё за реплика blink.gif


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.