[PHP]Uitlezen van plaatjes uit een db als het een plaatje is

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dante Chaos
  • Registratie: Augustus 2007
  • Laatst online: 23-05 10:40

Dante Chaos

The dude abides

Topicstarter
Hoi,

Ik ben bezig met een script waar ik een artikel moet laten zien uit een database.
Nu is het punt dat ik het plaatje uit de database moet halen die als BLOB staat opgeslagen. Nu heb ik wel de code die dat verzorgt maar nu moet ik ervoor zorgen dat hij alleen het plaatje als plaatje ziet en niet de HTML.
Doormiddel van een functie en een IF($_GET(''))

En daar zit ik dus vast...
while($row_detail = mysql_fetch_object($result2))
{
//Informatie van het artikel
$informatie[$i]["informatie"] = $row_detail->informatie;
//Informatie van de foto die bij het artikel hoort.
$informatie[$i]["foto"] = showfoto();

$i++;
}

Acties:
  • 0 Henk 'm!

  • WhizzCat
  • Registratie: November 2001
  • Laatst online: 15-05-2024

WhizzCat

www.lichtsignaal.nl

Volgens mij moet je dan een mime/type mee geven en dat kon wel eens alleen met $_POST werken, maar dat is onder voorbehoud. php.net en mysql.com staat hier volgens mij wel eea op.

Gezocht: netwerkbeheerder
Als je het niet aan een 6-jarige kan uitleggen, snap je er zelf ook niks van! - A. Einstein


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
WhizzCat schreef op dinsdag 05 februari 2008 @ 12:25:
Volgens mij moet je dan een mime/type mee geven en dat kon wel eens alleen met $_POST werken, maar dat is onder voorbehoud. php.net en mysql.com staat hier volgens mij wel eea op.
Probleem alleen is, is dat hij waarschijnlijk het showfoto()-gebeuren in het artikel-PHP-tje heeft staan, terwijl je voor MIME-types e.d. een losse PHP 'nodig' hebt die dan in het artikel met de <img>-tag aangeroepen wordt. Meestal. Hoewel je wel van inline images gebruik kunt maken though. :)

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
POST/GET heeft dit niets mee te maken. Een header met een Content-Type versturen staat daar los van.

Wat doet showfoto() precies?

Ik zie je wat in een while-loop doen. Je weet dat je niet zomaar echo 'Kijk een plaatje: ' . $row_detail->blob; kunt doen he?

Acties:
  • 0 Henk 'm!

  • Dante Chaos
  • Registratie: Augustus 2007
  • Laatst online: 23-05 10:40

Dante Chaos

The dude abides

Topicstarter
Ik zal even de functie erbij zetten.
function showfoto()
{
//ID selecteren iut de database.
$sql5 = "SELECT id FROM artikelen WHERE omschrijving = '$art'";

$result5 = mysql_query($sql5);
$row5 = mysql_fetch_object($result5);
$fotoid = $row5->id;
// functie aanroepen.

$foto = GetPhoto($fotoid);


header("Content-type: image/jpeg");

if ($thumbnail >= 4 && $thumbnail <= 500)
{
//Thumbnail maken en laten zien
print MaakThumbnail($foto->foto, $thumbnail);
}
else
{
//anders gewoon laten zien.
print $foto->fotoid;
}
}
Zodra ik de functie aanroep ziet hij de hele pagina als HTML en niet alleen het plaatje.

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
GlowMouse schreef op dinsdag 05 februari 2008 @ 12:28:
Je weet dat je niet zomaar echo 'Kijk een plaatje: ' . $row_detail->blob; kunt doen he?
Kan wel, maar alleen niet in IE en tot een bepaalde grootte :+

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Dante Chaos schreef op dinsdag 05 februari 2008 @ 12:24:
Nu is het punt dat ik het plaatje uit de database moet halen die als BLOB staat opgeslagen.
offtopic:
Plaatjes en andere mediainformatie moet je nooit in een database opslaan! Je database wordt er onnodig groot van met alle gevolgen van dien voor snelheid, filesize, backups en hanteerbaarheid!

Een statische filerequest naar je webserver alleen al is makkelijk tien keer zo snel als een dynamische request naar een database!


Plaatjes hebben elk hun eigen request, inclusief header. Je kan dus bij design niet zowel HTML als plaatje in 1 script outputten! Je zal voor je plaatje een apart script moeten maken wat enkel het plaatje output, met uiteraard de correctie headers (zie ook header() in de PHP manual)

//edit
Zucht, traagheid :+ En ja, er zijn inline images maar die zijn niet echt een realistische optie ;)

