|
|
11.12.2008, 14:24
|
|
Дубин
Михаил Дубин
Зарегистрирован: 2008-08-18
Сообщений: 44
|
Пишу структуру вида:
“.ListQuery(“запрос”,”код”.listquery(“запрос where поле =$data[поле]”,”код.opt($data[поле],”код”).””).”).”
Проблема заключается в следующем, проверка opt не видит условие $data[поле], в чем может быть ошибка.
|
|
|
11.12.2008, 16:56
|
|
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
Веб-студия «Арт-Лайн»

Зарегистрирован: 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
Веб-студия «Арт-Лайн»

Зарегистрирован: 2008-05-20
Сообщений: 145
|
d писал(а):Не поможет, т.к. по сути, вызывается 2 раза (автономно) функция listQuery и, естественно, результат отработки одной не виден в другой
Гость писал(а):ну так тут речь не о $db->get_var 
Да какая нафик разница? Вопреки всему вышесказанному, работает listQuery внутри другого listQuery прекрасно (сейчас только сам проверил из принципа). При этом во внутреннем listQuery прекрасно работает opt и прекрасно видны все $data[] – как свои собственные, так и те, которые были «выдернуты» внешним listQuery.
Другое дело, что автор топика забыл в одном месте поставить кавычку:
Ну и про то, что все $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
Веб-студия «Арт-Лайн»

Зарегистрирован: 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?&mID=$data[month]&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
Веб-студия «Арт-Лайн»

Зарегистрирован: 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
|