Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Visualizar imagens MySQL [Resolvido]

Mensagens Recomendadas

bioshock

Tentei adaptar este exemplo ao meu site, http://forum.codecall.net/php-tutorials/7663-tutorial-storing-images-mysql-php-part-ii-display-your-images.html, mas sem sucesso.

O meu código ficou algo do género:

<?php

$username = "root";
$password = "";
$host = "localhost";
$database = "teste2";

@mysql_connect($host, $username, $password) or die("Can not connect to database: ".mysql_error());

@mysql_select_db($database) or die("Can not select the database: ".mysql_error());

$id = $_GET['id'];

if(!isset($id) || empty($id)){
die("Please select your image!");
}else{

$query = mysql_query("SELECT imagem FROM produtos WHERE id='".$id."'");
$row = mysql_fetch_array($query);
$content = $row['imagem'];

header('Content-type: image/jpg');
echo $content;

}

?>

Contudo ele não me mostra imagem alguma. Eu acho que pode ser pelo facto de eu não ter o processo de ir buscar à Pasta imagens a imagem relacionada com o ID.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Eu não quero guardar o link de uma imagem na bd. Eu estou a guardar o nome do ficheiro da imagem na base de dados e a guardar as imagens numa pasta.

O que eu quero é: Quando clicar por exemplo em "Visualizar" ele mostrar-me a imagem associada ao id em que cliquei "Visualizar".

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

<?php
include ("connection.inc");
$id = $_GET['id'];
$image = mysql_query("SELECT imagem FROM produtos WHERE id='".$id."'");
$imageResult = mysql_fetch_array($image);
header("Content-type: image/jpg");
echo $imageResult['imagem'];
?>

Este simpls código, apenas não mostra a imagem porque eu não guardo as imagens na base de dados, eu guardo as imagens numa pasta. Apenas e só gravo na bd o nome das imagens.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Pois, foi o que o yoda.pt disse, para usares o exemplo acima tinhas de ter um BLOB da imagem na BD, e não o caminho para ela.

Para ires buscá-la e apresentá-la pelo id, tens que a abrir do sítio onde está e cuspi-la cá para fora com, por exemplo, o readfile.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Mas então qual a melhor maneira? Guardar o link da imagem na BD ou como estou a fazer?

E como é que estás a fazer? Ainda não sabemos... O que é que tens guardado no campo imagem da BD?


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Tenho um campo na BD chamado imagem - Varchar(25)

E possuo o seguinte código para upload e inserção da imagem na BD.

<?php 
//This is the directory where images will be saved
$target = "c:/wamp/www/Produtos/images/";
$target = $target . basename( $_FILES['imagem']['name']);
if($_FILES['imagem']['size'] > 1000000 )
{
die ("error");
}
if(!getimagesize($_FILES['imagem']['tmp_name'])){ 
echo "<script>alert('Escolha um ficheiro do tipo imagem'); window.location=\"registoprodutos2.php\"</script>";
exit();
}

list($width, $height, $attr) = getimagesize($_FILES['image']['name']);
if ($width > 100 || $height > 100)
{
echo "Epaaa, tá grande";
exit();
}

//This gets all the other information from the form
$nome=$_POST['nome'];
$descricao=$_POST['descricao'];
$referencia=$_POST['referencia'];
$preco=$_POST['preco'];
$promocao=$_POST['promocao'];
$pic=($_FILES['imagem']['name']);
$categoria=$_POST['categoria'];

// Connects to your Database
mysql_connect("localhost", "root", "") or die(mysql_error()) ;
mysql_select_db("teste2") or die(mysql_error()) ;


// If the button of form is clicked then we will insert all the stuff in our DataBase
if (isset($_POST['upload'])) {
// Here we verify that requireds textfields aren't emptys
if (empty($_POST['nome']) || empty($_POST['descricao']) || empty($_POST['preco']) || empty($_POST['promocao']) || empty($_POST['referencia']) || empty($_FILES['imagem'])) {

// If they're empty, then we put a message to alert the user	
	echo "<script>alert('Por favor preencha todos os campos obrigatórios(*)'); window.location=\"registoprodutos2.php\"</script>";

				// Verifying if exists user or not
	 }else{
$nome2 = $_POST['nome'];
$userCheck = mysql_query("SELECT nome FROM produtos WHERE nome='$nome2'");
if(mysql_num_rows($userCheck) !== 0) {
echo "<script>alert('Já existe o nome desse produto, por favor escolha outro!'); window.location=\"registoprodutos2.php\"</script>";
}else{
//Writes the information to the database
mysql_query("INSERT INTO produtos (nome, descricao, referencia, preco, promocao, imagem, categoria)
VALUES ('$nome', '$descricao', '$referencia', '$preco', '$promocao', '$pic', '$categoria')") ;}
echo "<script>alert('Registado com sucesso!'); window.location=\"registoprodutos2.php\"</script>";
//Writes the photo to the server
if(move_uploaded_file($_FILES['imagem']['tmp_name'], $target)){

//Tells you if its all ok
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded, and your information has been added to the directory";

}
else {

//Gives and error if its not
echo "Sorry, there was a problem uploading your file.";
}
	 }
}

?>

Na base de dados, apenas me guarda o nome do ficheiro, por ex: "Vinho". A imagem, é guardada numa pasta.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Pronto, para a mostrar é só fazeres o readfile do ficheiro e fica a bombar.

Guardar a imagem fisicamente ou um BLOB é coisa para uma discussão alargada... Pessoalmente, prefiro usar ficheiros físicos bem arrumados, dentro de pastas devidamente protegidas com htaccess, e ter os caminhos na BD, mas não vejo grandes impedimentos à outra solução; como em tudo na vida, tem vantagens e desvantagens.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Em relação ao link que me deste:

Eu tenho que fazer, no topo do meu código, um readfile, correcto?

int readfile(filename, use_include_path);

Onde o include path é o directório das imagens, mas e o filename? É o id que está atribuido às imagens?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Em relação ao link que me deste:

Eu tenho que fazer, no topo do meu código, um readfile, correcto?

int readfile(filename, use_include_path);

Onde o include path é o directório das imagens, mas e o filename? É o id que está atribuido às imagens?

Não é no topo, é no fundo, depois dos headers. O filename é o file... name...  :smoke: Vá lá, bioshock, pensa um 'cadito...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

$content = readfile($row['imagem'], aqui é o path);
echo $content;

Mas em relação ao path, já experimentei por o caminho e nada. Também pensei que fosse uma class e ele fosse buscar sozinho o directório.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

$content = readfile($row['imagem'], aqui é o path);
echo $content;

Mas em relação ao path, já experimentei por o caminho e nada. Também pensei que fosse uma class e ele fosse buscar sozinho o directório.

Olha, não sabes inglês? Se não sabes, tudo bem, ninguém é obrigado, se bem que neste profissão é conveniente. Se sabes, não estás a ler a documentação em condições.

O segundo parâmetro não é o path, ok? Aliás, o segundo parâmetro até é opcional e sugiro que o deixes sossegado.

No primeiro parâmetro tens que passar o caminho para o ficheiro, seja relativo ou absoluto. Depois, não precisas de guardar, e muito menos mostrar, o output dessa função, que é apenas um número de bytes lido, visto que a própria função faz o output directo.

Está lá tudo na documentação.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

No primeiro parâmetro tens que passar o caminho para o ficheiro, seja relativo ou absoluto. Depois, não precisas de guardar, e muito menos mostrar, o output dessa função, que é apenas um número de bytes lido, visto que a própria função faz o output directo.

Está lá tudo na documentação.

Ora bem, tu dizes que no primeiro parâmetro temos que passar o caminho para o ficheiro, ou seja, dizer-lhe qual a direcção que o mesmo tem que tomar para ir buscar a imagem, logo fiz o seguinte, depois do header:

readfile("http://localhost/produtos/images");

Depois disseste que não era preciso eu fazer o output, ou seja, era escusado eu ter o "echo Variavel", porque a própria class readfile já fazia isso.

Também foi desatenção minha e não reparei que dizia "Optional" no includePath, feito isto, continuo a não conseguir visualizar a imagem e fiquei com o seguinte código:

$query = mysql_query("SELECT imagem FROM produtos WHERE id='".$id."'");
$row = mysql_fetch_array($query);
header('Content-type: image/jpg');
readfile("http://localhost/produtos/images");
//echo $content;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

readfile("http://localhost/produtos/images/".$row['imagem']);

Já está a funcar, pensei que também fosse precisar da função fopen, mas afinal não.

Obrigado mjamado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

bioshock (e toda a gente que não compreende esta distinção): caminho (ou path) != URL


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
yoda

@bioshock,

repara numa coisa : estás a usar um ficheiro php à parte para abrir uma imagem, onde nada mais fazes que fazer uma query ao mysql e apresentar uma imagem que até aparentemente está acessível por http. Agora pensa um bocado : se isso se refere a produtos, não ficará mais "barato" para ti e para o servidor sacares a informação das imagens associadas aos produtos na mesma query onde sacas a informação de cada produto?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Mjamado, pensava que não. Pensava que era o directório.

Yoda, correcto. Já tinha pensado nessa solução e vou tentar implementa-la. Contudo, surgiu-me agora um problema que não sei de onde veio. Eu consigo ver a imagem do ID 1, mas não consigo ver de mais nenhum registo.

Vou tentar 1º aplicar o que disseste, creio que deva fazer numa "imageField" e já posto algum feedback.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Pronto, feito. Agora só preciso de pesquisar sobre redimensionamento, para por as imagens como thumbnails, senão aparecem-me tamanhos enormes.

Aqui fica o código:

echo "<th <input type='image' name='imageField' id='imageField' src='images/$imagem'></th>"

Obrigado a ambos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Bem, eu pensei em algumas alternativas, que são:

- O utilizador faz o upload e automaticamente faz o redimensionamento da imagem e apenas e só guarda essa imagem redimensionada;

- O utilizador faz o upload e automaticamente faz o redimensionamento mas também guarda a imagem original, cada uma em pastas separadas;

- O utilizador é obrigado a preencher os requisitos do upload da imagem; Ex: 150px 150px

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Já saí da empresa, mas já consegui algo hoje. Já consegui com que ele redimensionasse para 150px por 150px. Contudo, e não sei porque, não aparecia a imagem..o thumbnail que criava ficava todo preto. Amanhã vejo melhor e dou algum feedback, obrigado!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.