Autor Zpráva
Kos112567
Profil
Ahoj,

předem se omlouvám, že ještě otravuji. Nicméně narazil jsem zase na chybu a úplně nevím co s tím...

Mám tuto stránku - index.php

<?php
session_start();
require('Db.php');
require('paginace.php');
$spojeni = Db::connect('127.0.0.1', 'sokolmilicincz1', 'root', ''); //pripojeni k db
if (isset($_GET['clanek'])) //zobrazeni clanku
    $url = $_GET['clanek'];
else
    $url = 'uvod';

$clanek = Db::queryOne('
        SELECT *
        FROM clanky
        WHERE url=?
', $url);

if (!$clanek) //pokud se nenalezne clanek, tak 404
{
    if ($url != 'chyba')
    {
        header('Location: index.php?clanek=chyba.php');
        exit();
    }
    else //pokud se ani 404 nenalezne
        die('Nebyl nalezen chybovy clanek');
}

if (isset($_GET['odhlasit'])) //odhlaseni ze stranky
{
    session_destroy();
    header('Location: index.php');
    exit();
}

function zabezpec($retezec)
{
    return Db::quote($retezec);
}
?>
<!--Oznámení o webové stránce-->
<!DOCTYPE html>
<html lang="cs-cz">
<!--Připojené styly a javascripty-->
    <head>
        <meta charset="utf-8" />
        <meta name="description" content="<?= htmlspecialchars($clanek['popisek']) ?>" />
        <meta name="keywords" content="<?= htmlspecialchars($clanek['klicova_slova']) ?>" />
        <link href="styl.css" rel="stylesheet" type="text/css">
        <link href="style_blue.css" rel="alternate stylesheet" type="text/css" title="alternate">
        <link rel=stylesheet href="print.css" media="print">
        <title><?= htmlspecialchars($clanek['titulek']) ?></title>
        <script src="js/checkform.js"></script>
        <script src="js/changeCSS.js" type="text/javascript"></script>
    </head>
    <body>
    <header>
            <div id="logo"><img src="obrazky/sokolMale.png" alt="logo"></div>
<!--        Navigační menu-->
        <nav>
            <ul>
                <li class="aktivni"><a href="index.php">Domů</a></li>
                <li><a href="sport.php">Sport</a></li>
                <li><a href="kultura.php">Kultura</a></li>
                <li><a href="fotogalerie.php">Fotogalerie</a></li>
                <li><a href="dokumenty.php">Dokumenty</a></li>
                <li><a href="historie.php">Historie</a></li>
<!--                Bud se zobrazí tlačítko nebo jmeno uzivatele-->
                <?php
                if (!isset($_SESSION['id'])) {
                    echo '<li class="login"><a href="prihlaseni.php">Přihlášení</a></li>';
                } else {
                    echo '<li class="login"><a href="index.php?odhlasit">Odhlásit</a></li>';
                    echo '<li class="login"><a>'.htmlspecialchars($_SESSION['uzivatel_jmeno']).'</a></li>';
                }
                ?>
            </ul>
        </nav>
        </header>
<!--    Zajištuje vycentrování articlu-->
    <div id="centrovac">
        <article>

                <header>
<!--                    Nadpis se zjištuje podle aktualního článku-->
                    <h1><?= htmlspecialchars($clanek['titulek']) ?></h1>
                </header>
            
                <section>
                    <h2><?= htmlspecialchars($clanek['titulek']) ?></h2>
<!--                    Výpis článku, který se bere z databáze-->
                    <?= $clanek['obsah'] ?>
                </section>
                <div class="cistic"></div>
        </article>
    </div>
<!--    Nastavení pro komentářové prvky-->
    <div id="komentare">
        <?php
        function vratKomentare($strana, $naStranu){ //vrací komentáře na základě aktuální stránky a počtu komentářů na stranu
            return Db::queryAll('SELECT autor, datumvlozeni, obsah FROM nkniha WHERE id_clanku_FK=? ORDER BY id DESC LIMIT ?, ?', $clanek['clanky_id'] ($strana - 1) * $naStranu, $naStranu);
        }
        function vratPocetKomentaru(){ //vrací celkový počet komentářů
            return Db::queryOne('SELECT COUNT(*) FROM nkniha');
        }

        if (isset($_GET['strana']))
            $strana = $_GET['strana'];
        else
            $strana = 1;
        $naStranu = 15;
        $komentare = vratKomentare($strana, $naStranu);
        $stran = ceil(vratPocetKomentaru() / $naStranu);


        ?>
    <?php
    if (!isset($_SESSION['id'])) {
        echo 'Pro komentování článků se prosím <a href="prihlaseni.php">přihlašte</a>';
    }

    else
        {
        echo '<form action="zpracovani.php" method="post" name="formular">
        Vaše jméno: ';echo $clanek['clanky_id'];
        echo htmlspecialchars($_SESSION['uzivatel_jmeno']).'<br>
        <input type=hidden name="autor" value='.
        htmlspecialchars($_SESSION['uzivatel_jmeno']).'
    ><br>';
        echo 'Váš vzkaz:<br>
        <textarea name="obsah" rows="7" cols="50" wrap="soft" required></textarea><br>
        <input type="submit" value="Odeslat">
        <input type=hidden name="clanky_id" value='.
            htmlspecialchars($clanek['clanky_id']). '
    ><br>';
        '</form>';
        }

    foreach ($komentare as $komentar) {
        echo '<p><b>Autor: </b>'. $komentar['autor'];
        echo ' Datum: '. date('j.n. Y', strtotime ($komentar['datumvlozeni']));
        echo '<p><b>Text: </b>'. $komentar['obsah'];

    }
        ?>


    </div>
    <footer>
<!--Volání skriptu chooseStyle(s platnosti na 9999 dní)-->
        <a href="javascript:chooseStyle('none', 9999)">Červený styl</a>
        <a href="javascript:chooseStyle('alternate', 9999)">Modrý styl</a>
        <a href="prihlaseni.php">Administrace</a>
        </footer>
    </body>
</html>

A v sekci komentářové prvky si úplně nevím rady s těmito věcmi -

a) IDE mi vynadává, že nezná proměnnou $clanek, který ale přitom vytvářím hned na začátku (a poté s ní pracuji úplně v pořádku).
b) vyhazuje mi to tuto chybu: vratKomentare(1, 15) #1 {main} thrown in... (což možná bude souviset s tou první)

