Jump to content

Gravar dados e upload de imagens


Recommended Posts

Posted (edited)

É o seguinte, preciso que meu formulário salve as informações que insero nele no banco de dados, junto a este formulário, preciso fazer upload de três imagens, um dela deve ser obrigatória. As imagens, além do upload para o diretorio desejado, preciso que seja registrado o nome da imagem para exibição.

Segue o meu formulário:

<?php
// Visitante não pode acessar esta página
if($dados == '') {
header ("Location:$login_user");
}
?>
<h3>Incluir Novo Marcador</h3>
<form id="novomarcador" enctype="multipart/form-data" method="post" action="<?php echo $save_marcador; ?>">
<fieldset>
<?php
$id = ucfirst(strtolower($dados['id_usuario']));
$nome = ucfirst(strtolower($dados['nome']));
$login = ucfirst(strtolower($dados['login']));
?>
<input type="hidden" name="id_usuario" id="id_usuario" value="<?php echo $id; ?>" />
<input type="hidden" name="login" id="login" value="<?php echo $login; ?>" />
<input type="hidden" name="nome" id="nome" value="<?php echo $nome; ?>" />
<dl>
<dt><label for="marcador">Marcador:</label><br /><span>Nome para seu Marcador</span></dt>
<dd><input type="text" required="required" name="marcador" id="marcador" size="25" class="inputbox" /></dd>
</dl>
<hr />
<dl>
<dt><label for="fabricante">Fabricante:</label><br /><span>Nome para do Fabricante</span></dt>
<dd><input type="text" required="required" tabindex="1" name="fabricante" id="fabricante" size="25" class="inputbox" /></dd>
</dl>
<hr />
<dl>
<dt><label for="modelo">Modelo:</label><br /><span>Modelo do Marcador</span></dt>
<dd><input type="text" required="required" tabindex="1" name="modelo" id="modelo" size="25" class="inputbox" /></dd>
</dl>
<hr />
<script type="text/javascript">
// <![CDATA[
function habilitacamposNS(par) {
div = document.getElementById('nserie');
if(par == 'sim') {
div.style.display = 'block';
}
else {
div.style.display = 'none';
}
}
// ]]>
</script>
<dl>
<dt><label for="nserie">Numero de série:</label><br /><span>Numero de série do seu Marcador. Se selecionar SIM, indique o número de serie no campo.</span></dt>
<dd><input type="radio" name="respnserie" value="s" onclick="habilitacamposNS('nao');" />Não
<input type="radio" name="respnserie" value="s" onclick="habilitacamposNS('sim');" />Sim
<div id="nserie" style="display: none;">
<input type="file" tabindex="1" name="imagem3" id="imagem3" size="25" class="inputbox" />
</div>
</dd>
</dl><br /><br />
<hr />
<dl>
<dt><label for="nfiscal">Nota Fiscal:</label><br /><span>Nota Fiscal do seu Marcador</span></dt>
<dd><input type="text" tabindex="1" name="nfiscal" id="nfiscal" size="25" class="inputbox" /></dd>
</dl>
<hr />
<script type="text/javascript">
// <![CDATA[
function habilitaCampos(par) {
div = document.getElementById('crexercito');
if(par == 'sim') {
div.style.display = 'block';
}
else {
div.style.display = 'none';
}
}
// ]]>
</script>
<dl>
<dt><label for="crexercito">Você possui CR no exército?</label><br /><span>Possui CR no exército? Se selecionar como SIM, então deve inserir o número e validade.</span></dt>
<dd><input type="radio" name="respcrexercito" value="s" onclick="habilitaCampos('nao');" />Não
<input type="radio" name="respcrexercito" value="s" onclick="habilitaCampos('sim');" />Sim
<div id="crexercito" style="display: none;">
<input type="text" tabindex="1" name="crexercito" id="crexercito" size="25" class="inputbox" />
</div>
</dd>
</dl><br />
<hr />
<script type="text/javascript">
// <![CDATA[
function habilitacamposRE(par) {
div = document.getElementById('rexercito');
if(par == 'sim') {
div.style.display = 'block';
}
else {
div.style.display = 'none';
}
}
// ]]>
</script>
<dl>
<dt><label for="rexercito">Registro no exército:</label><br /><span>Seu marcador é registrado no exército? Se marcou sim, deve indicar o número do CRAF.</span></dt>
<dd><input type="radio" name="resprexercito" value="s" onclick="habilitacamposRE('nao');" />Não
<input type="radio" name="resprexercito" value="s" onclick="habilitacamposRE('sim');" />Sim
<div id="rexercito" style="display: none;">
<input type="text" tabindex="1" name="rexercito" id="rexercito" size="25" class="inputbox" />
</div>
</dd>
</dl><br />
<hr />
<dl>
<dt><label for="imagem">Fotos do seu marcador:</label><br /><span>Envie fotos do seu marcador. Antes de enviar suas fotos, tenha certeza de dar um nome único a ela, inserindo seu nome e alguma numeração que o nome de arquivo seja único em nosso banco. </span></dt>
<dd><input type="file" tabindex="1" name="imagem" id="imagem" size="25" class="inputbox" /> <br />
<input type="file" tabindex="1" name="imagem2" id="imagem2" size="25" class="inputbox" />
</dd>
</dl><br /><br />
<hr />
</fieldset>
<fieldset class="submit" style="text-align: center;">
<input type="submit" class="enviar" name="cadastrar" value="Salvar" style="cursor:pointer;" />
</fieldset>
</form>

