[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как проигнорировать ошибку в запросе
maurise
Существует таблица `table` с текстами на разных языках
Выполняю примерно такой запрос

$res = mysqlQuery("SELECT `id`,
...тут ещё куча всяких полей...
`"
. $language ."` AS `text`
FROM `table`
"
);
где имя поля $language соответствует нужному языку, например "ru", "en" и т.д. В случае, если поля с таким именем нет в таблице, естественно вылазит сообщение об ошибке.
Можно ли сделать так, чтобы в случае отсутствия такого языка в таблице полю `text` присваивалось пустое значение или ещё что-нибудь, а остальная часть запроса выполнялась?



Спустя 4 минуты, 35 секунд (22.06.2011 - 14:14) linker написал(а):
Запросы по частям не выполняются. Для проверки есть ли такая таблица в базе поможет запрос
SHOW TABLES LIKE 'название таблицы'

Спустя 10 минут, 38 секунд (22.06.2011 - 14:25) maurise написал(а):
А каких-нибудь чудо-символов в MySQL не предусмотрено для этого? Например, как в PHP символ "@" Только не так $res = @mysqlQuery("... а внутрь SQL чтобы всё-таки выполнить запрос. Уж очень не хочется два запроса делать.

Спустя 9 минут, 25 секунд (22.06.2011 - 14:34) linker написал(а):
Нет. Сам подумай логически, ты выбираешь данные из таблицы, откуда по твоему MySQL должен выбрать записи, если таблицы не существуют?

Спустя 1 минута, 41 секунда (22.06.2011 - 14:36) waldicom написал(а):
Цитата (maurise @ 22.06.2011 - 12:25)
Уж очень не хочется два запроса делать.

а придется (можно использовать DESCRIBE или SHOW COLUMNS ). Или переделывать таблицы

Спустя 9 минут, 16 секунд (22.06.2011 - 14:45) linker написал(а):
Ой, извините ошибся, мне показалась таблица, а речь идёт о полях. Но сути дела не меняет, меняется запрос на проверку.

По хорошему, у тебя должен быть определён какой-то язык, используемый по-умолчанию. Далее у тебя два пути:

1. Проверять наличие поля в таблице и если не найдено то подставлять значение по-умолчанию
2. Не хочешь два запроса, тогда в конфиге нужно иметь список разрешённых языков, если указанный язык отсутствует в списке, то также подставлять дефолтное значение.

Спустя 1 минута, 3 секунды (22.06.2011 - 14:46) waldicom написал(а):
Цитата (linker @ 22.06.2011 - 12:45)
1. Проверять наличие таблицы в базе и если не найдено то подставлять значение по-умолчанию

Думаю ты немного не так прочитал (быстро читал? smile.gif ), там поля, а не таблицы.

Спустя 2 минуты, 31 секунда (22.06.2011 - 14:49) linker написал(а):
Да-да, я поправился уже :)
SHOW COLUMNS FROM  `table` LIKE 'ru'

Спустя 4 минуты, 54 секунды (22.06.2011 - 14:54) killer8080 написал(а):
maurise
а не проще сделать массив с именами существующих полей, и проверять переменную $language перед запросом, вместо того чтоб пихать в БД кривые запросы?
$languages = array('ru', 'en', 'fr');
if(!in_array($language, $languages))
$language = 'ru';

Спустя 55 минут, 34 секунды (22.06.2011 - 15:49) maurise написал(а):
Жаль, что нет такой фишки. В результате всё-таки пришлось делать 2 запроса
Первым - получаю список полей.
$res = mysqlQuery("DESCRIBE `table`");
for ($columns = array(); $row = mysql_fetch_assoc($res); $columns[] = $row['Field']);

Потом делаю проверку на существование поля
$column = (in_array($language, $columns)) ? $language : FALSE;

Далее идут танцы с бубном, чтобы подготовить данные ко второму запросу:
Если есть такое поле, то подставляем его название, если нет, пустое значение
$column = ($column !== FALSE) ?"`". $column ."`" : '""';

Ну и второй запрос будет таким
$res = mysqlQuery("SELECT `id`, `name`,`url`,
"
. $column ." AS `text`
FROM `table`
"
);

На выходе получаю либо текст из таблицы, либо пустую строку, если такого поля в таблице нет.

Спустя 4 минуты, 10 секунд (22.06.2011 - 15:54) killer8080 написал(а):
maurise
а мой вариант не подходит?

Спустя 8 минут, 18 секунд (22.06.2011 - 16:02) maurise написал(а):
Не совсем. Запрос мне всё-равно приходится делать.
Ситуация такая. Сайт с поддержкой мультиязычности. Например я в русскоязычном интерфейсе пытаюсь посмотреть, картинку с описанием. Допустим, что описание для картинки дано только на французском. Т.е. картинку я должен увидеть в любом случае (взять из базы данные, которые универсальные для любого языка, например, id пользователя и какую-нибудь ссылку), а вот описание можно в этом случае заменить на пустое.

Спустя 7 минут, 35 секунд (22.06.2011 - 16:10) killer8080 написал(а):
И какие проблемы?
$languages = array('ru', 'en', 'fr');

$column = in_array($language, $languages) ? '`'.$language.'` AS `text`' : '';
$res = mysqlQuery("SELECT `id`, `name`,`url`,
"
. $column ." FROM `table`
"
);

Поля в таблице же не добавляются каждые 5 минут, зачем ненужные запросы?

Спустя 1 минута, 2 секунды (22.06.2011 - 16:11) linker написал(а):
maurise
Не может быть пустого значения в названии поля. Если оно пустое, то запрос будет
SELECT `id`, `name`,`url`,  AS `text` FROM `table`
что будет также ошибкой.

Спустя 5 минут, 52 секунды (22.06.2011 - 16:16) killer8080 написал(а):
а можно ещё проще
$res = mysqlQuery("SELECT * FROM `table`");
while($row = mysql_fetch_assoc($res)){
$text = isset($row[$language]) ? $row[$language] : '';

...


}

Спустя 2 часа, 44 минуты, 10 секунд (22.06.2011 - 19:01) maurise написал(а):
Цитата (linker @ 22.06.2011 - 18:11)
Не может быть пустого значения в названии поля. Если оно пустое, то запрос будет
SELECT `id`, `name`,`url`,  AS `text` FROM `table`
что будет также ошибкой.

У меня там не пустое поле, а пустое значение. Я использую в этом случае не '', а '""' т.е.
SELECT `id`, `name`,`url`, "" AS `text` FROM `table`


killer8080
Твой с пособ в моём случае не подходит, потому что я заранее не знаю, какой язык есть в какой таблице. Т.е. в одной таблице он может быть, а в другой нет.

Спустя 5 минут, 19 секунд (22.06.2011 - 19:06) killer8080 написал(а):
blink.gif
посмотри последний мой пост, чем тебя он не устраивает?

Спустя 5 минут, 20 секунд (22.06.2011 - 19:11) maurise написал(а):
Ты предлагаешь взять все записи из таблицы
$res = mysqlQuery("SELECT * FROM `table`");
Мне кажется, что в случае если языков будет штук 20, а записей пару сотен по несколько предложений в каждой, то это как-то избыточно. Лучше брать только нужные поля. Или я не прав?

Спустя 12 минут, 2 секунды (22.06.2011 - 19:23) killer8080 написал(а):
но ведь не будешь же на одной странице выводить пару сотен записей wink.gif
а в переменной $row будет находиться только одна, текущая запись. Если так боишся за перерасход памяти, можешь после цикла убить переменную, хотя по моему это лишнее. Всё лучше чем нагружать сервер лишними запросами.

Спустя 7 минут, 35 секунд (22.06.2011 - 19:31) maurise написал(а):
Наверное, ты прав. Мне вот изначально хотелось одним запросом ограничится. Завтра на свежую голову ещё раз осмотрю поле битвы. Потом может ещё какой плюс откроется в том, чтобы все поля сразу брать. Статистику какую вывести или ещё что-нибудь замутить biggrin.gif
Спасибо за настойчивость в доведении своей мысли smile.gif

Спустя 21 час, 48 минут, 28 секунд (23.06.2011 - 17:19) gidrosoldat написал(а):
Или модернизировать вариант killer8080'a


$languages = array('ru', 'en', 'fr');

$column = in_array($language, $languages) ? ', `'.$language.'` AS `text`' : '';
$res = mysqlQuery("SELECT `id`, `name`,`url`
"
. $column ." FROM `table`
"
);

Теперь запятая мешать не будет.
maurise, а что за таблица такая? Там столбцы динамически меняются ? ))

