Insert multiple type file records into Mysql

Asked

Viewed 343 times

1

I’m making a form, where have a part of image registration for a photo gallery.

In this field I use a script with an add field button so that a new field can be inserted for each photo

<label>Galeria de Foto</label>
<BR><BR>
<button type="button" id="add_field" class="btn btn-success"><i class="fa fa-check"></i> Adicionar + Foto</button>
<br>
<div id="listas">
    <div><input name="fotos[]" type="file" class="form-control" aria-describedby="fileHelp" style="width: 70%;"></div>
</div>

This is the script that adds the new field:

<script>
    $(document).ready(function() {
    var campos_max          = 10;   //max de 10 campos
    var x = 1; // campos iniciais
    $('#add_field').click (function(e) {
            e.preventDefault();     //prevenir novos clicks
            if (x < campos_max) {
                    $('#listas').append('<div>\
                    <input name="fotos[]" type="file" class="form-control" aria-describedby="fileHelp" style="width: 70%;">\
                            <a href="#" class="remover_campo">Remover</a>\
                            </div>');
                    x++;
            }
    });

    // Remover o div anterior
    $('#listas').on("click",".remover_campo",function(e) {
            e.preventDefault();
            $(this).parent('div').remove();
            x--;
    });
});
</script>

So far so good. It creates a new file field, named pictures[]. And upload to the folder I set, without any error.

The problem is at the time of saving the name of each image in the database.

After submitting the form by post it executes the following:

<?
//include_once("config.php");
$nome_embarcacao = $_POST[nome];
$tipo = $_POST[tipo];
$arquivo = $_POST[arquivo];
$capacidade = $_POST[capacidade];
$tamanho = $_POST[tamanho];
$motorizacao = $_POST[motorizacao];
$equipamentos = $_POST[equipamentos];
$periodo_passeio = $_POST[periodo_passeio];
$area_navegacao = $_POST[area_navegacao];
$descricao = $_POST[descricao];


$sql = "INSERT INTO `embarcacao` (`id`, `nome`, `tipo`, `arquivo`, `capacidade`, `tamanho`, `motorizacao`, `equipamentos`, `periodo_passeio`, `area_navegacao`, `descricao`) VALUES (NULL, '$nome_embarcacao', '$tipo', '$arquivo', '$capacidade', '$tamanho', '$motorizacao', '$equipamentos', '$periodo_passeio', '$area_navegacao', '$descricao');";
$sql = mysql_query($sql);

$id_recuperado = mysql_insert_id();

// inicia criação de pasta
$pasta = @mkdir("../assets/images/embarcacoes/$id_recuperado");

// fim da criação da pasta
$uploaddir="../assets/images/embarcacoes/$id_recuperado/";