Os campos das imagens são Numero de série (campo opcionale), Fotos (são dois campos, o primeiro obrigatorio e o segundo opcional). O código que salva tudo é o seguinte:

<?php
// Visitante não pode acessar esta página
if($dados == '') {
header ("Location:$login_user");
}
// Aqui você faz a conexão com o banco de dados
include "config.php";
// Se o usuário clicou no botão cadastrar efetua as ações
if ($_POST['cadastrar']) {
// Recupera os dados dos campos
$nome = $_POST['nome'];
$id  = $_POST['id_usuario'];
$login = $_POST['login'];
$marcador = $_POST['marcador'];
$fabricante = $_POST['fabricante'];
$modelo = $_POST['modelo'];
$nfiscal = $_POST['nfiscal'];
$crexercito = $_POST['crexercito'];
$rexercito = $_POST['rexercito'];
$foto[1] = $_FILES["imagem"];
$foto[2] = $_FILES["imagem2"];
$foto[3] = $_FILES['imagem3'];
// Verificando se os campos obrigatórios foram preenchidos
if(($_POST['marcador'] == '') || ($_POST['fabricante'] == '') || ($_FILES["imagem"] == '')){
 echo '<strong style="color: #BC2A4D;">Você deve preencher os campos obrigatórios.</strong>';
 include "formulario_marcador.php";
}
// Se a foto estiver sido selecionada
if (!empty($foto[1]["name"]) && !empty($foto[2]["name"]) && !empty($foto[3]["name"])) {
 // Largura máxima em pixels
 $largura = 15000;
 // Altura máxima em pixels
 $altura = 18000;
 // Tamanho máximo do arquivo em bytes
 $tamanho = 200000;
    // Verifica se o arquivo é uma imagem
    if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto[1]["type"])){
        $error[4] = "O arquivo enviado não é uma imagem.";
     }

    if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto[2]["type"])){
        $error[4] = "O arquivo enviado não é uma imagem.";
     }
    if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto[3]["type"])){
        $error[4] = "O arquivo enviado não é uma imagem.";
     }
 // Pega as dimensões da imagem
 $dimensoes = getimagesize($foto[1]["tmp_name"]);
 $dimensoes = getimagesize($foto[2]["tmp_name"]);
 $dimensoes = getimagesize($foto[3]["tmp_name"]);
 // Verifica se a largura da imagem é maior que a largura permitida
 if($dimensoes[0] > $largura) {
  $error[5] = "A largura da imagem não deve ultrapassar ".$largura." pixels.";
 }
 // Verifica se a altura da imagem é maior que a altura permitida
 if($dimensoes[1] > $altura) {
  $error[6] = "Altura da imagem não deve ultrapassar ".$altura." pixels.";
 }
 // Verifica se o tamanho da imagem é maior que o tamanho permitido
 if(!empty($arquivo["size"]) > $tamanho) {
      $error[7] = "A imagem deve ter no máximo ".$tamanho." bytes.";
 }

 // Se não houver nenhum erro
 if (!empty($error) == 0) {
  // Pega extensão da imagem
  $allowed_image = array ('image/gif', 'image/jpeg', 'image/jpg', 'image/pjpeg','image/png');

  $filetype = $_FILES['picture']['type'];
  //preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $foto[1]["name"], $ext);
  //preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $foto[2]["name"], $ext);
  //preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $foto[3]["name"], $ext);
        // Gera um nome único para a imagem
        $nome_imagem = md5(uniqid(time())) . "." . $filetypes;
  $nome_imagem2 = md5(uniqid(time())) . "." . $filetypes;
  $nome_imagem3 = md5(uniqid(time())) . "." . $filetypes;
        // Caminho de onde ficará a imagem
        $caminho_imagem = "fotos/" . $nome_imagem;
  $caminho_imagem = "fotos/" . $nome_imagem2;
  $caminho_imagem = "fotos/" . $nome_imagem3;
  // Faz o upload da imagem para seu respectivo caminho
  move_uploaded_file($foto[1]["tmp_name"], $caminho_imagem);
  move_uploaded_file($foto[2]["tmp_name"], $caminho_imagem);
  move_uploaded_file($foto[3]["tmp_name"], $caminho_imagem);
  // Insere os dados no banco
  $sql = mysql_query("INSERT INTO marcadores (nome, id_usuario, login, marcador, fabricante, modelo, nserie, nfiscal, crexercito, rexercito, foto, foto2) VALUES ('".$nome."', '".$id."', '".$login."', '".$marcador."', '".$fabricante."', '".$modelo."', '".$nome_imagem3."', '".$nfiscal."', '".$crexercito."', '".$rexercito."', '".$nome_imagem."', '".$nome_imagem2."')") or die( mysql_error() );
  // Se os dados forem inseridos com sucesso
  if ($sql){
   echo "<strong style='color: #BC2A4D;'>O seu marcador foi cadastrado com sucesso. <br />
   Você pode editar seus marcadores clicando no link <strong>Meus Marcadores</strong>. <br />
   Caso queira excluir quaisquer de seus marcadores cadastros, você deve solicitar ao administrador do site, justificando o motivo da exclusão.<br /> <br /> Você será redirecionado automaticamente para à página inicial do site.</strong>";
   header("refresh:3;url=$home_url" );
  }
 } else {
  echo "<strong style='color: #BC2A4D;'>Erro. Corrija o(s) erro(s) descrito(s) abaixo e tente novamente. </strong><br />";
 }
 // Se houver mensagens de erro, exibe-as
 if (!empty($error) != 0) {
  foreach ($error as $erro) {
   echo '<strong style="color: #BC2A4D;"> '.$erro .' </strong><br />';
   include "formulario_marcador.php";
  }
 }
}
}
?>

