Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
exicap
Člen
Avatar
exicap:12.2.2015 17:43

Hoj,

v 5. dílu OOP seriálu PHP se zhotovuje galerie obrázků. Přesně takovou galerii jsem s i dle tutoriálu vytvořil i já, nicméně při spuštění mi to vyhazuje chybovou hlášku:
Fatal error: Call to a member function read() on boolean in C:\xampp\htdoc­s\galerie\tri­dy\Galerie.php on line 17

index.php:

<!DOCTYPE html>

<html lang="cs-cz">
<head>
    <meta charset="utf-8" />
    <title>Galerie obrázků</title>
</head>

<body>
<h1>Galerie obrázků</h1>
<?php
require_once('tridy/Galerie.php');

$galerie = new Galerie('obrazky', 5);
$galerie->nacti();
$galerie->vypis();
?>
</body>
</html>

Galerie.php:

<?php
class Galerie
{
    private $slozka;
    private $sloupcu;
    private $soubory = array();

    public function __constructor($slozka, $sloupcu)
    {
        $this->slozka = $slozka;
        $this->sloupcu = $sloupcu;
    }
    public function nacti()
    {
        $slozka = dir($this->slozka);

        while ($polozka = $slozka->read())
        {
            if (strpos($polozka, '_nahled.'))
                $this->soubory[] = $polozka;
        }
        $slozka->close();
    }
    public function vypis()
    {
        echo('<table><tr>');
        $pocet = 0;
        foreach ($this->soubory as $soubor) {
            $nahled = $this->slozka . '/' . $soubor;
            $obrazek = $this->slozka . '/' . str_replace('_nahled.', '.', $soubor);
            echo('<td><a href="' . htmlspecialchars($obrazek) . '"><img src="' . htmlspecialchars($nahled) . '" alt="" /></a></td>');
            $pocet++;
            if ($pocet >= $this->sloupcu)
                {
                $pocet = 0;
                echo('</tr><tr>');
                }
        }
        echo('</tr></table>');
    }
}

Neví prosím někdo co dělám špatně? Děkuji.

Editováno 12.2.2015 17:45
 
Odpovědět
12.2.2015 17:43
Avatar
Odpovídá na exicap
Matúš Petrofčík:12.2.2015 18:07

Funkcia dir(), teda u teba riadok

$slozka = dir($this->slozka);

vracia inštanciu triedy Directory, ktorej pridáva nejaké metódy (read, close...). V prípade chyby ale nevráti objekt, ale NULL ak sú nejaké zlé parametre, alebo FALSE v prípade nejakej inej chyby. Zisti si prosím čo sa po vykonaní tohto riadku nachádza v premennej $slozka.

Za ten príkaz pridaj

var_dump($slozka);
exit;

Ak tam bude objekt, tak je chyba niekde inde, ale ak tam bude FALSE alebo NULL, tak som chybu popísal vyššie.

V angličtine viac info: http://php.net/…tion.dir.php

edit: ja si myslím že máš zlú cestu k zložke.

Editováno 12.2.2015 18:09
Nahoru Odpovědět
12.2.2015 18:07
obsah kocky = r^2 ... a preto vlak drnká
Avatar
exicap
Člen
Avatar
Odpovídá na Matúš Petrofčík
exicap:12.2.2015 19:14

Máš pravdu, obsahem proměnné $slozka je opravdu false. Kde je ale chyba? Index.php mám normálně uložen v projektu a na stejné úrovni jako index se nachází složka obrazky a tridy. Myslím, že odkaz na složku je pak správný, není?

 
Nahoru Odpovědět
12.2.2015 19:14
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na exicap
Jan Lupčík:12.2.2015 19:21

Možná jde o to, že to otevírá soubor ve tridy. Ještě bych zkusil ../obrazky. :)

Nahoru Odpovědět
12.2.2015 19:21
TruckersMP vývojář
Avatar
exicap
Člen
Avatar
Odpovídá na Jan Lupčík
exicap:12.2.2015 19:24

To mě taky napadlo, ale ani tato úprava, případně přesunutí složky obrazky do složky tridy se zanecháním původního zápisu nepomohlo :-(.

 
Nahoru Odpovědět
12.2.2015 19:24
Avatar
Odpovídá na exicap
Matúš Petrofčík:12.2.2015 19:26

Skús tú cestu k súborom napísať inak, v indexe napr:

$galerie = new Galerie('/obrazky', 5); // podľa mňa riešenie

alebo

$galerie = new Galerie('/obrazky/', 5);

alebo

$galerie = new Galerie('./obrazky', 5);

a daj vedieť či pomohlo alebo nie.

Nahoru Odpovědět
12.2.2015 19:26
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Jan Lupčík
Matúš Petrofčík:12.2.2015 19:27

Ee, ak dáš require (include) tak daný súbor sa stane súčasťou súboru, ktorý ho requiroval (includoval).

Nahoru Odpovědět
12.2.2015 19:27
obsah kocky = r^2 ... a preto vlak drnká
Avatar
exicap
Člen
Avatar
exicap:12.2.2015 19:29

Nic. Ani jeden z těch zápisů nepomohl. Stále je obsahem false. Třeba je chyba někde jinde než v zápisu? Ovšem kde, to netuším.

edit: přidávám obrázek z IDE, třeba vám to pomůže

Editováno 12.2.2015 19:34
 
Nahoru Odpovědět
12.2.2015 19:29
Avatar
Odpovídá na exicap
Matúš Petrofčík:12.2.2015 19:38

Skúšaš to na localhoste? Hostingy na zmeny kódu niekedy reagujú s oneskorením.

Ja inde než v ceste k zložke chybu nevidím. Na php.net v ukážkach ľudia používali tvary /slozka a /slozka/

edit: možno to bude nastavením localhost serveru

Editováno 12.2.2015 19:40
Nahoru Odpovědět
12.2.2015 19:38
obsah kocky = r^2 ... a preto vlak drnká
Avatar
exicap
Člen
Avatar
Odpovídá na exicap
exicap:12.2.2015 20:00

http://imageshack.com/…7/Lj8NXT.jpg - takhle jsou poskládané ty složky a k tomu odkaz na ně v index.php

Jo, zkouším to přes localhost. Sám jsem z toho taky zmaten.

 
Nahoru Odpovědět
12.2.2015 20:00
Avatar
Michal Žůrek - misaz:12.2.2015 20:06

nevrací náhodou $slozka->read() i takové ty o adresář back, a podobné? Zkusi vy vypsat u jaké složky/položky se to zasekne.

 
Nahoru Odpovědět
12.2.2015 20:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.