Ještě k tomu mám takový připojený soubor paginace.php



Který vypadá takto:

<?php

function urlStrany($url, $strana) //vraci url s aktualnim strankovanim
{
    return str_replace('{strana}', $strana, $url);
}

function paginace($strana, $stran, $url) //vygeneruje kód navigační lišty a to podle aktuální stranky a počtu stránek
{
    $polomer = 5; // Poloměr oblasti kolem aktuální stránky(kolik jich chceme ukazovat)
    $html = '<nav class="centrovany"><ul class="paginace">';
    // Šipka vlevo
    if ($strana > 1)
        $html .= '<li><a href="' . urlStrany($url, $strana - 1) . '">&laquo;</a></li>';
    else
        $html .= '<li class="neaktivni">&laquo;</li>';
    $left = $strana - $polomer >= 1 ? $strana - $polomer : 1;
    $right = $strana + $polomer <= $stran ? $strana + $polomer : $stran;
    // Umístění jedničky
    if ($left > 1)
        $html .= '<li><a href="' . urlStrany($url, 1) . '">1</a></li>';
    // Tečky vlevo
    if ($left > 2)
        $html .= '<li class="neaktivni">&hellip;</li>';
    // Stránky v radiusu
    for ($i = $left; $i <= $right; $i++)
    {
        if ($i == $strana) // Aktivní stránka
            $html .= '<li class="aktivni">' . $i . '</li>';
        else
            $html .= '<li><a href="' . urlStrany($url, $i) . '">' . $i . '</a></li>';
    }
    // Tečky vpravo
    if ($right < $stran - 1)
        $html .= '<li class="neaktivni">' . '&hellip;' . '</li>';
    // Umístění poslední stránky
    if ($right < $stran)
        $html .= '<li><a href="' . urlStrany($url, $stran) . '">' . $stran . '</a></li>';
    // Šipka vpravo
    if ($strana < $stran)
        $html .= '<li><a href="' . urlStrany($url, $strana + 1) . '">&raquo;</a></li>';
    else
        $html .= '<li class="neaktivni">&laquo;</li>';
    $html .= '</ul></nav>';
    return $html;
}

