É porque seu navegador não percebe que os dados que você está enviando de volta são uma imagem. Quando seu servidor da web responde a uma solicitação, ele especifica o tipo de conteúdo (daí o cabeçalho Content-Type) e sua página está sendo especificada como texto. É por isso que as tags de imagem são usadas:elas dão a você a chance de dizer "incorpore este outro recurso neste local". O que seu código faz é despejar os dados binários da imagem como texto na tela - não o que você deseja.
O que você precisa fazer é criar outra página PHP, como getImage.php, que aceite um parâmetro $_GET (ou seja, um id de linha). Essa página irá então consultar o banco de dados e
echo
os dados da imagem, especificando o cabeçalho Content-Type. Aqui está um código de prova de conceito que escrevi sem testar e que não lida com injeção de SQL ou vários outros problemas potenciais.
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'];
}
Agora, quando você está construindo seu HTML em seu arquivo existente, você faria algo assim:
echo '<td class="sitename2"><img src="./getImage.php?q='.$row["id"].'"/></td>';
Ajustando seus nomes de coluna SQL de acordo.
Felicidades.