Insert file set into 2 different tables

Asked

Viewed 211 times

0

I have a situation I can’t handle, and I’d like your help.

I have a file type input in my form where the user selects several images at once to upload.

I would like to insert 1 of these images in table X and the rest in table Y, this is possible?

<?php
if(isset($_POST['submitProduto'])){

//Caminho para salvar
$caminho = "uploads/";

$produto = trim($_POST["produto"]);
$informacao = trim($_POST["informacao"]);
$categoria = trim($_POST['categoria']);
$subCategoria = $_POST['subCategoria'];

// Verifica Checkbox
if (isset($_POST['destaque'])) {
    $destaque = 1;
}
else {
    $destaque = 0;
}


//Inseri imagem
$sqlInsere = $database::query("INSERT INTO produtos (nome,descricao,categoria,destaque, sub_categoria) VALUES ('".$produto."', '".$informacao."','".$categoria."','".$destaque."', '".$subCategoria."')");

$sqlUltimoID = $database::query("SELECT * FROM produtos ORDER BY id LIMIT 0 , 1");
$rowUltimoID = $database::row($sqlUltimoID);

// lastInserId
$last = $rowUltimoID['id'];


for ($i = 0; $i < count($_FILES["fotos"]["name"]); $i++) {

    $nomeArquivo = $_FILES["fotos"]["name"][$i];
    $tamanhoArquivo = $_FILES["fotos"]["size"][$i];
    $nomeTemporario = $_FILES["fotos"]["tmp_name"][$i];

    if (!empty($nomeArquivo)) {

        $arquivoArray= explode(".", $nomeArquivo);
        $extensao = end($arquivoArray);

        $arquivo = $caminho.md5(time().rand(3212, 12043)).'.'.$extensao;

            if(move_uploaded_file($nomeTemporario, $arquivo)){
                $database::query("INSERT INTO produtos_fotos (id_produto, imagem) VALUES ('".$last."', '".$arquivo."')");
            } else {
                echo "Não foi possível enviar a imagem";    
            }
    }
}

$message = '<div class="alert alert-success text-center">Produtos cadastrados com sucesso!</div>';

}
?>

if the user inserts more than 1 file I would like to add 1 of these files to the first Insert in the products table and the remaining in the second Insert in the products table_photos.

HTML:

<form class="form-horizontal form-bordered" action="" method="post" enctype="multipart/form-data">
       <div class="form-group">
        <label class="col-md-3 control-label" for="inputDefault">Nome do produto</label>
        <div class="col-md-6">
            <input type="text" class="form-control" name="produto" placeholder="Digite aqui o nome do produto" required>
        </div>
    </div>
    <!-- Selecionar categoria-->
    <div class="form-group">
        <label class="col-md-3 control-label" for="inputDefault">Categoria</label>
        <div class="col-md-6">
            <?php
            $categorias = $database::query("SELECT * FROM categorias_principal ORDER BY categoria ASC");
            echo '<select name="categoria" class="form-control">';
            foreach($database::result($categorias) as $categoria){
                echo '<option value="'.$categoria["id"].'">'.$categoria['categoria'].'</option>';
            }
            echo '</select>';
            ?>
        </div>
    </div>
    <!-- Selecionar SUBCATEGORIA -->
    <div class="form-group">
        <label class="col-md-3 control-label" for="inputDefault">Sub-Categoria</label>
        <div class="col-md-6">
            <?php
            $categorias = $database::query("SELECT * FROM categorias_sub  ORDER BY subcategoria ASC");
            echo '<select name="subCategoria" class="form-control">';
            foreach($database::result($categorias) as $categoria){
                echo '<option value="'.$categoria["id"].'">'.$categoria['subcategoria'].'</option>';
            }
            echo '</select>';
            ?>
        </div>
    </div>
    <!--Seleciona as fotos-->
    <div class="form-group">
        <label class="col-md-3 control-label" for="inputDefault">Fotos do produto <br /><small>Selecione quantas quiser</small></label>
        <div class="col-md-6">
            <input type="file" class="form-control" name="fotos[]" multiple required>
        </div>
    </div>
    <!--- Informação/Descrição do produto -->
    <div class="form-group">
        <label class="col-md-3 control-label" for="inputDefault">Informação do produto</label>
        <div class="col-md-9">
            <textarea id="editor1" name="informacao"></textarea>
        </div>
    </div>
    <!-- Produto destque? -->
    <div class="form-group">
        <label class="col-md-3 control-label" for="inputDefault">&nbsp;</label>
        <div class="col-md-9">
            <input type="checkbox" name="destaque" value="1"> Destaque
        </div>
    </div>

    <div class="form-group">
        <label class="col-md-3 control-label" for="inputDefault">&nbsp;</label>
        <div class="col-md-6">
            <input type="submit" name="submitProduto" value="Cadastrar produto" class="btn btn-success">
        </div>
    </div>
