Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Daniel de Souza

[Resolvido] Album de fotos com PHP e My SQL

Recommended Posts

Oi boa noite, tenho aqui um arquivo que recebe dados de um formulário, faz upload deles e envia os dados para um banco de dados, mas minha dúvida é a seguinte, ai nesse código a variável "$arquivo" é na verdade um array, já que "$_FILES["foto"]" é um array, no caso com várias imagens, sei que para aplicar esse código a cada valor do array de uma forma que ele grave corretamento os dados no banco de dados preciso de fazer modificações no código e acima de tudo colocar um campo com repetição, desconfio que é FOREACH, mas depois de um longo tempo quebrando a cabeça não me vem uma luz de onde colocar esse campo de repetição e de como fazer esses modificações, e acima de tudo, já que o upload funciona direitinho, como colocar esses dados no banco de dados de forma correta, gostaria que para cada valor do array se adiciona-se uma nova coluna, mas que para todas essas colunas os valores das variáveis '$nome' e '$descricao' continuassem iguais visto que esses dados são únicos e não são arrays. Expliquei bem?

Segue abaixo o código que recebe os dados do formulário:

 

<?php

If ($_SESSION['valor'] != ''){

$nome = $_POST["nome"];
$descricao = $_POST["descricao"];
$arquivo = isset($_FILES["foto"]) ? $_FILES["foto"] : FALSE;


#Configurando o tamanho da imagem a ser recebida
$config = array();
// Tamano máximo da imagem, em bytes
$config["tamanho"] = 10000000000;
// Largura Máxima, em pixels
$config["largura"] = 10000;
// Altura Máxima, em pixels
$config["altura"] = 10000;
// Diretório onde a imagem será salva
$config["diretorio"] = "imagens/";

#Gera um único nome para cada imagem

function nome($extensao)
{
   global $config;

   // Gera um nome único para a imagem
   $temp = substr(md5(uniqid(time())), 0, 10);
   $imagem_nome = $temp . "." . $extensao;

   // Verifica se o arquivo já existe, caso positivo, chama essa função novamente
   if(file_exists($config["diretorio"] . $imagem_nome))
   {
       $imagem_nome = nome($extensao);
   }

   return $imagem_nome;
}



if($arquivo)
{
$erro = array();

   // Verifica o mime-type do arquivo para ver se é de imagem.
   // Caso fosse verificar a extensão do nome de arquivo, o código deveria ser:
   //
   // if(!eregi("\.(jpg|jpeg|bmp|gif|png){1}$", $arquivo["name"])) {
   //      $erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo"; }
   //
   // Mas, o que ocorre é que alguns usuários mal-intencionados, podem pegar um vírus .exe e simplesmente mudar a extensão
   // para alguma das imagens e enviar. Então, não adiantaria em nada verificar a extensão do nome do arquivo.
   if(!eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $arquivo["type"]))
   {
       $erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
   }
   else
   {
       // Verifica tamanho do arquivo
       if($arquivo["size"] > $config["tamanho"])
       {
           $erro[] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";
       }

       // Para verificar as dimensões da imagem
       $tamanhos = getimagesize($arquivo["tmp_name"]);

       // Verifica largura
       if($tamanhos[0] > $config["largura"])
       {
           $erro[] = "Largura da imagem não deve ultrapassar " . $config["largura"] . " pixels";
       }

       // Verifica altura
       if($tamanhos[1] > $config["altura"])
       {
           $erro[] = "Altura da imagem não deve ultrapassar " . $config["altura"] . " pixels";
       }

}

   if(!sizeof($erro))
   {
	 // Pega extensão do arquivo, o indice 1 do array conterá a extensão
       preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $arquivo["name"], $ext);

       // Gera nome único para a imagem
       $imagem_nome = nome($ext[1]);

       // Caminho de onde a imagem ficará
       $imagem_dir = $config["diretorio"] . $imagem_nome;

       // Faz o upload da imagem
       move_uploaded_file($arquivo["tmp_name"], $imagem_dir);

	//adiciona o nome da imagem no banco de dados, deleta e reinsere um novo

	// Manipulamos as variáveis para evitar problemas com aspas e outros caracteres protegidos do MySQL


      $imagem_nome = mysql_escape_string($imagem_nome);

      // Montamos a consulta SQL

  $query =  "INSERT INTO `album` SET `nome` =  '".$nome."', `descricao` = '".$descricao."', imagem = '".$imagem_dir."' " ;


      // Executa a query

       $inserir = mysql_query($query);


        if ($inserir) {

        echo "Imagem inserida com sucesso!";

        } else {

        echo "Não foi possível inserir a sua imagem, tente novamente.";

         // Exibe dados sobre o erro:

        echo "<br />Dados sobre o erro:" . mysql_error();



}
}
}
}
?>

 

A relação entre o formulário e o arquivo acima que recebe os dados dele está ótima,só não consigo trabalhar com esse array de imagens... Aguardo um help ai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode ser algo parecido com isso aqui amigo:

 

foreach( $arquivo['name'] AS $foto ){
  //faz a rotina aqui
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei com for e foreach, o que acontece, voi listar os problemas:

 

1- Ele acusa erro na parte que verifica a extensão do arquivo, acho que é pq $_FILES["foto"] é um array e a verificação de erros está lendo o array inteiro ao invés de ver valor por valor.

 

2- Quando eu retiro a condição de não haver erros para que os dados recebam o nome único, a extensão, e para que seja feito o upload e sejam gravados no BD, primeiramente acusa um erro no preg_match que verifica a extensão do arquivo, isso porque o preg_match pede uma string e não um array como variável, então oque eu fiz para corrigir, mudei essa parte do código usando um implode assim:

 

$nome_foto = implode(',', $arquivo["name"]);
	 // Pega extensão do arquivo, o indice 1 do array conterá a extensão
       preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $nome_foto, $ext);

 