[ Voor 5% gewijzigd door FragFrog op 05-02-2008 12:33 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dante Chaos schreef op dinsdag 05 februari 2008 @ 12:29:
Ik zal even de functie erbij zetten.
Heb je error_reporting hoog genoeg staan? $art en $thumbnail zijn zo al twee variabelen die binnen die functie niet bestaan.
Daarnaast verwijs je weer naar een functie die de lezer hier niet kent (MaakThumbnail). Je kunt dus beter een klein stukje code maken dat je probleem weergeeft en wat voldoende is om het probleem te begrijpen. Meer dan 3/4 van wat je post is daarvoor overbodig.

[ Voor 5% gewijzigd door GlowMouse op 05-02-2008 12:38 ]


Acties:
  • 0 Henk 'm!

  • Dante Chaos
  • Registratie: Augustus 2007
  • Laatst online: 23-05 10:40

Dante Chaos

The dude abides

Topicstarter
Ja ok het is niet de beste manier maar zo kan de klant gelijk een foto uploaden. Maarja das het punt niet. Ik met iets maken zodat hij onderscheid maakt en die functie pas oproept en aleen voor een plaatje gebruikt.

De functie staat apart in photo.php en de html/php staat ook apart. php in index.php en html in index.tpl

edit:

$art is een variale die in index.php staat en hierdoor weet van wat hij moet laten zien.

[ Voor 13% gewijzigd door Dante Chaos op 05-02-2008 12:39 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dante Chaos schreef op dinsdag 05 februari 2008 @ 12:38:
Ja ok het is niet de beste manier maar zo kan de klant gelijk een foto uploaden.
Dan kun je het ook in het filesystem opslaan; tussen kunnen uploaden en opslaan in een database zit geen enkel verband.
$art is een variale die in index.php staat en hierdoor weet van wat hij moet laten zien.
Zoek eens op scoping in de php manual. Maar hier had je door eenvoudig debuggen ook al achter kunnen komen door af en toe halverwege je script wat te echo'en en te kijken of een variabele echt de naam heeft die je verwacht. Dit zal niet de laatste keer zijn dat je dat nodig hebt om een fout op te sporen, dus dat kun je niet vroeg genoeg leren door zelf te doen ;)

Acties:
  • 0 Henk 'm!

  • Dante Chaos
  • Registratie: Augustus 2007
  • Laatst online: 23-05 10:40

Dante Chaos

The dude abides

Topicstarter
de variable kloppen wel. Wat mijn probleem is dat ik de HTML niet gescheiden krijg van het plaatje. in de code staat het apart in verschillende .php bestanden maar ik krijg het niet in de browser apart dat hij alleen een bepaald stukje code als image ziet binnen de functie.

Acties:
  • 0 Henk 'm!

Verwijderd

Word je DB daar niet retetraag van? En is het niet makkelijker, om de plaatjes te uploaden naar een map, en de bestandsnaam / pad in de DB te zetten, en die later weer uit te lezen als de src="" voor je plaatje?

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Dante Chaos schreef op dinsdag 05 februari 2008 @ 13:25:
de variable kloppen wel. Wat mijn probleem is dat ik de HTML niet gescheiden krijg van het plaatje. in de code staat het apart in verschillende .php bestanden maar ik krijg het niet in de browser apart dat hij alleen een bepaald stukje code als image ziet binnen de functie.
Omdat dat, afgezien van een hack die alleen in een paar browsers werkt, helemaal niet kan! Hoeveel nut heeft het hier vragen te stellen als je niet leest wat mensen antwoorden?

Wat je wel kan doen is iets dergelijks:
HTML:
1
<img src='/scripts/plaatje.php?plaatjeId=12312'>


PHP:
1
2
3
4
$plaatjeId = (int) $_GET['plaatjeId'];
header("Content type: image/jpeg");
[retrieve plaatje from DB]
echo $plaatje;


Maar dit wordt, zoals gezegd, traag. Als je plaatjes simpelweg opslaat in je filesystem kun je daar direct heen linken, dat scheelt je en dit gezeur met headers en later problemen met je database.

[ Voor 3% gewijzigd door FragFrog op 05-02-2008 13:41 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
FragFrog schreef op dinsdag 05 februari 2008 @ 13:39:
Als je plaatjes simpelweg opslaat in je filesystem kun je daar direct heen linken, dat scheelt je en dit gezeur met headers en later problemen met je database.
Plus 't voordeel dat webservers dan over 't algemeen meteen de correcte headers meesturen qua caching. Een PHP-scriptje zal over 't algemeen niet cachebaar zijn, tenzij je 'handmatig' wat extra headers meestuurt.

Acties:
  • 0 Henk 'm!

  • Dante Chaos
  • Registratie: Augustus 2007
  • Laatst online: 23-05 10:40

Dante Chaos

The dude abides

Topicstarter
Mijn fout. ik denk dat ik het verkeerd geformuleerd heb.

Mijn punt was dat ik via een $_GET een id van een plaatje krijg als ik op een link klik die dan naar een een stuk code leid op een andere pagina die daarna de gegevens uit de database haalt en laat zien.

Maar dus inplaats van het plaatje te laten zien krijg ik de link (waar het &id=23 in zit) krijg te zien.

Ik heb dus voor elkaar dat als er een plaatje moet geshowed moet worden dat hij alleen het plaatje hoort te laten zien die hij ophaalt door het ID wat in de $_GET staat te gebruiken. Maar dan laat hij de link zien inplaats het plaatje

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$artid = $_GET['id'];
global $artid;
global $art;
global $cat;
//kijken of de pagina geen plaatje is
if(isset($artid))
{
    $sql5 = "SELECT id FROM artikelen WHERE omschrijving = '$art'";
        $result5 = mysql_query($sql5);
        $row5 = mysql_fetch_object($result5);
        $fotoid = $row5->id;
    if($fotoid == $artid)
    {[s][/s]
        $informatie[$i]["foto"] = showfoto($fotoid);
    }
}

Dit stukje checkt of er geen plaatje is.
Dit stukje maakt de link
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// De Artikelen ophalen
$sql1 = "SELECT id, omschrijving FROM artikelen WHERE categorie = '$cat' ORDER BY omschrijving";
$result1 = mysql_query($sql1);
//Hier controleren of er wel een catergorie is aangegeven.
if(isset($cat))
{
    while($row_art = mysql_fetch_object($result1))
    {
        $artikelen[$i]["artikel"] = $row_art->omschrijving;
        $artikelen[$i]["artikellink"] = urlencode($row_art->omschrijving);
        $artikelen[$i]["artikelid"] = $row_art->id;
        $i++;
    }

}

Deze geneert links die naar artikelen leiden
die dus op een .tpl pagina een link maakt waar dus het artikel+id uitkomen

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
Dante Chaos schreef op dinsdag 05 februari 2008 @ 14:38:
Maar dus inplaats van het plaatje te laten zien krijg ik de link (waar het &id=23 in zit) krijg te zien.
PHP:
1
2
        print_r($artid);
        die();
Lijkt me logisch als je een print_r doet en daarna een die;? :?

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Dante Chaos
  • Registratie: Augustus 2007
  • Laatst online: 23-05 10:40

Dante Chaos

The dude abides

Topicstarter
whoops ben die vergeten uit deze code te halen >_< mijn fout als je die eruitlaat bedoel ik.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 22:47
PHP:
1
  print $foto->fotoid;
Tenzij je de BLOB als fotoId opslaat lijkt het me dan hier mis te gaan in je showfoto functie, maar dit valt allemaal prima onder basic troubleshooting - wat je zelf hoort te doen voordat je hier een topic opent.

We zien nog steeds niet alle relevante stukken code (wat returned maakThumbnail() bijvoorbeeld?) of waar het nu mis gaat. Dan kunnen we wel door lappen code gaan zoeken naar de fout, maar dat zul je toch echt eerst zelf moeten doen. Wat wordt er nu uiteindelijk naar de browser verstuurt, waar wordt dat verstuurt, en in hoeverre is dit anders dan je zou willen?

Als je op die vragen antwoord kan geven en je hebt nog steeds een probleem wordt het pas voor ons mogelijk je te helpen, eerder niet.

[ Voor 47% gewijzigd door FragFrog op 05-02-2008 16:03 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Ik heb deze reactie nu meerdere malen gelezen maar ik snap werkelijk waar geen kont van je verhaal.

Wil je niet gewoon het volgende:

PHP:
1
2
3
4
5
//file: images.php
function showfoto(id)
{
 .. // doe dingen
}

en
PHP:
1
2
3
4
5
6
//file: artikelen.php
if(idtype=='afbeelding') {
echo "<img src=\"images.php?id=1\">" // roep hier dus images.php met een GET parameter aan
} else {
// doe meuk om de rest te tonen
}

[ Voor 5% gewijzigd door TeeDee op 05-02-2008 16:03 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dante Chaos schreef op dinsdag 05 februari 2008 @ 14:38:
Mijn fout. ik denk dat ik het verkeerd geformuleerd heb.

Mijn punt was dat ik via een $_GET een id van een plaatje krijg als ik op een link klik die dan naar een een stuk code leid op een andere pagina die daarna de gegevens uit de database haalt en laat zien.
In dat geval zit er een fout in je code. Als je de Content-Type header niet meestuurt, kan je browser hem tonen.

Acties:
  • 0 Henk 'm!

  • Dante Chaos
  • Registratie: Augustus 2007
  • Laatst online: 23-05 10:40

Dante Chaos

The dude abides

Topicstarter
Heb het opgelost. Het werkt nu uitstekend.

Heb de index.php gesplit in 2 delen. de HTML en foto. dus als hij een foto nodig heeft vraagt de template zoals dit

foto.php?fotoid=$variable

We gebruiken een eigen template system zodat we deze code moeten gebruiken <% INSVAR blalba %> (voorbeeld)

Heb de code toen nagelopen en het bleek gewoon omdat ik het aanroepte in Index.php dat tie HTML als een plaatje deed en dus niet apart. Heel stom.

In iedergeval bedankt voor jullie hulp.
Pagina: 1