Forum Webscript.Ru
Программирование => Perl => Тема начата: DDHR от 30 Апреля 2004, 12:20:20
-
$categories = $dbh->prepare("SELECT * FROM categories WHERE type=\'news\'")|| die "Can\'t prepare statement: $DBI::errstr";
$categories->execute;
$sth = $dbh->prepare("SELECT * FROM articles WHERE type=\'news\' ORDER BY id DESC LIMIT 6")|| die "Can\'t prepare statement: $DBI::errstr";
$sth->execute;
while(($id, $type, $cat, $title, $description, $details, $author, $date, $time) = $sth->fetchrow_array())
{
while(@row = $categories->fetchrow_array)
{
if ($row[1] eq $cat)
{
print $row[1],\'
\';
}
}
print $title, $description, $author, $date, $time,\'
\';
}
$dbh->disconnect; # отключиться от сервера SQL
В результате получаем страничку с новостями:
1 новость 1
2
3
4
5
6
а рядом с каждой новосють должно в случае, если $cat = $row[1], напечатать $row[1], однако внутренний цикл while срабатывает лишь единожды, тоесть печатает $row[1] (в случае равенства $cat) к первой новости, а к остальным нет, что и как переделать, чтобы внутренний цикл работал ко всем новостям?
-
use strict; для начала.
-
DDHR
Ну и делай запрос внутри цикла, при этом делай соответсвующую выборку:
$sth = $dbh->prepare...
$sth->execute;
while(($id, $type... {
$categories = $dbh->prepare... # здесь добавить условие в запросе по твоему условию - if ($row[1] eq $cat)
$categories->execute;
while(@row = $categories->fetchrow_array) {
print ...
}
print...
}
$sth -> finish; # Это тоже не надо забывать
...
...
Только при этом если делаешь выборку всех полей (SELECT *...) то результат не рекомендуется заносить в обычный массив, так как порядок полей в базе не обязателен и может изменяться, используй хеш массив ($categories->fetchrow_hashref), и зачем делать два запроса еслим в твоем случае можно обойтись одним???
Ну и как сказал Chs сначала... :)
-
use SQLayer;
и подобных вопросов вопросов вообще не возникнет...
-
у меня там предполагается ещё обработка массива с категориями...
-
Всё OK! СПАСИБО! Помогло!
-
commander
Если в программе ошибка логики то конечно нужно взять обертку к DBI вместо самого DBI, ага.
Постарайся так больше не отвечать потому как это больше запутывает а не помогает.
-
NeoNox
Ок... постараюсь... :)
просто на вопрос уже ответили... и я посчитал нужным посоветовать удобную обёрку с которой ошибок делаеться на много меньше... :)
-
Извините, попутно появился ещё вопрос:
Как мне цикл:
while(@row = $categories->fetchrow_array)
{
if ($row[1] eq $cat)
{
$n=1;
}
}
запихнуть ещё в один, только так чтобы он выполнялся пока $n не станет равным 1 (в цикле while(@row = $categories->fetchrow_array) )?
-
Выход из цикла:
last if $n==1;