3- Ai acontece o terceiro erro, os dados são gravados no bd corretamente mas de apenas uma imagem, apenas uma linha.

 

4- O que indica que o campo de repetição não funciona...

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem q trocar os:

 

$arquivo["name"]

q estiverem dentro do foreach por:

$foto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei, mas olha só como $arquivo = $_FILES["foto"], ele recebeu todas as partes de $_FILES, eu estou utilizando aqui nessa codificação: $arquivo["tmp_name"], $arquivo["type"] e o $arquivo["name"], quando eu uso: foreach( $arquivo AS $foto ), a repetição não funciona...

Compartilhar este post


Link para o post
Compartilhar em outros sites

então você vai ter q usar um for() no lugar do foreach()

 

e ai usar o indice numérico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como ficou o código, ele continua apontando os erros de arquivo em formato inválido, e no banco de dados ele só cadastra uma linha, caso eu envie 2 ou mais imagens ele aponta esse erro:

"Fatal error: Cannot redeclare nome() (previously declared in /home/esquilohar1/ideiaconceito/public_html/acesso/sistema_albuns/foto.php:32) in /home/esquilohar1/ideiaconceito/public_html/acesso/sistema_albuns/foto.php on line 32"

 

 

<?php

if($_SESSION['nome'] != ''){

if(isset($_POST["btvalidar"])){

$arquivo = array();
$arquivo = isset($_FILES["foto"]) ? $_FILES["foto"] : FALSE;

$galeria = array();
$galeria = $_POST["galeria"];

$descricao = array();
$descricao = $_POST["descricao"];

foreach( $arquivo['name'] AS $foto ){


#Configurando o tamanho da imagem a ser recebida
$config = array();
// Tamano máximo da imagem, em bytes
$config["tamanho"] = 10000000000;
// Largura Máxima, em pixels
$config["largura"] = 10000;
// Altura Máxima, em pixels
$config["altura"] = 10000;
// Diretório onde a imagem será salva
$config["diretorio"] = "imagens/";

#Gera um único nome para cada imagem

function nome($extensao)
{
   global $config;

   // Gera um nome único para a imagem
   $temp = substr(md5((time())), 0, 10);
$imagem_nome = $temp . "." . $extensao;

   // Verifica se o arquivo já existe, caso positivo, chama essa função novamente
   if(file_exists($config["diretorio"] . $imagem_nome))
   {
       $imagem_nome = nome($extensao);
   }

   return $imagem_nome;
}



$erro = array();

   // Verifica o mime-type do arquivo para ver se é de imagem.
   // Caso fosse verificar a extensão do nome de arquivo, o código deveria ser:
   //
   // if(!eregi("\.(jpg|jpeg|bmp|gif|png){1}$", $arquivo["name"])) {
   //      $erro[] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo"; }
   //
   // Mas, o que ocorre é que alguns usuários mal-intencionados, podem pegar um vírus .exe e simplesmente mudar a extensão
   // para alguma das imagens e enviar. Então, não adiantaria em nada verificar a extensão do nome do arquivo.
   if(!eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", ($foto["type"])))
   {
       $erro[4] = "Arquivo em formato inválido! A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
   }
   else
   {


       // Verifica tamanho do arquivo
       if(($arquivo["size"]) > $config["tamanho"])
       {
           $erro[3] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";
       }

       // Para verificar as dimensões da imagem
       $tamanhos = getimagesize($foto["tmp_name"]);

       // Verifica largura
       if($tamanhos[0] > $config["largura"])
       {
           $erro[5] = "Largura da imagem não deve ultrapassar " . $config["largura"] . " pixels";
       }

       // Verifica altura
       if($tamanhos[1] > $config["altura"])
       {
           $erro[6] = "Altura da imagem não deve ultrapassar " . $config["altura"] . " pixels";
       }
}

 if($erro != '0')
   {
	 // Pega extensão do arquivo, o indice 1 do array conterá a extensão
       preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $foto, $ext);

       // Gera nome único para a imagem
	 $imagem_nome = nome($ext[1]);

       // Caminho de onde a imagem ficará
       $imagem_dir = $config["diretorio"] . $imagem_nome;

       // Faz o upload da imagem
       move_uploaded_file($foto["tmp_name"], $imagem_dir);

	//adiciona o nome da imagem no banco de dados, deleta e reinsere um novo

	// Manipulamos as variáveis para evitar problemas com aspas e outros caracteres protegidos do MySQL


      $imagem_nome = mysql_escape_string($imagem_nome);


      // Montamos a consulta SQL

  mysql_select_db($database_ideiaconceito, $ideiaconceito);
     $query_insert = "INSERT INTO `album` SET `nome` =  '".$galeria."', `descricao` = '".$descricao."', imagem = '".$imagem_nome."' "; 
     $insert = mysql_query($query_insert, $ideiaconceito) or die(mysql_error());

}
}
}
}
?>

 

então você vai ter q usar um for() no lugar do foreach()

 

e ai usar o indice numérico.

 

 

Ok William vlw kra, vo tentar o for...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado a todos, aqui já está tudo resolvido, eu usei o foreach mesmo, um dentro do outro, tive que usar foreach's diferentes para cada valor de $_FILE, td ok, abçs a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.