Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сократить код 
:(
    Опции темы
fleetboss
Дата 11.11.2014, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2009

Репутация: нет
Всего: нет



Помогите с глупым вопросом smile
Я хочу сократить свой код:
Код

if (!$_COOKIE["eradiocc_lang"] || $_GET['lang']) {
    if ($_GET['lang']) {
        if($_GET['lang'] == "lv" or $_GET['lang'] == "us" or $_GET['lang'] == "ru"){
            $_LANG = $_GET['lang'];
        } else {
            $_LANG = "ru";
        }
        setcookie("eradiocc_lang", $_LANG, $expire, "/");
        $title = $_LANG;
    }
     else {
            $_LANG = "ru";
        }
} else {
    $_LANG = $_COOKIE["eradiocc_lang"];
}
if ($_LANG) {
    @include("lang/".$_LANG.".php");
}


Убрать последнюю IF запрос. Он ведь не нужен? А также может у кого-то есть еще более упрощенная версия кода? Заранее спасибо!
Код

if (!$_COOKIE["eradiocc_lang"] || $_GET['lang']) {
    if ($_GET['lang']) {
        if($_GET['lang'] == "lv" or $_GET['lang'] == "us" or $_GET['lang'] == "ru"){
            $_LANG = $_GET['lang'];
        } else {
            $_LANG = "ru";
        }
        setcookie("eradiocc_lang", $_LANG, $expire, "/");
        $title = $_LANG;
    }
     else {
            $_LANG = "ru";
        }
} else {
    $_LANG = $_COOKIE["eradiocc_lang"];
}

include("lang/".$_LANG.".php");

PM MAIL   Вверх
sQu1rr
Дата 12.11.2014, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 2
Всего: 13



А если lang не передается getом разьве это вообще будет работать? разьве не нужно так?
Код

if (isset($_GET['lang']))

???

На счет упрощенной версии, так это всегда зависит от того насколько читаема она должна быть
Код

$_LANG = isset($_GET['lang']) ? $_GET['lang'] : ( isset($_COOKIE['eradiocc_lang']) ? $_COOKIE['eradiocc_lang'] : 'ru' );
if (!in_array($_LANG, ['ru', 'lv', 'us'])) $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');

include("lang/".$_LANG.".php");


Почитал, если $_GET не будет содержать lang сгенерируется E_WARNING, который в продакшене будет успешно проигнорирован. Но всеравно советую изать isset()

Это сообщение отредактировал(а) sQu1rr - 12.11.2014, 01:48
PM MAIL Skype GTalk   Вверх
_zorn_
Дата 12.11.2014, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: 6
Всего: 12



Цитата(sQu1rr @  12.11.2014,  08:37 Найти цитируемый пост)
Почитал, если $_GET не будет содержать lang сгенерируется E_WARNING

Скорее E_NOTICE
А код не безопасный. В куку "eradiocc_lang" пользователь может записать что угодно.
Ну и код выше можно еще сократить.
Код

$_LANG = $_GET['lang'] ?: ( $_COOKIE['eradiocc_lang'] ?: 'ru' );


Это сообщение отредактировал(а) _zorn_ - 12.11.2014, 03:45
PM MAIL   Вверх
fleetboss
Дата 12.11.2014, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2009

Репутация: нет
Всего: нет



Спасибо за ответы.
Так будет самый идеальный вариант?
Код

$_LANG = $_GET['lang'] ?: ( $_COOKIE['eradiocc_lang'] ?: 'ru' );
if (!in_array($_LANG, ['ru', 'lv', 'us'])) $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');
include("lang/".$_LANG.".php");

PM MAIL   Вверх
baldina
Дата 12.11.2014, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Код

$_LANG = @$_COOKIE['eradiocc_lang'] ?: @$_GET['lang'];
in_array($_LANG, ['lv', 'us']) or $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');
include("lang/".$_LANG.".php");


Это сообщение отредактировал(а) baldina - 12.11.2014, 11:16
PM MAIL   Вверх
fleetboss
Дата 12.11.2014, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2009

Репутация: нет
Всего: нет



Страница не открывается (куки почищены) во всех вариантах первые 2 строчки не верные

Код

$_LANG = isset($_GET['lang']) ? $_GET['lang'] : ( isset($_COOKIE['eradiocc_lang']) ? $_COOKIE['eradiocc_lang'] : 'ru' );
if (!in_array($_LANG, ['ru', 'lv', 'us'])) $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');
include("lang/".$_LANG.".php");

Код

$_LANG = $_GET['lang'] ?: ( $_COOKIE['eradiocc_lang'] ?: 'ru' );
if (!in_array($_LANG, ['ru', 'lv', 'us'])) $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');
include("lang/".$_LANG.".php");

Код

$_LANG = @$_COOKIE['eradiocc_lang'] ?: @$_GET['lang'];
in_array($_LANG, ['lv', 'us']) or $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');
include("lang/".$_LANG.".php");


Добавлено через 11 минут и 40 секунд
Я вот сделал такой код, он работает. Правильный ли он?

Код

$_LANG = $_GET['lang'] ?: ($_COOKIE['eradiocc_lang'] ?: 'ru');
if ($_LANG != 'lv' or $_LANG != 'us') $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');
include("lang/".$_LANG.".php");


Это сообщение отредактировал(а) fleetboss - 12.11.2014, 11:40
PM MAIL   Вверх
sQu1rr
Дата 12.11.2014, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 2
Всего: 13



Цитата(fleetboss @  12.11.2014,  11:37 Найти цитируемый пост)
Страница не открывается (куки почищены) во всех вариантах первые 2 строчки не верные

Ну приведите хоть ошибку, возможно старый php? тогда
Код

['ru', 'lv', 'us']

заменить на
Код

array('ru', 'lv', 'us')


Добавлено @ 11:52
Цитата(fleetboss @  12.11.2014,  11:37 Найти цитируемый пост)
Правильный ли он?

Недостает проверки на 'ru' туплю!
А еще можно добавить проверку на существующий куки и равен ли он $_LANG прежде чем создавать/перезаписывать

Это сообщение отредактировал(а) sQu1rr - 12.11.2014, 11:55
PM MAIL Skype GTalk   Вверх
fleetboss
Дата 12.11.2014, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2009

Репутация: нет
Всего: нет



Спасибо! Да, видимо старый php smile
Вот такой код оставил. Всё работает. Еще раз спасибо!
Код

$_LANG = isset($_GET['lang']) ? $_GET['lang'] : ( isset($_COOKIE['eradiocc_lang']) ? $_COOKIE['eradiocc_lang'] : 'ru' );
if (!in_array($_LANG, array('lv', 'us'))) $_LANG = 'ru';
setcookie('eradiocc_lang', $_LANG, $expire, '/');
include("lang/".$_LANG.".php");

PM MAIL   Вверх
sQu1rr
Дата 12.11.2014, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 2
Всего: 13



Я бы все таки использовал вариант мр. baldina, так как он скорее более читаемый.
Код

$_LANG = @$_COOKIE['eradiocc_lang'] ?: @$_GET['lang'];

ЗЫ Не проверял, но можно ли тут заменить ?: на || ? У меня сейчас нету к сожалению возможности проверить
ЗЗЫ А еще в этом коде вроде как нужно поменять GET и COOKIE местами

А еще я бы пометил вопрос отвеченым ;)

