Diskuze: Zobrazení obrázků z databáze
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Protože to vypisuješ špatně. Tvůj výpis končí >
, ale
to má být ?>
. Pokud sis tedy vybral data z databáze
správně, výpis by měl být takovýto:
<img id="foto" src="<?= $fotografie['foto'] ?>" />
Tedy za předpokladu, že to vypisuješ jako HTML v pohledu. Pokud to echuješ v PHP, správně je to takto:
echo '<img id="foto" src="' . $fotografie['foto'] . '" />';
Mozno ty chyba otaznik
<img id="foto" src="<?=$fotografie['foto'] ?>";
alebo
Skus neco podobne
<?php foreach ($fotografie as $foto) : ?>
<img src="images/<?php echo $foto['foto']; ?>" >
<?php endforeach; ?>
Ale daj pozor na adresu src kde mas ulozene obrazky
Když dám obrázek za PHP;
<img id="foto" src="<?= $fotografie['foto'] ?>" />
tak chrome hlásí Forbidden. A v PHP;
echo '<img id="foto" src="' . $fotografie['foto'] . '" />';
říká Undefined index . Blbě šahám do databáze?
Mám to tam takhle:
require_once 'Db.php';
Db::connect('127.0.0.1', 'databaze', 'root', '');
$fotografie = Db::queryAll('SELECT `foto` FROM `fotogalerie` WHERE `fotogalerie_id` = ?', $fotoid);
Ta třída Db.php je odsud, z výše zmíněného tutoriálu.
vojak528 -> obrázky nemám ve složce, ale databázi
ukazuje to nenačtený obrázek
Undefined index je zpravidla vyhazován, pokud se snažíš získat hodnotu z
pole, která tam není. V tomto případě pole $fotografie neobsahuje index
foto
. Řekl bych, že daný obrázek v databázi není, což je
situace, kterou musíš ošetřit.
Dále záleží jak s obrázky pracuješ.
1) Ukládáš je na disk a do databáze ukládáš cestu k
souboru
V tomto případě by měl fungovat postup, jakým to děláš. Zkontroluj cestu
jestli sedí ad.
2) Ukládáš do DB celé obrázky (base64, nebo v raw
podobě):
V tom případě je můžeš zobrazit přes další PHP script.
šablona:
<img src="image.php?id=1" width="200" height="150" alt="" />
image.php:
$id = $_GET['id'];
# vytáhneš řádek z DB ($row)
$image = $row ? $row['foto'] : file_get_contents('/images/noimage.jpeg') # možnost, jak zobrazit zástupný obrázek, pokud v DB neexistuje
header("Content-type: image/jpeg");
echo $image;
Zjednodušeně, třeba content-type bych nastavoval podle typu obrázku ad.
Myslel jsem spíš to, jak vypadá výstup toho skriptu - to HTML, co se odesílá prohlížeči.
Udělej si var_dump proměnné $fotografie a zjistíš, že nemá index foto. Mělo by to vracet pole polí, něco jako
$fotografie = [
[
'foto' => '...'
]
]
Takže ideálně nepoužít metodu fetchAll ale něco jako fetchSingle (nevím, jak přesně ta třída vypadá), protože se snažíš vybírat jen jeden prvek. Nebo vypisovat $fotografie[0]['foto'] a nebo použít foreach, ale to dává smysl jen pokud vybíráš víc prvků.
A potom taky dát pozor na správný formát výpisu, viz třeba Data URIs na CSS tricks
Díky všem moc za rady.
Zjistil jsem, že jsou fotografie skutečně uložené v $fotografie[0]['foto']. Zkoušel jsem je všemožnými způsoby zobrazit, přes DATA URIs (to vypadá šikovně, ale nefunguje mi to, vypíše se mi do prohlížeče ten obrázek binárně).
Nakonec jsem to provizorně vyřešil tak, že jsem obrázky (mám jich asi 35) nahrál do FTP, pojmenoval je obrazek01 až obrazek35 a podle fotoid z $_GET jsem je zobrazoval. Což, uznávám, je celkem prasárna, ale ta databáze se mi prostě zprovoznit nepodařila. Tak aspoň ta galerie funguje a o to mi přece šlo .
Pro příště to asi udělám tak, že do ní uložím odkazy, protože texty a čísla se mi z databáze dařilo tahat v pohodě. Stejně mám pro FTP několikrát větší prostor než na databáze.
Tak ještě jednou díky všem.
Většinou to tak bývá lepší. Databázi chceš zatěžovat co nejméně, takže máš místo souborů uložené třeba jejich url. Navíc, jak říkáš, máš typicky databázového prostoru méně než diskového.
Zobrazeno 12 zpráv z 12.