Insert file set into 2 different tables

0

I have a situation that I can not resolve, and I would like your help.

I have a file-type input on my form where the user selects multiple images at once to upload.

I would like to insert 1 of these images into the X table and the rest into the Y table, is it 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 enters 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_photos table.

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>
    
asked by anonymous 22.07.2015 / 02:19

1 answer

2

Brief explanation of multi-upload

To work with multiple file uploads, you must enter the input name in the array format:

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

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

On the server side you get this data in the $_FILES variable with the field name key, in this 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 index of the desired file 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 $i variable, so we can access each file that we send to the server.

Now let's deal with inserts .

As we know we can access files by passing indexes, we also know that the first index of an array is 0 (except associative or cluttered arrays).

p>

Store the number of uploaded files in a variable:

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

Checks if any files have been uploaded and if they are, store the first one 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 if more than one file has been submitted and the variable with the product ID you have entered 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 looks 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>";

}
?>
    
22.07.2015 / 03:29