O problema é que não consigo fazer mais de um upload de imagem, só consigo fazer o upload da primeira foto. Mesmo assim, só salva o registro se eu envio com foto, se não enviar foto, não é salva nada na tabela. Preciso muito de ajuda para fazer isso funcionar, e espero contar com a ajuda de vocês.

PS: não sou programador expert, esse meu codigo deve estar muito bagunçado pois mechi muito nele para tentar fazer funcionar.

Edited by brunoais
geshi. A formatação vem a seguir qd alguém se der ao trabalho de o fazer.
Posted

Uma dica :

$dimensoes = getimagesize($foto[1]["tmp_name"]);
$dimensoes = getimagesize($foto[2]["tmp_name"]);

A variável, neste caso, vai ficar com o último valor que lhe foi atribuido, em vez de teres o valor das 3 imagens. Assim como este há vários erros do mesmo género no código. Procura no google por "multiple image upload with php".

  • 2 weeks later...
Posted

yoda, esse minha página já tem alguns meses que tento montar e já fiz diversas pesquisas no Google. O fato é que preciso além do upload de imagem, que seja salve as informações que insiro no formulário, como por exemplo Nome, Datas de Nasc, email, website, etc...

Muitos codigos que encontrei são apenas para uploads para um diretorio, no meu caso além do upload é necessário registrar o nome da imagem no banco de dados. Fora isso, não três imagem sendo uma obrigatória.

Com relação ao codigo que postei, eu mechi tanto nele que deve estar uma bagunça.

PS: eu marquei para ser notificado assim que esse topico tivesse algum resposta, mas não recebi e-mail algum.

