IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:15.4.2017 12:13

Ahoj, pokouším se o galerii obrázků. Mám problém s výpisem obrázků z databáze. Uložil jsem si je jako BLOB do MySQL (v phpMyAdmin).
Zkoušel jsem postup v místním tutoriálu, ale to nefunguje; není to tedy asi pro obrázky, ale jen textové řetězce.

require_once 'Db.php';
      Db::connect('127.0.0.1', 'databaze', 'root', '');

      $fotografie = Db::queryAll('SELECT `foto` FROM `fotogalerie` WHERE `fotogalerie_id` = ?', $idfotky);

      echo($fotografie['foto']);

Pak jsem zkoušel tento výpis;

<img id="foto" src="<?=$fotografie['foto']>";

Jenže to mi hlásí parse error.

Co dělám špatně?

 
Odpovědět
15.4.2017 12:13
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Jakub Hrdoun
Jan Lupčík:15.4.2017 13:07

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'] . '" />';
Nahoru Odpovědět
15.4.2017 13:07
TruckersMP vývojář
Avatar
vojak528
Člen
Avatar
vojak528:15.4.2017 13:14

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

 
Nahoru Odpovědět
15.4.2017 13:14
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:15.4.2017 19:15

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

Editováno 15.4.2017 19:16
 
Nahoru Odpovědět
15.4.2017 19:15
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Jakub Hrdoun
Jakub Žák:16.4.2017 8:59

A jaký je z toho výstup?

Nahoru Odpovědět
16.4.2017 8:59
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:16.4.2017 9:39

ukazuje to nenačtený obrázek

 
Nahoru Odpovědět
16.4.2017 9:39
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Jakub Hrdoun
TomasGlawaty:16.4.2017 9:58

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.

Editováno 16.4.2017 9:59
 
Nahoru Odpovědět
16.4.2017 9:58
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Jakub Hrdoun
Jakub Žák:16.4.2017 11:25

Myslel jsem spíš to, jak vypadá výstup toho skriptu - to HTML, co se odesílá prohlížeči.

Nahoru Odpovědět
16.4.2017 11:25
Kuba je ajťák. Buď jako Kuba.
Avatar
Odpovídá na Jakub Hrdoun
Neaktivní uživatel:16.4.2017 11:45

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]['fo­to'] a nebo použít foreach, ale to dává smysl jen pokud vybíráš víc prvků.

Editováno 16.4.2017 11:47
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
16.4.2017 11:45
Neaktivní uživatelský účet
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:16.4.2017 13:48

A potom taky dát pozor na správný formát výpisu, viz třeba Data URIs na CSS tricks

Editováno 16.4.2017 13:48
Nahoru Odpovědět
16.4.2017 13:48
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Hrdoun
Člen
Avatar
Jakub Hrdoun:17.4.2017 12:39

Díky všem moc za rady.

Zjistil jsem, že jsou fotografie skutečně uložené v $fotografie[0]['fo­to']. 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 8-) .

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.

 
Nahoru Odpovědět
17.4.2017 12:39
Avatar
Odpovídá na Jakub Hrdoun
Neaktivní uživatel:17.4.2017 16:18

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.

Nahoru Odpovědět
17.4.2017 16:18
Neaktivní uživatelský účet
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 12 zpráv z 12.