Регистрация
Вход через соцсети
Восстановление пароля

Запросы двойной вложенности

Новый топик
Страницы: 1  |  2
11.12.2008, 14:24
Ответить | Цитировать
Дубин
Михаил Дубин

Зарегистрирован:
2008-08-18
Сообщений: 44

Пишу структуру вида:
“.ListQuery(“запрос”,”код”.listquery(“запрос where поле =$data[поле]”,”код.opt($data[поле],”код”).””).”).”

Проблема заключается в следующем, проверка opt не видит условие $data[поле], в чем может быть ошибка.
11.12.2008, 16:56
Ответить | Цитировать
Thiamin
Веб-студия «Арт-Лайн»
Thiamin

Зарегистрирован:
2008-05-20
Сообщений: 145

Попробуйте вместо opt использовать (condition ? true : false).

chance favours the prepared mind
12.12.2008, 16:35
Ответить | Цитировать
Гость
Гость

Aykroyd писал(а):
Попробуйте вместо opt использовать (condition ? true : false).

Не поможет, т.к. по сути, вызывается 2 раза (автономно) функция listQuery и, естественно, результат отработки одной не виден в другой (там из глобальных вообще только переменная $MYSQL_SHOW_ERRORS), поэтому во втором параметре первого вызова можно положить требуемое значение в $GLOBALS, и уже обращаться к массиву.

А вообще - это извращение, listQuery совсем не для этого (не для сложной логики). Используйте либо чистый mysql, либо пишите один запрос (вложенные запросы, JOIN и т.п. - инструментов много), иначе есть шанс познакомиться с большим количеством веселых глюков и тормозов.
13.12.2008, 00:44
Ответить | Цитировать
Thiamin
Веб-студия «Арт-Лайн»
Thiamin

Зарегистрирован:
2008-05-20
Сообщений: 145

Не знаю, как listQuery ведет себя внутри другого listQuery (попробовать, к сожалению, времени нет), но у меня $db->get_var, который лежит внутри listQuery и при этом использует то, что «выдергивает» listQuery, работает как часы.

chance favours the prepared mind
13.12.2008, 02:05
Ответить | Цитировать
Гость
Гость

ну так тут речь не о $db->get_var улыбка
13.12.2008, 03:25
Ответить | Цитировать
Гость
Гость

Почему нельзя выполнить все последовательно?? Зачем вкладывать?
Сначала выполнить внутренний запрос, присвоить его результат переменной, напр. $first:
".opt($first=listQuery("SELECT ... WHERE Message_ID=$f_RowID","$data[id]"),"")."

в итоге переменную $first можно использовать где хош, она содержит результат запроса ($data[id]). Например во втором запросе:

".listQuery("SELECT blabla FROM MessageXX WHERE parametr = '$first'","$data[blabla]")."
13.12.2008, 06:56
Ответить | Цитировать
Thiamin
Веб-студия «Арт-Лайн»
Thiamin

Зарегистрирован:
2008-05-20
Сообщений: 145

d писал(а):
Не поможет, т.к. по сути, вызывается 2 раза (автономно) функция listQuery и, естественно, результат отработки одной не виден в другой

Гость писал(а):
ну так тут речь не о $db->get_var улыбка

Да какая нафик разница? Вопреки всему вышесказанному, работает listQuery внутри другого listQuery прекрасно (сейчас только сам проверил из принципа). При этом во внутреннем listQuery прекрасно работает opt и прекрасно видны все $data[] – как свои собственные, так и те, которые были «выдернуты» внешним listQuery.

Другое дело, что автор топика забыл в одном месте поставить кавычку:
Код:
код".opt

Ну и про то, что все $data[], которые «выдергиваются» внутренним listQuery, необходимо слэшить троекратно, тоже не надо забывать.

Рабочий пример для неверующих:

Код:
".listQuery(
"SELECT DATE_FORMAT(Date,'%Y') AS year, DATE_FORMAT(Date,'%m') AS month
FROM MessageXX WHERE Checked = 1
GROUP BY DATE_FORMAT(Date,'%Y'), DATE_FORMAT(Date,'%m') ORDER BY Date",
"".opt($tm = array(1=>'Январь',2=>'Февраль',3=>'Март',4=>'Апрель',
5=>'Май',6=>'Июнь',7=>'Июль',8=>'Август',
9=>'Сентябрь',10=>'Октябрь',11=>'Ноябрь',12=>'Декабрь'), "")."
<li><a href=\"".$subLink."month.html?&mID=$data[month]&yID=$data[year]\">
".$tm[intval($data[month])]." $data[year] (
".listQuery("SELECT count(1) AS count FROM MessageXX WHERE Checked = 1
AND DATE_FORMAT(Date,'%Y')=$data[year]
AND DATE_FORMAT(Date,'%m')=$data[month]",
"".opt($data[year], "bla-bla")." \$data[count]")."
)</a></li>"
)."