Спустя 1 час, 38 секунд (23.06.2011 - 18:20) maurise написал(а):
Задачу решил - беру все поля, а потом обрабатываю нужные.
Нет, столбцы не меняются, а добавляются по мере того, как появляется перевод на каком-либо языке. Пытаюсь делать максимально мультиязычный сайт rolleyes.gif

Спустя 23 минуты, 56 секунд (23.06.2011 - 18:44) waldicom написал(а):
Цитата (maurise @ 23.06.2011 - 16:20)
Пытаюсь делать максимально мультиязычный сайт rolleyes.gif

В таком случае лучше бы все-таки пересмотреть структуру таблиц

Спустя 13 минут, 51 секунда (23.06.2011 - 18:58) maurise написал(а):
Было дело уже. Для каждого языка делал отдельную таблицу.
Тогда ещё больше гемора было.
Приходилось проверять существование таблицы, а потом ещё объединённым запросом тягать данные из двух таблиц.
Тормоза были заметные. Сайт грузился полминуты.
Сделал всё в одну таблицу, сразу полегчало.

Спустя 14 минут, 41 секунда (23.06.2011 - 19:12) waldicom написал(а):
Зачем же для каждого. Просто для контента ввести колонку язык. Т.е. что-то типа такого (схематично):

table `content`:

