За последние 24 часа нас посетили 8127 программистов и 472 робота. Сейчас ищут 169 программистов ...

Язык и сессия

Тема в разделе "PHP для новичков", создана пользователем Qumo, 1 фев 2016.

  1. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Всем привет=)
    Проблема с переключателем языка.
    Обработка языков:
    Код (PHP):
    1. define('LANG', 'admin/lang/');
    2. if (isset($_GET['lang']) && $_GET['lang']=='rus') {
    3.     $_SESSION['lang'] = 'rus' and require_once LANG.'rus.php';
    4. }
    5.  
    6. elseif (isset($_GET['lang']) && $_GET['lang']== 'eng'){ 
    7.     $_SESSION['lang'] = 'eng' and require_once LANG.'eng.php'; 
    8. } 
    9. else{
    10.     require_once LANG.'rus.php';
    11. }
    12. echo $_SESSION['lang'];
    Переключатель:
    Код (PHP):
    1. <class="language"><span class="language__rus"><a href ="?lang=rus">rus</a></span><span class="language__line">|</span><span class="language__eng"><a href ="?lang=eng">eng</a></span>
    echo $_SESSION['lang']; для проверки стоит. Это файл header.php. На каждой странице у меня session start(); в header.php не делал, ибо он инклудится на всех страницах и выдаст соответствующую ошибку. Искал уже способы решения на форумах, но решения не помогли мне. Почему языки не хранятся при переходе? В чем ошибаюсь? Спасибо.
     
  2. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Сайт по умолчанию на русском. При переходе на eng язык, $_SESSION['lang'] запоминает это и выдает мне это, при переходе по ссылкам тоже выдает eng, но язык на русский меняется все равно=(
     
  3. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    370
    Симпатии:
    68
    Потому, что срабатывает условие

    Код (PHP):
    1. else{
    2.     require_once LANG.'rus.php'; 
    Забавная конструкция and require_once ;))

    Добавлено спустя 6 минут 33 секунды:
    не благодари

    Код (PHP):
    1. define('LANG', 'admin/lang/');
    2. $lang = isset($_GET['lang']) && in_array($_GET['lang'], ['rus', 'eng'])$_SESSION['lang'] = $_GET['lang'] : ( isset($_SESSION['lang']) ? $_SESSION['lang'] : 'rus');
    3. include_once( LANG . $lang . '.php' );
    4. print $lang ;
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.309
    Симпатии:
    1.026
    Адрес:
    там-сям
    У ТС косяк в том, что значение из сессии не используется.
    lastdays вроде правильно написал, только зря слепил такую длинную строку. ненаглядно.

    Мой пример (без сессии): viewtopic.php?t=51855#p414898
     
  5. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Спасибо за ответ=) Но жалуется на '[' в 3 строке=)
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    обнови пхп
     
  7. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    у меня 5.3.13. Не тянет уже этот код?
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    уже даже 5.5 закончилась. текущая - 7.0
     
  9. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Ну про 7 я уже знаю=) Просто мне потом его на timweb садить. В ТП сказали, что до 5.6 держит только=(
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.226
    Симпатии:
    1.706
    Адрес:
    Молдова, г.Кишинёв
    Qumo на таймвеб есть 5.6 массивы через [] работают
     
  11. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Вот же спасибо за ответ=)
     
  12. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Ребята, новая проблема. Продолжу эту, ибо связана с языками. Обновил php на 5.5.9. Теперь жалуется на Warning: Illegal string offset 'header' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 22.
    Файл rus.php. Не выкладываю подключение к БД и прочие проверки, ибо они тут не нужны.
    Код (PHP):
    1. $result = mysqli_query($db, "SELECT * FROM hefo") or die("Ошибка" . mysqli_error($result));
    2. if ($result) {
    3.     while($row = mysqli_fetch_assoc($result))
    4.     $mass[] = $row;
    5. }
    6. $lang['header'] = $mass['header'];
    7. $lang['subtitle'] = $mass['subtitle'];
    8. $lang['button'] = $mass['button'];
    9. //Главное меню
    10. $lang['menu'] = array('Value1', 'Value2', 'Value3', 
    11. 'Value4', 'Value5', 'Value6');
    12. $lang['search'] = 'Поиск';
    13.  
    14. //Меню информации
    15. $lang['infomenu'] = array('Value1', 'Value2', 'Value3', 
    16. 'Value4', 'Value5', 'Value6');
    17. $lang['butup'] = 'Наверх';
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    а что из этого 22 строка-то тогда?
     
  14. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    там, где используются соответствующие значения=)
    полная ошибка выглядит так, но об одном и том же:

    Warning: Illegal string offset 'header' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 22
    Warning: Illegal string offset 'subtitle' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 23
    Warning: Illegal string offset 'button' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 24
    Warning: Illegal string offset 'menu' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 26
    Warning: Illegal string offset 'search' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 28
    Warning: Illegal string offset 'infomenu' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 31
    Warning: Illegal string offset 'butup' in Z:\home\тут_сайт\www\admin\lang\rus.php on line 34

    Также и на eng.php жалуется с теми же ошибками.
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    а var_dump($lang) перед 22 строкой что скажет?
     
  16. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    он ответил: string(3) "us"

    Добавлено спустя 2 минуты 23 секунды:
    Решил вопрос. Может кому поможет. $lang у меня определялся не как массив, а как строка(имхо)=) Решение: объявить $lang, как массив. Вот так:
    Код (PHP):
    1. $lang = array(); 
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    это правильное решение. тут кто-то недавно был не рад что я массив объявляю явно - вот вам, новички, реальным пример как не сесть в лужу с неожиданным типом данных в переменной.

    Добавлено спустя 1 минуту 38 секунд:
    и кстати реальный пример ошибки в именовании переменных. вроде и язык выбранный лежит а вроде и массив локализации. упс.
     
  18. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Новая проблема=))) Хоть и обычный Notice, но лекать надо по 2 причинам:
    1) Самая главная- ошибок вообще не должно быть.
    2) У меня не отображаются заголовок($lang['header']), подзаголовок($lang['subtitle']) и кнопка($lang['button']) на русском.
    Пишет:
    Notice: Undefined index: header in Z:\home\тут_сайт\www\admin\lang\rus.php on line 11
    Notice: Undefined index: subtitle in Z:\home\тут_сайт\www\admin\lang\rus.php on line 12
    Notice: Undefined index: button in Z:\home\тут_сайт\www\admin\lang\rus.php on line 13

    Добавил var_dump($lang), результат:
    array(3) { ["header"]=> NULL ["subtitle"]=> NULL ["button"]=> NULL }
    Где ошибся?
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    в добавлении данных в массив лежащий в переменной $mass
     
  20. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    А как правильно добавить переменную в массив?
     
  21. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.613
    Симпатии:
    206
    Код (PHP):
    1. if ($result) {
    2.     while($row = mysqli_fetch_assoc($result))
    3.     $mass[] = $row;
    4. }
    в итоге, каждую итерацию цикла массив перезаписывается же, не?
    и посмотри, что всё-таки лежит в $mass
     
  22. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    нет, туда просто складываются массивы. будет массив массивов. а ему надо чтоб массив ключей и значений был
     
  23. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Имхо, нет, не перезаписываются, они должны попадать в массив.

    Добавлено спустя 55 секунд:
    Так в чем все-таки проблема? В eng.php работает все, а в rus- нет.
     
  24. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.901
    Симпатии:
    967
    нет никакой проблемы. у тебя просто нет скила программиста. ты не понимаешь что делаешь и что ожидаешь получить. а любой неожиданный по твоим меркам результат приводит тебя не к размышлениям о том почему так а на форум за решением. ты знаком с понятием отладка? вот ты себе представил как должен выглядеть массив а сраный компьютер посчитал иначе. и вот ты садишься, проверяешь значение переменной, понимаешь что оно не правильное, понимаешь какое оно должно быть правильное, знаешь где оно у тебя модифицируется, смотришь какие данные приходят в эту модификацию, думаешь как изменить алгоритм, меняешь алгоритм, опять запускаешь, сравниваешь фактический результат с ожидаемым. вот это отладка. а не жизнь на форуме.
     
  25. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Спасибо за наставления=) Я понял проблему. Я делал массив с ключами, а надо просто массив=)
    Решение: $mass[] - заменить на $mass.