Целесообразность использования вложенного listQuery в приведенном примере вызывает сомнения (гораздо логичнее воспользоваться $db->get_var). Иначе говоря, пример просто призван показать, что механизм работает, не претендуя при этом на изящность решения.

chance favours the prepared mind
13.12.2008, 14:51
Ответить | Цитировать
Гость
Гость

Работать то работать может, но имхо, последовательно логичнее. Так сказать присвоил переменным нужные данные и манипулируй или как хочешь и где хочешь.
Если я заблуждаюсь, поправьте и скажите как лучше.
13.12.2008, 15:47
Ответить | Цитировать
Thiamin
Веб-студия «Арт-Лайн»
Thiamin

Зарегистрирован:
2008-05-20
Сообщений: 145

Gость писал(а):
Работать то работать может, но имхо, последовательно логичнее.


Давайте так:

Если внимательно посмотреть на приведенный мной пример, несложно догадаться о его предназначении. Все, что делает этот небольшой фрагмент кода – это формирование архива статей с группировкой по месяцам/годам + подсчет количества статей в каждом месяце. Предлагаю Вам попробовать реализовать этот функционал «последовательно». В смысле «присвоил переменным нужные данные и манипулируй или как хочешь и где хочешь». В результате мы сможем по достоинству оценить, у кого из нас решение окажется более эстетичным и меньшим по объему кода. А может быть даже придем к еще одному очень важному выводу.)

Код:
<ul>
".listQuery("SELECT DATE_FORMAT(Date,'%Y') AS year, DATE_FORMAT(Date,'%m') AS month
FROM MessageXX WHERE Checked = 1
GROUP BY DATE_FORMAT(Date,'%Y'), DATE_FORMAT(Date,'%m') ORDER BY Date",
"".opt($tm = array(1=>'Январь',2=>'Февраль',3=>'Март',4=>'Апрель',
5=>'Май',6=>'Июнь',7=>'Июль',8=>'Август',
9=>'Сентябрь',10=>'Октябрь',11=>'Ноябрь',12=>'Декабрь'), "")."
<li>
<a href=\"".$subLink."month.html?&amp;mID=$data[month]&amp;yID=$data[year]\">
".$tm[intval($data[month])]." $data[year]
(".$db->get_var("SELECT count(1) FROM MessageXX WHERE Checked = 1
AND DATE_FORMAT(Date,'%Y')=$data[year]
AND DATE_FORMAT(Date,'%m')=$data[month]").")
</a>
</li>")."
</ul>


chance favours the prepared mind
14.12.2008, 03:42
Ответить | Цитировать
Гость
Гость

Код:
Целесообразность использования вложенного listQuery в приведенном примере вызывает сомнения (гораздо логичнее воспользоваться $db->get_var)

Я имел ввиду, что listQuery не для вложенности. Могли бы просто посоветовать человеку использовать $db->get_var. В вышеприведенном Вами коде мне я спорил именно про listQuery в listQuery.

P.S. array с месяцами может быть лучше в "Системные настройки" компонента запихнуть? так можно лишь 1 раз их указать
14.12.2008, 05:48
Ответить | Цитировать
Thiamin
Веб-студия «Арт-Лайн»
Thiamin

Зарегистрирован:
2008-05-20
Сообщений: 145

Gость писал(а):
Я имел ввиду, что listQuery не для вложенности.

Елки-палки, ну так покажите тогда, как решить приведенную мной задачу без вложенности («последовательно»). Уже во второй раз Вас об этом прошу. Я привел два разных примера: с $db->get_var внутри listQuery и с listQuery внутри listQuery. Оба примера наглядно демонстрируют вложенность и прекрасно работают. Как в данном контексте прикажете понимать Ваше заявление?

Gость писал(а):
Могли бы просто посоветовать человеку использовать $db->get_var.

Нет, к сожалению, не мог бы. В первую очередь по той простой причине, что я не имею никакого представления, какую задачу решает автор топика. Поэтому то, что в моем примере $db->get_var приходится «к месту», совсем не означает, что это подойдет и ему.

Gость писал(а):
В вышеприведенном Вами коде мне я спорил именно про listQuery в listQuery.

Да как же вы до сих пор не поймете, что вложенный запрос – он и есть вложенный запрос. И совершенно нет никакой принципиальной разницы чем его делать – с помощью listQuery, через класс $db или посредством mysql_query. Инструменты разные – суть одна и та же. Чем по-вашему отличается listQuery от $db->get_results? И почему listQuery нельзя вкладывать в другой listQuery, а обращение к классу $db – можно? хммм

Gость писал(а):
P.S. array с месяцами может быть лучше в "Системные настройки" компонента запихнуть? так можно лишь 1 раз их указать

Нет, не можно. Не видны они там будут для listQuery.

chance favours the prepared mind
198 196 2008-12-14 14:37:02 7603
Страницы: 1  |  2
Описание проекта