A co je mým cílem? Abych pod články měl sekci komentáře, které se budou stránkovat</br>a co je mým cílem? abych pod články měl sekci komentáře, které se budou stránkovany
Lonanek
Profil
Kos112567:
a) IDE mi vynadává, že nezná proměnnou $clanek, který ale přitom vytvářím hned na začátku (a poté s ní pracuji úplně v pořádku).
možná to bude tím, že nemáte oddělené parametry v dotazu, chybí tam čárka mezi $clanek['clanky_id'], ($strana - 1) * $naStranu

        function vratKomentare($strana, $naStranu){ //vrací komentáře na základě aktuální stránky a počtu komentářů na stranu
            return Db::queryAll('SELECT autor, datumvlozeni, obsah FROM nkniha WHERE id_clanku_FK=? ORDER BY id DESC LIMIT ?, ?', $clanek['clanky_id'], ($strana - 1) * $naStranu, $naStranu);
        }
Kos112567
Profil
To jsem teď opravil a bohužel stále mi to píše, že nezná tu proměnnou
Lonanek
Profil
Na kterém konkrétním řádku je chyba?
Kos112567
Profil
Notice: Undefined variable: clanek in C:\xampp\htdocs\web\index.php on line 100
Fatal error: Uncaught Error: Unsupported operand types in C:\xampp\htdocs\web\index.php:112 Stack trace: #0 {main} thrown in C:\xampp\htdocs\zwa - project\index.php on line 112

Toto mi to píše na webu - řádek 100 je tento

return Db::queryAll('SELECT autor, datumvlozeni, obsah FROM nkniha WHERE id_clanku_FK=? ORDER BY id DESC LIMIT ?, ?', $clanek['clanky_id'], ($strana - 1) * $naStranu, $naStranu);

A řádek 112 tento

        $stran = ceil(vratPocetKomentaru() / $naStranu); //celkovy pocet, zaokrouhlíme nahoru, pokud je to např. 1,5 strany (ceil)
Lonanek
Profil
Funkce vratKomentare $clanek[] nezná, protože jej této funkci nepředáváte.
juriad_
Profil *
řádek 110: Ve funkci se můžeš odkazovat jen na proměnné, které jí předáš jako parametry (a globální proměnné). Proměnná článek z toho důvodu není uvnitř funkce vratKomentare dostupná.
řádek 112: Nejspíš funkce vratPocetKomentaru vrací něco jiného než číslo. Vypiš si co vrací pomocí var_dump; nejspíš to bude pole.
Kos112567
Profil
řádek 110: aha, a jakým způsobem jí můžu tu funkci předat?
řádek 112: máš pravdu, vrací mi to toto - array(1) { ["COUNT(*)"]=> int(20) }
Lonanek
Profil
Kos112567:
aha, a jakým způsobem jí můžu tu funkci předat?
buď jako parametr, nebo ve funkci global
Keeehi
Profil
Lonanek:
buď jako parametr, nebo ve funkci global
Takto je to správně. Slovo global můžeš zapomenout a nikdy jsi o něm neslyšel ;)
Kos112567
Profil
Teď tedy nevím, jestli tam mám dát ten apresand nebo ne...?

function vratKomentare($strana, $naStranu, &$clanek) - takto?
Keeehi
Profil
Kos112567:
Ampersand není třeba. Spíš by mohl způsobit problémy než cokoli jiného.
Kos112567
Profil
Ok, takže už to funguje :)

Ještě nevím co mám dělat s tím polem...
Keeehi
Profil
Tohle by mohlo fungovat (záleží na verzi PHP)
        function vratPocetKomentaru(){ //vrací celkový počet komentářů
            return Db::queryOne('SELECT COUNT(*) AS pocet FROM nkniha')['pocet'];
        }
Kos112567
Profil
Ano, už je to v pořádku a žádná chyba nevyskakuje, nicméně pořád to nefunguje tak jak má nevidíte tam ještě nějakou chybu?

Vůbec mi to nestránkuje - pouze jsou tam čísla, které se dají přepínat, ale příspěvky jsou tam pořád všechny viditelné...
Kos112567
Profil
Už to funguje, měl jsem tam jenom takovou blbou chybu :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: