Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
bioshock

Visualizar imagens MySQL [Resolvido]

Recommended Posts

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.

Share this post


Link to post
Share on other 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".

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
bioshock

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites
bioshock

Yoda, apenas me faltava especificar a imagem associada a cada ID, ou seja: "$row['imagem']". Obrigado.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.