</form>
  • exactly what I want to know @Kaduamaral, how do I get 1 image between 4 that were sent by the same input of type file...

  • exact @Kaduamaral

  • I’ve already edited with HTML

  • Rafael is using PDO?

  • yes, I’m using Pdo

1 answer

2


Brief explanation about multi-upload

To work with uploading multiple files you need to enter the name of the input in the format of array:

<input type="file" name="upload[]">

Note that the attribute value has keys at the end of the name [] this indicates that several values will be sent in the same field.

On the server side you receive this data in the variable $_FILES with the field name key, in our case upload getting $_FILES['upload']. By default PHP distributes these files as follows:

array(1) { 
    ["upload"]=>array(2) { 
        ["name"]=>array(2) { 
            [0]=>string(9)"file0.txt" // Arquivo 1
            [1]=>string(9)"file1.txt" // Arquivo 2
        } 
        ["type"]=>array(2) { 
            [0]=>string(10)"text/plain" // Arquivo 1 
            [1]=>string(10)"text/html"  // Arquivo 2
        } 
    } 
} 

Then to access them just pass the desired file Dice after the properties:

$qtd = count($_FILES["fotos"]["name"]);

for ($i = 0; $i < $qtd; $i++) {

    $nomeArquivo = $_FILES["fotos"]["name"][$i];
    $tamanhoArquivo = $_FILES["fotos"]["size"][$i];
    $nomeTemporario = $_FILES["fotos"]["tmp_name"][$i];

}

Note that we are passing the index through the variable $i, so we can access every file we send to the server.

Now let’s take care of the Inserts.

As we know that we can access the files by passing indices, we also know that the first index of a array is 0 (barring arrays associative or disorderly).

Store the amount of uploaded files in a variable:

$qtd = count($_FILES["fotos"]["name"]);

Check if any files have been uploaded and if so, store the first in the products table

if ($qtd > 0){
    // acessa o primeiro arquivo com o índice 0
    $nomeArquivo = $_FILES["fotos"]["name"][ 0 ]; 
    $tamanhoArquivo = $_FILES["fotos"]["size"][ 0 ];
    $nomeTemporario = $_FILES["fotos"]["tmp_name"][ 0 ];
    
    // Faça o upload do arquivo 
    $arquivoArray= explode(".", $nomeArquivo);
    $extensao = end($arquivoArray);
    $arquivo = $caminho.md5(time().rand(3212, 12043)).'.'.$extensao;

    if(move_uploaded_file($nomeTemporario, $arquivo)){
        
        $sqlInsere = $database::query("INSERT INTO produtos (nome,descricao,categoria,destaque, sub_categoria, imagem) VALUES ('".$produto."', '".$informacao."','".$categoria."','".$destaque."', '".$subCategoria."', '".$arquivo."')");
        $last = $database->lastInsertId(); // Pega o ID do último INSERT
    } else {
        echo "Não foi possível registrar o produto, falha no upload da imagem";
        exit;
    }
}

Then check that more than one file has been sent and that the variable with the registered product ID is not empty:

if ($qtd > 1 && !empty($last)){

Then start recording the images from the second that in the case is ID 1

    // Inicia o loop apartir do indice 1, pois o indice 0 já foi registrado
    for ($i = 1; $i < $qtd; $i++) { 

        $nomeArquivo = $_FILES["fotos"]["name"][$i];
        $tamanhoArquivo = $_FILES["fotos"]["size"][$i];
        $nomeTemporario = $_FILES["fotos"]["tmp_name"][$i];

        // faça upload do arquivo

        // registre no banco

    }
}