id int auto_increment
.....
content varchar2
lang int (или varchar)
......

Конечно это не все поля, но думаю, что идея понятна.
В данном случае уходит головная боль из-за (не)существующих полей, да и вообще, плюсов в данном варианте больше, чем минусов. Да и правильнее это, имхо.

Спустя 22 минуты, 43 секунды (23.06.2011 - 19:35) maurise написал(а):
Т.е. кидать контент на разных языках в одну кучу и помечать на каком языке написано?
Мне кажется, это неудобно. Я изначально для разговорника это всё делал.
Допустим есть топик состоящий из нескольких фраз. Каждая фраза на нескольких языках. Соответственно у фразы есть id и по нему можно вытащить эту фразу на любом языке.
Если всё кидать в кучу, то бардак получится, имхо.

Спустя 25 минут, 40 секунд (23.06.2011 - 20:01) waldicom написал(а):
Цитата (maurise @ 23.06.2011 - 17:35)
Соответственно у фразы есть id и по нему можно вытащить эту фразу на любом языке.

Так же, как и в моем варианте. Отличие в том, что фраза будет адресоваться не только id, а по id + langId.
Тогда теряется весь геморой с распознаванием таблиц/колонок. Да и запрос будет один, вместо двух.
А если добавится новый язык, надо делать alter table. А если в базе стотыщмильёнов записей, то лучше обойтись без этого.

Спустя 19 минут, 13 секунд (23.06.2011 - 20:20) maurise написал(а):
Что-то я видимо не совсем правильно представил вашу структуру таблицы.
У меня сейчас примерно так:

CREATE TABLE IF NOT EXISTS `mut_phrases` (
`id_phrase` int(11) NOT NULL AUTO_INCREMENT,
`id_topic` int(11) NOT NULL,
`public` int(1) NOT NULL,
`ru` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`en` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`mhr` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`kom` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`udm` varchar(250) COLLATE utf8_unicode_ci NOT NULL,

...


PRIMARY KEY (`id_phrase`),
KEY `id_topic` (`id_topic`),
KEY `public` (`public`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Список фраз' AUTO_INCREMENT=1458 ;


Быстрый ответ:

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