2009-09-16 4 views
2

Je stocke des bannières publicitaires dans une table mysql ou je devrais juste dire le nom du fichier, par exemple: 'imagename.jpg' ou 'banner3.gif'.Comment script un fichier php pour afficher une image comme <img src="/img.php?imageID=32" />?

Il est évident que je suis désireux de suivre lorsque ces bannières sont chargés donc je pense créer un fichier php appelé img.php et l'appeler comme si

<img src="/img/img.php?imageID=3" /> 

Et que retirerait l'image avec la id 3 avec la mise à jour de ma table de hits, etc.

Je sais comment mettre à jour ma table de hits ... mais ce que j'essaie de faire, c'est comment coder le fichier img.php pour qu'il récupère simplement le fichier nommez-le et imprimez-le à l'écran afin qu'il fonctionne comme une image régulière.

Jusqu'à présent, j'ai ...

<?php 
header("Content-Type: image/jpeg"); 
// insert my db connect file 
// update the hits table etc 

$sql = 'SELECT * FROM ads WHERE id="' . $_GET['imageID'] . '" '; 
$res = mysql_query($sql); 

$row = mysql_fetch_array($res); 

$image = '/img/' . $row['file']; 

imagejpeg($image); 

// and this is where I'm at... 

?> 

J'ai quelques problèmes avec le code ci-dessus que j'ai extrait de divers endroits pour y arriver. Les images pourraient être png/gif/jpg alors que le type de contenu de l'en-tête ne semble avoir qu'un espace pour un type.

Existe-t-il un moyen de faire fonctionner ce fichier pour plusieurs types d'images? Je pense que je devrais d'abord interroger la table, travailler sur l'extension de fichier, puis insérer la fonction d'en-tête basée sur cela.

Mais qu'est-ce que je fais réellement quand j'ai raison et que je veux juste que l'image apparaisse?

grâce à votre aide est ici le fichier de travail final

<?php 

// make sure we're only getting a number for the query b4 doing stuff 
if(is_numeric($_GET['imid'])) { 

include('thedbfile.php'); 

$types['jpg'] = 'image/jpeg'; 
$types['png'] = 'image/png'; 
$types['gif'] = 'image/gif'; 



$sql = 'SELECT file FROM ads WHERE id="' . $_GET['imid'] . '" '; 
$res = mysql_query($sql); 

$row = mysql_fetch_array($res); 

$image = 'img/banners/' . $row['file']; 

$extension = end(explode('.', $row['file'])); 


header('Content-Type: ' . $types[$extension]); 

echo file_get_contents($image); 


} 

?> 
+2

Vous devez lire l'injection de code, en particulier les injections SQL! – Gumbo

+0

je vais, merci gumbo ... – willdanceforfun

+0

farout ... donc avec mon sql ci-dessus quelqu'un pourrait charger ce fichier avec comme /img.php?imid=1'Drop table 'etc etc ??????? ce que le – willdanceforfun

Répondre

2

Vous pouvez stocker le contenu d'image directement votre base de données.

Comme vous l'avez dit, vous devez analyser le type de contenu en dehors du nom de fichier. Vous pouvez également ajouter un champ à votre base de données qui contient l'extension.

$extension = end(explode('.', $row['file'])); 

Ensuite, vous devez créer un tableau qui contient le type de contenu en-tête:

$types['jpg'] = 'image/jpeg'; 
$types['png'] = 'image/png'; 

puis envoyer l'en-tête (vous voulez vérifier si les types tableau contient la extension de clé et erreur si elle ne)

header('Content-Type: ' . $types[$extension]); 

chargez ensuite votre image avec

echo file_get_contents($image); 

Cela devrait le faire. Notez que vous devez vraiment vérifier si le paramètre ImageID est un entier, pour des raisons de sécurité:

if(!ctype_digit($_GET['ImageID'])) // error 
2
echo file_get_contents($image); 

Mais je doute vos images sont en fait dans /img/ (haut niveau de la hiérarchie du système de fichiers). Et oui, la mise en place Content-type après que vous savez quel type votre image sonne bien.

P.S. vous avez étendu votre code un peu et je n'ai aucune idée de ce que imagejpeg($image) fait ;-)

+0

merci pour cela ... vous aviez raison sur le dossier img chose! Bravo – willdanceforfun

2

vous pouvez essayer un header('Location: <URL-TO-IMAGE>'); après que vous avez fini avec l'image. Sinon, vous pouvez détecter l'extension à partir du nom de fichier, puis renvoyer le type MIME approprié. En ce qui concerne le type mime multiple, il n'y a pas de type mime multiple. Seul le dernier type de contenu sera envoyé.

voir:

<?php 
header('Content-Type: image/jpeg'); 
header('Content-Type: image/png'); 
header('Content-Type: image/gif'); 
?> 

Le type de contenu est l'image/gif.

+0

Pourquoi auriez-vous besoin d'une instruction 'break' après un' return'? –

+0

juste ma pratique habituelle. cas: rupture; – mauris

2

Quelque chose comme ceci vous permettra de livrer correctement l'image et vous assurer qu'il ne soit pas mise en mémoire cache de sorte qu'un rechargement de la page déclenchera une nouvelle d'extraction ...

//tell client abou tcontent type 
header("Content-Type:image/jpeg"); 

//prevent caching 
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified 
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header ("Pragma: no-cache");       // HTTP/1.0 

//how big is it? 
header("Content-Length:".filesize($image)); 

//send image data 
readfile($image); 
+0

c'est génial. ajouts super cool !! – willdanceforfun

+0

quoi de mieux readfile() ou file_get_contents()? * head to php.net * – willdanceforfun

+0

Pour vos besoins, readfile est meilleur car il effectuera une lecture/écriture tamponnée dans le beurre de sortie. file_get_contents lira d'abord le fichier entier dans une chaîne, puis vous devrez le renvoyer. –

1

En fin de compte, il vous suffit de tourner les données d'image dans le corps de votre message, ainsi que le droit Hearder . Mon code ressemble à:

header("Content-type: $mime"); 
echo $this->mBinaryJunk; 

Vous devez définir le type $ mime correctement en fonction du type réel de l'image. Vous pouvez le faire en le stockant lorsque vous trouvez le fichier original ou en le détectant à partir du nom du fichier.

Questions connexes