The whole code goes like this:

<?php
if(isset($_POST['submitProduto'])){

    //Caminho para salvar
    $caminho = "uploads/";

    $produto = trim($_POST["produto"]);
    $informacao = trim($_POST["informacao"]);
    $categoria = trim($_POST['categoria']);
    $subCategoria = $_POST['subCategoria'];

    // Verifica Checkbox
    if (isset($_POST['destaque'])) {
        $destaque = 1;
    }
    else {
        $destaque = 0;
    }



    $qtd = count($_FILES["fotos"]["name"]);
    $last = false;
    $alert = 'danger';
    // Verifica se algum arquivo foi enviado
    if ($qtd > 0){
        // acessa o primeiro arquivo com o índice 0
        $nomeArquivo = $_FILES["fotos"]["name"][ 0 ]; 
        $tamanhoArquivo = $_FILES["fotos"]["size"][ 0 ];
        $nomeTemporario = $_FILES["fotos"]["tmp_name"][ 0 ];

        // Faça o upload do arquivo 
        $arquivoArray= explode(".", $nomeArquivo);
        $extensao = end($arquivoArray);
        $arquivo = $caminho.md5(time().rand(3212, 12043)).'.'.$extensao;

        if(move_uploaded_file($nomeTemporario, $arquivo)){

            $sqlInsere = $database::query("INSERT INTO produtos (nome,descricao,categoria,destaque, sub_categoria, imagem) VALUES ('".$produto."', '".$informacao."','".$categoria."','".$destaque."', '".$subCategoria."', '".$arquivo."')");
            if ($sqlInsere){
                $msg = "Produtos cadastrados com sucesso!";
                $alert = 'success';
                $last = $database->lastInsertId(); // Pega o ID do último INSERT
            }
            else 
                $msg = "Não foi possível cadastrar os produtos."
            

        } else {
            $msg = "Não foi possível registrar o produto, falha no upload da imagem";
        }
    } else $msg = 'Envie alguma imagem para continuar.';

    // Se foi enviado mais de 1 arquivo e a variavel do ID do produto não está vazia
    if ($qtd > 1 && !empty($last)){

        // Inicia o loop apartir do indice 1, pois o indice 0 já foi registrado
        for ($i = 1; $i < $qtd; $i++) { 

            $nomeArquivo = $_FILES["fotos"]["name"][$i];
            $tamanhoArquivo = $_FILES["fotos"]["size"][$i];
            $nomeTemporario = $_FILES["fotos"]["tmp_name"][$i];

            if (!empty($nomeArquivo)) {

                $arquivoArray= explode(".", $nomeArquivo);
                $extensao = end($arquivoArray);

                $arquivo = $caminho.md5(time().rand(3212, 12043)).'.'.$extensao;

                    if(move_uploaded_file($nomeTemporario, $arquivo)){
                        $database::query("INSERT INTO produtos_fotos (id_produto, imagem) VALUES ('".$last."', '".$arquivo."')");
                    } else {
                        echo "Não foi possível enviar a imagem";
                    }
            }

        }
    }

    $message = "<div class=\"alert alert-{$alert} text-center\">{$msg}</div>";

}
?>
  • @Rafaelacioly see if you can understand and use the code. I made it very superficial, I did not test the code, but from what I saw you are not a beginner and already know something about PHP, even if you are having doubts or problems I am available.

  • In the last comment of upload I reload those 3 lines before the first Insert? // Upload the file $archivArray= explodes(".", $filename); $extension = end($archivArray); $file = $path.md5(time().Rand(3212, 12043)). '. '. $extensao;

  • Do the path Insert, just as you do in the other table, add a field to record the file path just like you do in the second Insert.

  • I got a little lost with this comment, I’m still trying to make my brain show how it will work properly, rs

  • Yes in the same way as it is in your code. the only modification there is the for that comes instead of $i = 0; got $i = 1 to skip the first file that was registered in the products table, but in case wanted to register it again leave as was.

  • does Voce can join my code with your reasoning? I’m not getting it! rs

  • @Rafaelacioly put the full code, but as I said there may be errors because I have not tested, if error let me know.

  • we better chat! :)

Show 4 more comments

Browser other questions tagged

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