Potřebuji vypisovat na titulní stránce intranetu seznam vícero novinek z vícero sekcí a potřebuji (nebo spíše chtěl bych) to udělat do dvou sloupců v tabulkách. Napsal jsem následující a funguje..:
$query = mysql_query("SELECT * FROM def_news ORDER BY id LIMIT 0,4");
$i=1;
if(!$l) echo "<table width=100% class=\"def_news_title\"><tr><td>Novinky všeobecně</td></tr></table>";
while($row = mysql_fetch_array($query))
{
$datum = preg_replace("/(\d{4})-(\d{2})-(\d{2})/","\\3.\\2.\\1 v \\4 ",$row[date]);
if(strlen($row[text]) > "156")
{
$url = ".....<a href=\"modules/$modname/index.php?right=$right&view_id=$row[id]&$l=1\">pokračování >></a>";
$text = substr($row[text],0,140)." $url";
$title = $row[title]."*";
}
else
{
$text = $row[text];
$title = $row[title];
}
if($i==1) $tbl1 = "<table width=\"100%\"><tr><td align=left class=\"def_news\">$title</tr><tr><td><small>vloženo: $datum</small></td></tr><tr><td align=left valign=top class=\"def_news_text\">$text</td></tr></table>";
if($i==2) $tbl2 = "<table width=\"100%\"><tr><td align=left class=\"def_news\">$title</tr><tr><td><small>vloženo: $datum</small></td></tr><tr><td align=left valign=top class=\"def_news_text\">$text</td></tr></table>";
if($i==3) $tbl3 = "<table width=\"100%\"><tr><td align=left class=\"def_news\">$title</tr><tr><td><small>vloženo: $datum</small></td></tr><tr><td align=left valign=top class=\"def_news_text\">$text</td></tr></table>";
if($i==4) $tbl4 = "<table width=\"100%\"><tr><td align=left class=\"def_news\">$title</tr><tr><td><small>vloženo: $datum</small></td></tr><tr><td align=left valign=top class=\"def_news_text\">$text</td></tr></table>";
$i++;
}
echo "<table width=\"100%\">"
."<tr><td width=\"50%\" valign=top>$tbl1</td><td width=\"50%\" valign=top>$tbl2</td></tr>"
."<tr><td width=\"50%\" valign=top>$tbl3</td><td width=\"50%\" valign=top>$tbl4</td></tr>"
."</table>";
Takhle je to ale dáno natvrdo pro čtyři záznamy. Kdybych si chtěl v administrační sekci stránek volit počet zobrazovaných novinek, mohl bych si to všechno změnit ručně nebo využít funkcí php.
mohl bych v tom while využít něco jako :
for($i=1;$i<=$max_povolene;$i++)
{
$tbl.$i = "tra la la";
}
To mi samozřejmě fungovat nebude, je to jen pro ilustraci jak bych si to představoval. Nevíte jak automaticky generovat název proměnné ?
Pokud jde o tvorbu názvu těch proměnných, tak v knížce PHP Tvorba interaktivnichích internetových aplikací od Koska se píše tohle:
$a = "b";
$b = "c";
$c = "Ahoj!"
echo $$$a; // vzpíše "Ahoj!"
$$a ... postup zpracování je asi takovýto $($a). Za $a se dosadí její hodnota (b) a znak předtím určí, že tato hodnota je proměnnou.
Další možnosti proměnných:
$index = 13;
${"promenna_".$index} = "hodnota"; // $promenna_13 = "hodnota";
Jinak mi ale připadá, že to nemusíš řešit vůbec takto. Vždyť tu tabulku můžeš rovno celou vygenerovat v tom while a ne jen z něj dostávat proměnné a ty až potom vypisovat.
Co třeba takhle?
$query = mysql_query("SELECT * FROM def_news ORDER BY id LIMIT 0,4");
echo "<table width=100%>\n";
echo "<tr><td colspan=2>Novinky všeobecně</td></tr>\n";
$i=1;
while($row = mysql_fetch_array($query)):
/*
tady všechna ta ověření proměnných ...
*/
$table = "<table width=\"100%\"><tr><td align=left class=\"def_news\">$title</tr><tr><td><small>vloženo: $datum</small></td></tr><tr><td align=left valign=top class=\"def_news_text\">$text</td></tr></table>\n";
if (($i%2) == 1): // liché $i
echo "<tr>\n ";
echo "<td width=\"50%\">$table</td>\n ";
else:
echo "<td width=\"50%\">$table</td>\n ";
echo "</tr>\n";
endif;
$i++;
endwhile;
if (($i%2) == 0):
echo "<td width=\"50%\"> </td>\n ";
echo "</tr>\n";
// Tímto zajistíš, že nezůstane na posledním řádku volná 2. buňka.
// Stalo by se tak, kdyby byl lichý počet novinek.
// Pokud na posledním řádku vypsal while 1.buňku, tak $bzlo sudé. Nakonci
// se zvýšilo $i++; a teď je sudé.
// Naopak, jesli skončil správně 2.buňkou, $i je te+d liché a nic se nestane.
endif;
echo "</table>\n";
PAVEL
Nebo zkus pouzit pole, to se mi zda jemne efektivnejsi....
A jak to myslíš?
Přiznám se, že mě teď narychlo nenapadá, jak využít pole. Určitě to, co jsem mu napsal já, není nejlepší.
PAVEL
taky bych se priklanel k polim.. nejak jsem nezvald ten prispevek docist do konce :), ale nevidim duvod proc by to tema polema neslo.. akorat misto
if($i==1) $tbl1=... atd. das
$tbl[$i]=...
no a na konci to projedes nejakym cyklem ktery to rozdeli do dvou sloupecku..
Já jsem mu napsal:
$query = ....;
$i = 1;
while($row = mysql_fetch_array($query)):
$table = "tabulka s vlastní novinkou";
if (($i%2) == 1): // liché $i
echo "<tr>\n ";
echo "<td width=\"50%\">$table</td>\n ";
else:
echo "<td width=\"50%\">$table</td>\n ";
echo "</tr>\n";
endif;
$i++;
endwhile;
// pro případ, že na posledním řádku zustane 2.buňka prázdná
if (($i%2) == 0):
echo "<td width=\"50%\"></td>\n ";
echo "</tr>\n";
endif;
Jak jsem to tak pochopil, tak vy by jste nejprve v tom prvním cyklu načetli všechny novinky do pole a to potom dalším cyklem vypisovali. Ale mě to v tom případě přijde témeř stejné. Proč to zapisovat do pole, když to můžu vypsat hned. Co se týče toho posledního řádku (if (($i%2) == 0): ....), tak tím pouze zabraňuju, aby zůstala na poosledním řádku tabulky definovaná jen jedna buňka. Myslím, že to musíte za použití polí udělat taky.
Nebo to má nějaké jiné výhody, na které jsem nepřišel? :-)
PAVEL
jojo, vlastne bych to tak taky nsapsal.. ale uz je to mozna moc velky zasah do puvodni myslenky :-)
ten cyklus by sel lip napsat takle:
for($i=1;$row = mysql_fetch_array($query);$i++)
{...}
hele ty fakt pouzivas tu dvojteckovou syntaxi?
Jo, zřejmě jsem jeden z mála, le mě se s ní lépe dělá.
Bohužel (nebo možná naštěstí) nejsem ovlivněn jinými jazyky - maximálně tak JavaScriptem, takže zatím závorkám přednost nedávám. Prostě mi přijde strukturování kódu tímto způsobem přehlednější :-)
Tady ve fóru to není dobře vidět. Ale, hlavní výhoda je v tom, že ukončovací příkaz je snadno viditelný.
if (podminka):
prikaz1;
prikaz1;
if (podminka2):
prikaz3;
endif;
endif;
jsou odsazení
if (podminka)
{
prikaz1;
prikaz1;
if (podminka2)
{
prikaz3;
}
}
Třeba časem změním názor, ale zatím měnit nebudu :-)
PAVEL
Jo, ještě jsem zapomněl, že to bude z velké části asi taky mým editorem. V tom se klíčová slova, tedy i ukončovací endif; zvýrazní (u závorky to není tak vidět).
PAVEL
nojo, asi je to fakt z spis otazka zvyku..
strukturu programu vidis uz podle odsazeni, myslim ze by mi spis vadilo psat kvuli kazdymu bloku 6 zbytecnych znaku, u nejakych slozitejsich algoritmu pak vetsinu skriptu zabiraji prikazy typu endif.. (mimojine kvuli tomu nesnasim pascal/vb)
navic vetsina lepsich editoru ma moznost nejakeho zvyraznovani zavorek co patri k sobe..
a hlavne se ti to pak neplete kdyz pises neco v c/perlu/javascriptu/...