Это сообщение отредактировал(а) sQu1rr - 12.11.2014, 12:01
PM MAIL Skype GTalk   Вверх
fleetboss
Дата 12.11.2014, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2009

Репутация: нет
Всего: нет



Код

$_LANG = @$_GET['lang'] ?: @$_COOKIE['eradiocc_lang'];

работает smile а с || нет, оставил вариант мр.  baldina smile
PM MAIL   Вверх
Aliance
Дата 12.11.2014, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Подавлять ошибки оператором @ - не комильфо  smile 
PM MAIL WWW ICQ Skype   Вверх
fleetboss
Дата 12.11.2014, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 30.7.2009

Репутация: нет
Всего: нет



т.е. лучше без @?
PM MAIL   Вверх
Aliance
Дата 12.11.2014, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Лучше - с проверкой isset.
Код

$lang = isset($_GET['lang']) ? $_GET['lang'] : 'defaultLanguage';


Если проект большой - напишите класс-хелпер. Вот пример такого метода, используемого у меня на работе:
Код

<?php
namespace Framework\Util;

class ArrayUtil {
    /**
     * Возвращает значение из массива по ключу или дефолтное значение, если в массиве такого ключа не определено.
     *
     * @param array $array
     * @param mixed $key
     * @param mixed $default
     * @return mixed
     */
    public static function get($array, $key, $default = null) {
        return isset($array[$key]) ? $array[$key] : $default;
    }
}

Использование:
Код

$lang = \Framework\Util\ArrayUtil::get($_GET, 'lang', 'defaultLanguage');


А использование оператора подавление ошибок влечет за собой другие ошибки. Хотя, конечно, если проект для себя и не большой - можно ###кодить как угодно, лишь бы быстрее и работало smile Выбор за вами.
PM MAIL WWW ICQ Skype   Вверх
baldina
Дата 12.11.2014, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(sQu1rr @  12.11.2014,  11:58 Найти цитируемый пост)
можно ли тут заменить ?: на || 

нет, оператор || имеет булев тип
можно так: 
Код

($a=$b) || ($a=$c);

Цитата(Aliance @  12.11.2014,  13:05 Найти цитируемый пост)
Подавлять ошибки оператором @ - не комильфо

если мы это делаем намеренно, учитывая конкретное поведение, почему нет? оператор законный. а семантика ?: поощряет его использование. к тому же  @ не действует на set_error_handler(), только на error_reporting()

Добавлено через 31 секунду
Цитата(Aliance @  12.11.2014,  13:31 Найти цитируемый пост)
напишите класс-хелпер

 smile 
PM MAIL   Вверх
sQu1rr
Дата 12.11.2014, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 2
Всего: 13



Цитата(baldina @  12.11.2014,  17:34 Найти цитируемый пост)
оператор || имеет булев тип

Запомню, спасибо. Осталась привычка с js и python
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0666 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.