Diskuze: Problém s redakčním systémem
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


Neaktivní uživatel:16.3.2015 14:16
Ahoj, nevím, zda jsem tvůj dotaz pochopil správně, ale myslím si, že používáš dvě různé proměnné, místo jedné.
Na začátku kódu používáš
$_GET['clanek']
a ve zbylé části, vč. hlavního menu používáš
$_GET["stranka"]
. Pokud se tedy nepletu tak bude stačit, pokud na 6., 7. a 20. řádku přepíšeš klíč clanek na stranka.
<?php
require('Db.php');
Db::connect('127.0.0.1', 'sokol_db', 'root', '');
if (isset($_GET['stranka']))
$url = $_GET['stranka'];
else
$url = 'uvod';
$clanek = Db::queryOne('
SELECT *
FROM clanky
WHERE url=?
', $url);
if (!$clanek)
{
if ($url != 'chyba')
{
header('Location: index.php?stranka=chyba');
//Zde by už to mělo být v pořádku
mkores.mk:16.3.2015 14:45
Pochopil jsi ta naprosto správně a já ti děkuji!
Takže jestli to správně chápu, v databázi mi sloupec "url" určuje, ve které podstránce se bude článek nacházet?
Ještě dvě otázečky, jestli by jsi nevěděl. Když bych chtěl do podstránky "Domů" nechat zobrazit více článků z databáze, ale u ostatních pouze jeden, jak bych toho mohl docílit?
A druhý:
Když se podíváš na řádek 51, nepřipadá ti trošku divné? Myslím tím
toto - když spustím index webu, tak je na adrese .../index.php, když přejdu
na jinou podstránku, vygeneruje se mi url .../index.php?stranka=arch (což je
dle mého v pořádku), ale když přejdu zpět "Domů" (což by měl být
index) tak adresa je .../index.php?stranka=index. Stačí ho pouze upravit
na
<li<?php if($stranka == "index") echo " class=\"aktivni\""?>><a href="index.php">Domů</a></li>
Když to takhle učiním, jaké url bude u článku v databázi? Protože index nefunguje (teď ten index totiž není podstránka...?)
Neaktivní uživatel:16.3.2015 15:01
Ahoj, nejprve odpovím na druhý dotaz s tím indexem. Sám sis to nadefinoval na devátém řádku, kde je dáno, že pokud nebude definován klíč stranka, což se týká právě indexu, použije se uvod.
Co se týče více článků, tak si nejsem jistý se správnou architekturou mého kódu, ale mohl bys to udělat následovně.
- Z databáze vytáhneš více článků pomocí slova IN.
$clanky = Db::queryAll('
SELECT *
FROM clanky
WHERE url IN (?, ?, ?)
', $url1, $url2, $url3); // Vytáhne 3 články z databáze
Všimni si dotazu, z databáze chceme všechny vytažené řádky, ne jen jeden, proto queryAll.
- Poté je již normálně zobrazíš.
Článek 1: <?= $clanky[0]['obsah'] ?>
Článek 2: <?= $clanky[1]['obsah'] ?>
EDIT: Doplním, že místo slůvka IN (přesně nevím, jak se tomu říká) můžeš použít klasické
WHERE url = ? OR url =? OR url = ?
Neaktivní uživatel:16.3.2015 16:16
Jo, aha, na to jsem zapomněl, ale pokud se nepletu, tak by stačilo nastavit null hodnotu pro $url2 a 3 a tím pádem se ti vytáhne jen jeden článek... Nebo s čím máš problém?
mkores.mk:16.3.2015 16:36
Myslíš nastavit hodnotu null kde? V databázi?
No, v indexu z <section> se mi bere kód pro všechny podstránky, tzn. když v indexu přiřadím null hodnotu k $url2, tak se mi nezobrazí ani v indexu, ve kterém by se zobrazit měl, ne?
Neaktivní uživatel:16.3.2015 17:33
Ahoj, moc tě nechápu, neposlal bys mi prosím kód?
Jde o to, že pokud chceš získat jen jeden článek, tak $url2 a $url3 nastavíš na NULL, v tom případě se ti našte jen jeden článek z databáze, ke kterému přistoupíš následovně.
<?= $clanky[0]['obsah'] ?>
Mohl bys také zkombinovat můj kód a tvůj kód. Pokud se bude jednat o klasickou stránku, pomocí ifu spustíš svůj kód. Pokud bude index, spustíš ten můj dotaz.
Asi to blbě píšu
No, mě jde to, že když budou zobrazovat index, bude se vypisovat víc článků, když to bude jiná stránka než index, bude tam ten článek jenom jeden.
Jo, asi to půjdu ifem, ale nevím přesně jak. Obalit ifem celý tento kód?
$clanky = Db::queryAll('
SELECT *
FROM clanky
WHERE url IN (?, ?, ?)
', $url, $url, $url);
Jinak index.php vypadá takto
<?php
require('Db.php');
Db::connect('127.0.0.1', 'sokol_db', 'root', '');
if (isset($_GET['stranka']))
$url = $_GET['stranka'];
else
$url = 'index'; //když nebude definovan klic stranka, pouzije se index
$clanky = Db::queryAll('
SELECT *
FROM clanky
WHERE url IN (?, ?, ?)
', $url, $url, $url); // Vytáhne 3 články z databáze
if (!$clanky)
{
if ($url != 'chyba')
{
header('Location: index.php?stranka=chyba');
exit();
}
else
die('Nebyl nalezen chybovy clanek');
}
$stranka = isset($_GET["stranka"]) ? $_GET["stranka"] : "";
?>
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<meta charset="utf-8" />
<meta name="description" content="<?= htmlspecialchars($clanek['popisek']) ?>" />
<meta name="keywords" content="<?= htmlspecialchars($clanek['klicova_slova']) ?>" />
<link rel="stylesheet" href="styl.css" type="text/css" />
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
<script src="js/jquery-1.7.2.min.js"></script>
<script src="js/jquery-ui-1.8.18.custom.min.js"></script>
<script src="js/jquery.smooth-scroll.min.js"></script>
<script src="js/lightbox.js"></script>
<title>Web o TJ Sokol Miličín</title>
</head>
<body>
<header>
<div id="logo" ><h1>Sokol Miličín</h1></div>
<nav>
<ul>
<li<?php if($stranka == "index") echo " class=\"aktivni\""?>><a href="index.php">Domů</a></li>
<li<?php if($stranka == "dok") echo " class=\"aktivni\""?>><a href="index.php?stranka=dok">Dokumenty</a></li>
<li<?php if($stranka == "sport") echo " class=\"aktivni\""?>><a href="index.php?stranka=sport">Sport</a></li>
<li<?php if($stranka == "kul") echo " class=\"aktivni\""?>><a href="index.php?stranka=kul">Kultura</a></li>
<li<?php if($stranka == "foto") echo " class=\"aktivni\""?>><a href="index.php?stranka=foto">Fotogalerie</a></li>
<li<?php if($stranka == "hist") echo " class=\"aktivni\""?>><a href="index.php?stranka=hist">Historie</a></li>
<li<?php if($stranka == "arch") echo " class=\"aktivni\""?>><a href="index.php?stranka=arch">Archiv</a></li>
</ul>
</nav>
</header>
<article>
<div id="centrovac">
<div id="levy_prvek">
<header>
<h1>Header</h1>
<div class="contacts">
<h2 class="kontakty">Kontakty</h2>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
</div>
</header>
</div>
<section>
<div class="news">
<h3><?= htmlspecialchars($clanky[0]['titulek']) ?></h3>
<?= $clanky[0]['obsah'] ?>
</div><div class="news">
<h3><?= htmlspecialchars($clanky[1]['titulek']) ?></h3>
<?= $clanky[1]['obsah'] ?>
</div>
</section>
<div class=" pravy_prvek">
<iframe src="https://www.google.com/calendar/embed?showTitle=0&showPrint=0&showTabs=0&showCalendars=0&showTz=0&height=260&wkst=2&hl=cs&bgcolor=%23cccccc&ctz=Europe%2FPrague" style=" border:solid 1px #777 " width="210" height="260" frameborder="0" scrolling="no"></iframe> </div>
<div class="cistic"></div>
</div>
</article>
<footer>
Copyright © 2015<br>
Michal Koreš
<a href="administrace.php">Administrace</a>
</footer>
</body>
</html>
Neaktivní uživatel:16.3.2015 18:20
Ahoj, v tvém případě bych kód trochu pozměnil. Do stránky bych vypisoval přes proměnné $obsah a $titulek. Do těch by se na začátku stránky načetl potřebný obsah na vypsání.
Pokud by se jednalo o normální stránku, použil by se starý dotaz, ze kterého by se vytáhl článek a uložil do těch dvou proměnných. Pokud by se jednalo o index, vytáhlo by se několik článků a nacpali by se opět do těch dvou proměnných výše..
<?php
require('Db.php');
Db::connect('127.0.0.1', 'sokol_db', 'root', '');
if (isset($_GET['stranka']))
$url = $_GET['stranka'];
else
$url = 'index'; //když nebude definovan klic stranka, pouzije se index
// Rozhodne se, co se má získat
if ($url == 'index') {
$uvod = Db::queryOne('
SELECT *
FROM clanky
WHERE url = ?
', 'uvod');
$novinky = Db::queryOne('
SELECT *
FROM clanky
WHERE url = ?
', 'novinky');
// Uložení do dvou proměnných
$titulek = "Hlavní stránka webu.";
$obsah = $uvod['obsah'] . "<br>" . $novinky['obsah']; // Zde dojde ke sloučení dvou článků
} else {
$clanek = Db::queryOne('
SELECT *
FROM clanky
WHERE url = ?
', $url);
// Uložení do dvou proměnných
$titulek = $clanek['titulek'];
$obsah = $clanek['obsah'];
}
if (!$clanky)
{
if ($url != 'chyba')
{
header('Location: index.php?stranka=chyba');
exit();
}
else
die('Nebyl nalezen chybovy clanek');
}
$stranka = isset($_GET["stranka"]) ? $_GET["stranka"] : "";
?>
<!DOCTYPE html>
<html lang="cs-cz">
<head>
<meta charset="utf-8" />
<meta name="description" content="<?= htmlspecialchars($clanek['popisek']) ?>" />
<meta name="keywords" content="<?= htmlspecialchars($clanek['klicova_slova']) ?>" />
<link rel="stylesheet" href="styl.css" type="text/css" />
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
<script src="js/jquery-1.7.2.min.js"></script>
<script src="js/jquery-ui-1.8.18.custom.min.js"></script>
<script src="js/jquery.smooth-scroll.min.js"></script>
<script src="js/lightbox.js"></script>
<title>Web o TJ Sokol Miličín</title>
</head>
<body>
<header>
<div id="logo" ><h1>Sokol Miličín</h1></div>
<nav>
<ul>
<li<?php if($stranka == "index") echo " class=\"aktivni\""?>><a href="index.php">Domů</a></li>
<li<?php if($stranka == "dok") echo " class=\"aktivni\""?>><a href="index.php?stranka=dok">Dokumenty</a></li>
<li<?php if($stranka == "sport") echo " class=\"aktivni\""?>><a href="index.php?stranka=sport">Sport</a></li>
<li<?php if($stranka == "kul") echo " class=\"aktivni\""?>><a href="index.php?stranka=kul">Kultura</a></li>
<li<?php if($stranka == "foto") echo " class=\"aktivni\""?>><a href="index.php?stranka=foto">Fotogalerie</a></li>
<li<?php if($stranka == "hist") echo " class=\"aktivni\""?>><a href="index.php?stranka=hist">Historie</a></li>
<li<?php if($stranka == "arch") echo " class=\"aktivni\""?>><a href="index.php?stranka=arch">Archiv</a></li>
</ul>
</nav>
</header>
<article>
<div id="centrovac">
<div id="levy_prvek">
<header>
<h1>Header</h1>
<div class="contacts">
<h2 class="kontakty">Kontakty</h2>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
<p>asdasdasd</p>
</div>
</header>
</div>
<section>
<div class="news">
<h3><?= htmlspecialchars($titulek) ?></h3>
<?= $obsah ?>
</section>
<div class=" pravy_prvek">
<iframe src="https://www.google.com/calendar/embed?showTitle=0&showPrint=0&showTabs=0&showCalendars=0&showTz=0&height=260&wkst=2&hl=cs&bgcolor=%23cccccc&ctz=Europe%2FPrague" style=" border:solid 1px #777 " width="210" height="260" frameborder="0" scrolling="no"></iframe> </div>
<div class="cistic"></div>
</div>
</article>
<footer>
Copyright © 2015<br>
Michal Koreš
<a href="administrace.php">Administrace</a>
</footer>
</body>
</html>
Ještě trošku jinak jsem to myslel
Nějak takto:
if ($url == 'index'){
$clanky = Db::queryAll('
SELECT *
FROM clanky
WHERE url IN (?, ?, ?)
', $url, $url, $url); // Vytáhne 3 články z databáze
}
else {
$clanek = Db::queryOne('
SELECT *
FROM clanky
WHERE url=?
', $url);
Neboli - když budu na indexu, článků budu tahat z databáze víc. Když budu někde jinde (dok.php, kul.php,...) článek na stránku bude pouze jeden. Bohužel, výše mnou zmíněný kód mi nefunguje
Ale už doufám, že už si rozumíme
Neaktivní uživatel:16.3.2015 18:59
Ano, rozumím ti, ale nakonec jsem si uvědomil jednu věc, ty články se ti
načtou v "náhodném" pořadí, proto by se složitě vybíralo, který
článek je který.
Jo, a nezapomeň, že na 6. řádku, kde je ten komentář, máš zadáno 3x to
samé. Pokud chceš 3 různé články, musejí tam být 3 různé proměnné,
ale jak říkám, nemyslím si, že by to bylo vhodné..
Ještě jsem teda si vzpomněl u této části
// Rozhodne se, co se má získat
if ($url == 'index') {
$uvod = Db::queryOne('
SELECT *
FROM clanky
WHERE url = ?
', 'uvod');
$novinky = Db::queryOne('
SELECT *
FROM clanky
WHERE url = ?
', 'novinky');
// Uložení do dvou proměnných
$titulek = "Hlavní stránka webu.";
$obsah = $uvod['obsah'] . "<br>" . $novinky['obsah']; // Zde dojde ke sloučení dvou článků
budou tedy dva články, které se pak spojí do jedné proměnné, která se vypíše (pokud projde ifem) - když budu chtít mít těch článků na indexu třeba 5, tak pouze přidám další proměnné a na konci je spojím, jak jsi to udělal ty?
mkores.mk:16.3.2015 19:39
Super
Bohužel ještě problém co mám, je že když vložim do databáze článek, který má URL "uvod"(nebo "novinky"), tak se nepropíše do indexu (pořád mi to hlásí chybějící článek...)
Sorry, jestli vypadám jak pitomec a pořád se na něco ptám, ale s PHP +
databází teď začínám, takže ještě v tom tak chodit neumím...
Neaktivní uživatel:16.3.2015 20:04
No, ty jsi zvolil taktiku takovou, že v databázi budeš mít hlavní stránku a nějaké info ohledně webovek. Většinou se to ale řeší tak, že v tabulce na články budeš mít pouze články a budeš mít samostatnou stránku na index, protože zde obvykle chceš mít něco, co jako článek nevypadá, například seznam článků, nebo nějaké interaktivní věci. Pokud bys to chtěl mít tak, jak píšeš, tak si udělej zvlášť stránku na index a zvlášť na články, která bude tahat z databáze pouze články..
Každopádně nevím, jak to zamýšlíš, protože jsem se na NERS tutoriály nedíval a nevím, jak to tam řeší...
Asi ti už v tom moc nepomůžu. Měj se
Zobrazeno 18 zpráv z 18.