if($arquivo != "none") {// verifica campo foto 1
if (copy($_FILES['arquivo']['tmp_name'], $uploaddir . $_FILES['arquivo']['name'])) {
$varfoto01 = $_FILES['arquivo']['name'];
$var1 = mysql_query("update embarcacao set arquivo='$varfoto01' where 
id='$id_recuperado'");
}}


// Pasta de destino das fotos 
$Destino = "../assets/images/embarcacoes/$id_recuperado/"; 
// Obtém dados do upload 
$Fotos = $_FILES["fotos"]; 
// Contagem de fotos enviadas 
$Conta = 0; 

// Itera sobre as enviadas e processa as validações e upload 
for($i = 0; $i < sizeof($Fotos); $i++) 
{ 
 // Passa valores da iteração atual 
 $Nome = $Fotos["name"][$i]; 
 $Tamanho = $Fotos["size"][$i]; 
 $Tipo = $Fotos["type"][$i]; 
 $Tmpname = $Fotos["tmp_name"][$i]; 

 // Verifica se tem arquivo enviado 
if($Tamanho > 0 && strlen($Nome) > 1) 
{ 
 // Verifica se é uma imagem 
 if(preg_match("/^image\/(gif|jpeg|jpg|png)$/", $Tipo)) 
 { 
 // Caminho completo de destino da foto 
 $Caminho = $Destino . $Nome; 

 // Tudo OK! Move o upload! 
 if(move_uploaded_file($Tmpname, $Caminho)) 
 { 

 $sql_fotos = "INSERT INTO `embarcacao_fotos` (`id`, `id_embarcacao`, `arquivo`) VALUES";

foreach($_POST['fotos'] AS $indice => $valor) {

  $sql_fotos .= " (NULL, '{$id_recuperado}', '{$valor}'),";
}

echo "Foto #" . ($i+1) . " enviada.<br/>"; 

// Faz contagem de enviada com sucesso 
$Conta++; 
} 
else // Erro no envio 
{ 
 // $i+1 porque $i começa em zero 
 echo "Não foi possível enviar a foto #" . ($i+1) . "<br/>"; 
} 
} 
} 
} 

if($Conta) // Imagens foram enviadas, ok! 
{ 
echo "<br/>Foi(am) enviada(s) " . $Conta . " foto(s).";
} 

else // Nenhuma imagem enviada, faz alguma ação 
{ 
echo "Você não enviou fotos!"; 
}
?>

There in foreach($_POST['photos'], it does not insert in the database the name of each file.

I wonder if someone can help me. With this function of saving the names of the field files fotos[] in the database. That’s all I need. Save your names, because the upload in the created folder it is already doing normal.

I’m sorry if my post is duplicated and I’m sorry if I couldn’t explain it properly. I’m new at creating article to ask for help. I can always find someone with the same problem and solve by his question. But this one I’ve looked for and I haven’t found someone with the same problem.

Hug to all

  • You cannot terminate the SQL command with comma. And be careful that you are using the library mysql_, which has been discontinued. See Why should we not use mysql type functions_*?

  • Hello friend. Thank you for answering. Where is the comma you mentioned? Hug

  • Tell me what exactly you want to save in the bank with the variable $valor

  • @Leocaracciolo then Leo, I want to save in the database the name of each file. The table has this structure that is there in Sql_photos. Uploading files is already normal. But the name does not save. It does not actually save any record.

  • If any answer solved your problem mark it as accepted. See how in https://i.stack.Imgur.com/evLUR.png and why in https://pt.meta.stackoverflow.com/questions/1078/como-e-por-que-aceitar-uma-resposta/1079#1079

1 answer

1


  1. Use the foreach to generate the string

    foreach($_POST['fotos'] AS $indice => $valor) {
      $values .= " (NULL, '{$id_recuperado}', '{$valor}'),";
    }
    
  2. Remove the last comma from the string

    $values=substr($values, 0, -1);
    
  3. Use string as value of INSERT declaration

     $sql_fotos = "INSERT INTO `embarcacao_fotos` (`id`, `id_embarcacao`, `arquivo`) VALUES $values";
    

Analyzing your code after having ideated it in a more readable way, I found that the logic is wrong. The foreach is inside a loop for and thus the variable $values is being created incorrectly. So I redid the code so that the upload and Insert in the table embarcacao_fotos are executed correctly and with the extension mysqli_*

<?php

//coloquei esse if mas você faça do modo que deva ser do seu interesse, eé da ultima chave de fechamento
if (isset($_POST['tipo'])) {

/**não devemos usar "mysql" pelo seu desenvolvimento ter sido descontinuado; a extensão se tornou obsoleta e essas funções não irão funcionar em futuras versões do PHP*/
//include_once("config.php");

//use mysqli ou PDO
$conn = new mysqli ("localhost", "Usuario", "Senha", "nome_DB");

$nome_embarcacao = $_POST['nome'];
$tipo = $_POST['tipo'];
$arquivo = $_POST['arquivo'];
$capacidade = $_POST['capacidade'];
$tamanho = $_POST['tamanho'];
$motorizacao = $_POST['motorizacao'];
$equipamentos = $_POST['equipamentos'];
$periodo_passeio = $_POST['periodo_passeio'];
$area_navegacao = $_POST['area_navegacao'];
$descricao = $_POST['descricao'];

//com mysqli
$sql = "INSERT INTO `embarcacao` (`id`, `nome`, `tipo`, `arquivo`, `capacidade`, `tamanho`, `motorizacao`, `equipamentos`, `periodo_passeio`, `area_navegacao`, `descricao`) VALUES (NULL, '$nome_embarcacao', '$tipo', '$arquivo', '$capacidade', '$tamanho', '$motorizacao', '$equipamentos', '$periodo_passeio', '$area_navegacao', '$descricao');";
$executa = mysqli_query($conn,$sql);

$id_recuperado = $conn->insert_id;

// inicia criação de pasta

mkdir("../assets/images/embarcacoes/$id_recuperado/", 0777, true);

// fim da criação da pasta
$uploaddir="../assets/images/embarcacoes/$id_recuperado/";

if($arquivo != "none") {// verifica campo foto 1
if (copy($_FILES['arquivo']['tmp_name'], $uploaddir . $_FILES['arquivo']['name'])) {
$varfoto01 = $_FILES['arquivo']['name'];

//com mysqli
$conn->query("UPDATE embarcacao set arquivo='$varfoto01' where 
id='$id_recuperado'"); 
}}

/************************************************************************************/
/********  daqui pra baixo faz upload e insert na tabela embarcacao_fotos ***********/
/************************************************************************************/

$j = 0;

// Pasta de destino das fotos
$caminhoDestino = "../assets/images/embarcacoes/$id_recuperado/";

$Fotos=$_FILES['fotos'];

    for ($i = 0; $i < count($Fotos['name']); $i++) {
        //nome e extensão do arquivo
        $nome = ($Fotos['name'][$i]);

        if($nome!=""){
            //constroi os values da declaração INSERT para a tabela embarcacao_fotos
            $values .= " (NULL, '{$id_recuperado}', '{$nome}'),";

             $extensoesValidas = array("jpeg", "jpg", "png", "gif");
             //basename() retorna apenas a parte que corresponde ao nome do arquivo.
             $ext = explode('.', basename($Fotos['name'][$i]));

             //end() avança o ponteiro interno de array até o seu último elemento, e retorna-o.
             $extensaoArquivo = end($ext);

             // Caminho completo de destino da foto
             $caminhoCompleto = $caminhoDestino.$nome;

             $j = $j + 1;
                if (($Fotos["size"][$i]>0) && in_array($extensaoArquivo, $extensoesValidas)) {
                    if (move_uploaded_file($Fotos['tmp_name'][$i], $caminhoCompleto)) {
                     echo $j. ').<span id="noerror">Imagem carregada com êxito!.</span><br/><img src="'.$caminhoCompleto.'" width="50px" height="50px" /><br/><br/>';
                    } else {
                     echo $j. ').<span id="error">Por favor, tente novamente!.</span><br/><br/>';
                    }
                } else {
                echo $j. ').<span id="error">***Tamanho ou tipo de arquivo inválido***</span><br/><br/>';
                }
        }
    }

    //retira a ultima virgula
    $values=substr($values, 0, -1);

    //declaração insert 
    $sql_fotos = "INSERT INTO `embarcacao_fotos` (`id`, `id_embarcacao`, `arquivo`) VALUES $values";
    //executa a query
    $executa = mysqli_query($conn,$sql_fotos);

    mysqli_close($conn); 


}
?>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<script>
    $(document).ready(function() {
    var campos_max          = 10;   //max de 10 campos
    var x = 1; // campos iniciais
    $('#add_field').click (function(e) {
            e.preventDefault();     //prevenir novos clicks
            if (x < campos_max) {
                    $('#listas').append('<div>\
                    <input name="fotos[]" type="file" class="form-control" aria-describedby="fileHelp" style="width: 70%;">\
                            <a href="#" class="remover_campo">Remover</a>\
                            </div>');
                    x++;
            }
    });

    // Remover o div anterior
    $('#listas').on("click",".remover_campo",function(e) {
            e.preventDefault();
            $(this).parent('div').remove();
            x--;
    });
});
</script>


<form class="form-horizontal m-t-40" autocomplete="off" action="?pg=enviar_embarcacao" method="post" enctype="multipart/form-data" novalidate>
  <div class="form-group">
<label>Tipo Embarcação</label>
<select name="tipo" class="custom-select col-12" id="inlineFormCustomSelect">
  <option selected>Selecione o tipo...</option>
  <option value="1">Alugar</option>
  <option value="2">Vender</option>
</select>
  </div>
  <div class="form-group">
<label>Nome</label>
<div class="controls">
  <input type="text" name="nome" class="form-control" required data-validation-required-message="Nome obrigatorio!">
</div>
  </div>
  <div class="form-group">
<label>Imagem destaque</label>
<div class="controls">
  <input name="arquivo" type="file" class="form-control" id="exampleInputFile" aria-describedby="fileHelp" required data-validation-required-message="Essa imagem é obrigatória!">
</div>
  </div>
  <div class="row">
<div class="col-lg-4">
  <div class="form-group">
    <label>Capacidade</label>
    <input name="capacidade" type="text" class="form-control" placeholder=".col-5">
  </div>
</div>
<div class="col-lg-4">
  <div class="form-group">
    <label>Tamanho</label>
    <input name="tamanho" type="text" class="form-control" placeholder=".col-5">
  </div>
</div>
<div class="col-lg-4">
  <div class="form-group">
    <label>Periodo Passeio</label>
    <input name="periodo_passeio" type="text" class="form-control" placeholder=".col-5">
  </div>
</div>
  </div>
  <div class="row">
<div class="col-lg-6">
  <div class="form-group">
    <label>Area de Navegação</label>
    <input name="area_navegacao" type="text" class="form-control" placeholder=".col-5">
  </div>
</div>
<div class="col-lg-6">
  <div class="form-group">
    <label>Motorização</label>
    <input name="motorizacao" type="text" class="form-control" placeholder=".col-5">
  </div>
</div>
  </div>
  <div class="form-group">
<label>Equipamentos</label>
<div class="controls">
  <textarea name="equipamentos" id="texto-principal" class="textarea_editor form-control" rows="15" placeholder="Digitar o texto ..." required data-validation-required-message="Esse texto é obrigatório!"></textarea>
</div>
  </div>
  <div class="form-group">
<label>Descrição</label>
<textarea name="descricao" id="texto-extra2" class="textarea_editor form-control" rows="15" placeholder="Digitar o texto ..."></textarea>
  </div>
  <p>
<label>Galeria de Foto</label>
<BR>
<BR>
<button type="button" id="add_field" class="btn btn-success"><i class="fa fa-check"></i> Adicionar + Foto</button>
<br>
  <div id="listas">
<div>
  <input name="fotos[]" type="file" class="form-control" aria-describedby="fileHelp" style="width: 70%;">
</div>
  </div>
  </p>
  <button type="submit" class="btn btn-info">Cadastrar</button>
  <button type="reset" class="btn btn-inverse">Apagar Tudo</button>
</form>
  • Hello Leo, thank you so much for answering. I did as mentioned, but not yet saved in the database. Looks like this: foreach($_POST['photos'] AS $Indice => $value) { $values .= " (NULL, '{$id_recovered}', '{$value}') ,"; } $values=substr($values, 0, -1); $sql_fotos = "INSERT INTO embarcacao_fotos (id, id_embarcacao, arquivo) VALUES($values)"; This correct? Hug and thank you so much for your help my friend.

  • @Leo, I did it the way you arranged it. In the first test it was an error because it has a key closing from mysqli_close($Conn); when I removed it the page ran. He saved the vessel in BD, uploaded the FILE. But he did not upload the PHOTOS nor saved it in the database. The problem is still in the PHOTOS section. It seems that this part is not receiving FILES from the form. Leo, I thank you for giving me strength friend and sorry for the trouble. I’m really stuck still at this stage of the script.

  • @Agênciaozweb, huahuahua, faltou $Fotos=$_FILES['fotos']; before the loop. Tell me, the folder is being created?

  • @Agênciaozweb Are you sure that $pasta = @mkdir("../assets/images/embarcacoes/$id_recuperado"); that this code is creating the folder? for me not. See in my answer how it worked for me

  • @mkdir("./Assets/images/embeds/$id_recovered"); This one worked, it creates the ftp folder without problem.

  • @Leocaracciolo $_POST[name]; it works there for you? Worse than normal. But with the quote it also works.

  • @Leocaracciolo - I tested it now with this new script you edited. DEU CERTOOOO - I assume that when I opened my doubt here, I did not expect to be helped. Because I did not believe that someone would waste time helping me. But thank you for your help my friend. You have been of utmost importance to me. May God bless you. Thank you very much from your heart my friend. Big hug.

Show 2 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.