Posted

HappyHippyHippo, esse codigo que postei funciona se for upload apenas de uma imagem. Esse codigo acima está muito modificado do original que encontrei, e quero dar preferencia a ele pois tem funções que gostaria de implementar como por exemplo ao que dá um nome unico e exclusivo as imagens.

Posted

HappyHippyHippo, esse codigo que postei funciona se for upload apenas de uma imagem. Esse codigo acima está muito modificado do original que encontrei, e quero dar preferencia a ele pois tem funções que gostaria de implementar como por exemplo ao que dá um nome unico e exclusivo as imagens.

eu não falei das imagens ou o que fazes com elas, mas sim da informaçaão relacionada com estas:

O fato é que preciso além do upload de imagem, que seja salve as informações que insiro no formulário, como por exemplo Nome, Datas de Nasc, email, website, etc...

IRC : sim, é algo que ainda existe >> #p@p
Posted

As informações são salvas também apenas se faço upload da $foto[1]. Como eu disse, o script chega a funciona neste caso se apenas a $foto[1] for enviada. Os dados são para exibição e administração(editar ou excluir).

Posted
O problema é que não consigo fazer mais de um upload de imagem, só consigo fazer o upload da primeira foto. Mesmo assim, só salva o registro se eu envio com foto, se não enviar foto, não é salva nada na tabela
Posted

Só o upload da imagem1 funciona.

Não aparece nenhuma mensagem de erro. O unico problema é quando as imagens 2 e 3 são uploaded, no diretorio elas ficam como 7e0dd69d48afc40b932b515be7690bfa.Array ao inves da extensão da imagem.

Posted (edited)
$filetype = $_FILES['picture']['type'];

Notei que é $filetypes e não $filetype. Vou verificar aqui.

#edit

Não funcinou. Constatei que só está fazendo upload da ultima imagem, a de número #3

Edited by Vinny
Posted

Bem, já te foram dadas dicas para melhorares e resolveres os problemas com o código que usas (sem que tenhamos de ser nós a escrever a série de coisas que está mal, e que se resumem de certa forma). Uma última :

Se estás a trabalhar com várias imagens, é uma perca de tempo (e torna-se mais difícil de manter) estar a fazer algo como isto :

 if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto[1]["type"])){
	 $error[4] = "O arquivo enviado não é uma imagem.";
  }
 if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto[2]["type"])){
	 $error[4] = "O arquivo enviado não é uma imagem.";
  }
 if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto[3]["type"])){
	 $error[4] = "O arquivo enviado não é uma imagem.";
  }

Quando podias ter :

foreach ($foto as $f)
{
 if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $f["type"])){
	 $error[4] = "O arquivo enviado não é uma imagem.";
  }
}

O código fica melhor organizado, lê-se bem melhor e consequentemente os possíveis erros tornam-se mais claros.

Posted

yoda, de fato ficou muito melhor e muito organizado. Só relembranco, não sou programar, estou fazendo isso as "avessas" já que PHP não meu forte.

HappyHippyHippo, resultado:

Nome da imagem 1 : 75390f284a80756ec7213bc3fe4853a4.3

Nome da imagem 2 : 29106dfcaba86b5a0f8e05f4337f3bc1.3

Nome da imagem 3 : 870149da0e7c6288e3db41cb799a026d.3

Este output eu faço numa lista de exibição, não esta pegando a extensão da imagem. :'(

Posted (edited)

Boas.

Tens aí alguns erros e práticas desnecessárias, mas vou focar-me na resolução do problema com as imagens, problema esse que reside essencialmente em variáveis iguais que apenas te vão retornar o último valor (como inclusivamente já foi referido). Aqui está um exemplo:

// Caminho de onde ficará a imagem
$caminho_imagem = "fotos/" . $nome_imagem;
$caminho_imagem = "fotos/" . $nome_imagem2;
$caminho_imagem = "fotos/" . $nome_imagem3;

Depois, há variáveis / arrays que, parto do princípio que nem sequer estão definidos, como por exemplo:

$filetype = $_FILES['picture']['type'];

De onde é que vem 'picture'? Não é do formulário, certamente.

Começa por resolver esses problemas e depois certamente que chegarás a algum lado 🙂

Edited by brunoais
geshi

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
×
×
  • Create New...

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.