@Kirill-Gorelov
С ума с IT

Мультиязычный сайт php + mysql?

Всем привет. Нужно реализовать мультиязычный сайт на php + mysql. Сделано! НО!
Помогите упростить код, пожалуйста.
Вот моя таблица: 104c7c6cd6.jpg
Вот мой запрос:
$stmt = $pdo->query("SELECT `key`, `english` FROM language WHERE 1")->fetchAll(PDO::FETCH_UNIQUE);

И вот как я вывожу слова:
echo $stmt['lan_site'][$language];
  echo $stmt['solved'][$language];

В $language я храню имя столбца russian или english.

В чем проблема:
Как мне избавиться от
echo $stmt['solved'][$language];
И что бы было
echo $stmt['solved'];
  • Вопрос задан
  • 1319 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега PHP
Всего-то надо использовать правильную константу ПДО
$lang = $pdo->query("SELECT `key`, `english` FROM language")->fetchAll(PDO::FETCH_KEY_PAIR);
echo $lang['solved'];
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@oxidmod
не лучшее решение хранить значения в колонках... когда их станет много нужно будет добавить еще язык могут быть пробелмы с альтером такой таблицы.

лучше иметь такую струтуру
languages
id | title

keys
key | default_value

transaltions
lang_id | key | value

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

в табле переводов праймари составной на 2 колонки
не забіть навесить внешних ключей.

запросы будут типа таких

select k.*, t.value from keys k left join transaltions t on k.key = t.key and t.lang_id=x;

ну и использовать в пыхе, обернув допустим в функу хелпер чтото типа такого

function _t($key, $lang) {
$result = //тут запрос в бд
return $result['value'] ?? $result['default_value'] ?? $key;
}

ну или намапить на какойто объект.
по вкусу приправить идентификаторами страницы, дефолтными языками и прочее. Можно даже завернуть в сервис транслятор)
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$language = 'english';
$stmt = $pdo->query("SELECT `key`, `{$language}` AS `translation` FROM `language`");
$translation = [];
while ($item = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $translation[$item['key']] = $item['translation'];
}

Дальше просто используете $translation['solved']
Ответ написан
@Mysterion
$stmt = $pdo->query("SELECT `key` FROM language WHERE `language`=$language")->fetchAll(PDO::FETCH_UNIQUE);

Где $language - это, например, содержимое $_SESSION['language'].
Ну и в сессию сохранять выбранный язык.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы