C'est parce que votre navigateur ne se rend pas compte que les données que vous renvoyez sont une image. Lorsque votre serveur Web répond à une requête, il spécifie le type de contenu dont il s'agit (d'où l'en-tête Content-Type), et votre page est spécifiée sous forme de texte. C'est pourquoi les balises d'image sont utilisées :elles vous permettent de dire "intégrez cette autre ressource à cet emplacement". Ce que fait votre code est de vider les données binaires de l'image sous forme de texte sur l'écran - pas ce que vous voulez.
Ce que vous devez faire est de créer une autre page PHP, telle que getImage.php, qui accepte un paramètre $_GET (c'est-à-dire un identifiant de ligne). Cette page interrogera ensuite la base de données et echo
les données d'image, en spécifiant l'en-tête Content-Type.
Voici un code de preuve de concept que j'ai écrit sans test et qui ne gère pas l'injection SQL, ou un certain nombre d'autres problèmes potentiels.
header('Content-Type: image/png'); //change to the proper content type for your type of image
$imageID = mysql_real_escape_string($_GET['q']);
$result = mysql_query(sprintf('SELECT file_data FROM images2 WHERE id="%s" AND file_data IS NOT NULL LIMIT 1', $_GET['q']));
if(mysql_num_rows($result) !== 1)
{
//a row wasn't found, so 404
header('HTTP/1.0 404 File Not Found');
}
else
{
$row = mysql_fetch_object($result);
echo $row['file_data'];
}
Maintenant, lorsque vous créez votre code HTML dans votre fichier existant, vous feriez quelque chose comme ceci :
echo '<td class="sitename2"><img src="./getImage.php?q='.$row["id"].'"/></td>';
Ajustez vos noms de colonnes SQL en conséquence.
Bravo.