Bem... a resposta de por que ele fará o que você descreveu é por causa do uso da função header(). Em PHP, você não pode imprimir nada antes de uma chamada de cabeçalho, pois isso direciona o servidor web para preparar um cabeçalho de conteúdo. Normalmente, eles substituem completamente todo o conteúdo.
Em segundo lugar, gostaria de mencionar que armazenar imagens em um banco de dados geralmente é uma má ideia por dois motivos.
- Tem um impacto significativo no desempenho e na renderização.
- Você precisa escrever o código para renderizar os dados do blob em vez de apenas exibir a própria imagem.
O método preferido para a apresentação de imagens orientada por banco de dados seria que você tivesse as imagens armazenadas em um diretório e seus nomes de arquivo armazenados no banco de dados. Agora, quando você deseja exibir as imagens, basta pesquisar no banco de dados quais nomes de arquivo deseja exibir e, em seguida, simplesmente incluir o nome do arquivo em um atributo HTML.
A execução é muito mais rápida também.
Além disso, gostaria de salientar que, se você deseja que um script realmente faça sua renderização, deseja que esse script defina seu cabeçalho e, em seguida, ecoe ou imprima o blob de imagem depois de definir o cabeçalho.
Por favor, note que quando você cria sua tag html...que no atributo src, você faria algo mais parecido com isto;
<img src="image.php?id=<some_number>">
Agora, seu arquivo image.php irá cuspir os dados da imagem na tag.