Insert picture into 2 different tables

Asked

Viewed 90 times

1

I created a Function to register images as an album;

A table for capa and a table for galeria.

THE HTML:

//Imagem da Capa
<div class="form-group">
  <label class="col-md-1 control-label" for="capa">Capa:</label>  
     <div class="col-md-4">
       <input type="file" name="capa" class="form-control" required/>
     </div>
</div>

    // Imagens diversas                  
    <div class="form-group">
        <label class="col-md-1 control-label" for="imagem">Album </label>  
       <div class="col-md-4">
          <input type="file[]" name="imagem" class="form-control" required/>
       </div>
   </div>

A Function:

function criarAlbum($tabela1, $tabela2, $dados) {
$con = conectar();

$caminho = 'uploads/';

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

$nomeCapa = $_FILES["capa"]["name"];
$nomeTemporarioCapa = $_FILES["capa"]["tmp_name"];
$tamanhoArquivoCapa = $_FILES["capa"]["size"];

$arquivoArrayCapa = explode(".", $nomeCapa);
$extensaoCapa = end($arquivoArrayCapa);
$arquivoCapa = $caminho.md5(time().rand(3212, 15452)).'.'.$extensaoCapa;


$arquivoArray = explode(".", $nomeArquivo);
$extensao = end($arquivoArray);
$arquivo = $caminho.md5(time().rand(3212, 15452)).'.'.$extensao;

if (!is_dir($caminho)) {
    mkdir($caminho);
    chmod($caminho, 777);
}

// COMO VERIFICAR SE 2 ARQUIVOS FORAM MOVIDOS DE DIFERENTES INPUTS ?

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

   // Prepara a inserção no banco de dados
    $inserir = $con->prepare("INSERT INTO $tabela1(imagem) VALUES('$arquivo')");
    $inserir->execute(); // Execute a inserção

    $last = $inserir->lastInserId();

    $inserirCapa = $con->prepare("INSERT INTO $tabela2(idGaleria, imagem) VALUES($last, '$arquivoCapa')");
    $inseriCapa = $inserirCapa->execute(); // Execute a inserção

}
  if ($inseriCapa && $inseri) { // Caso a inserção ocorra bem exibira uma mensagem de sucesso.
echo '<div class="alert alert-success" role="alert">Salvo com sucesso!</div>';
  }
  else { // Caso a inserção ocorra mal exibira uma mensagem de erro.
echo '<div class="alert alert-danger" role="alert">Erro ao inserir no banco de dados!</div>';
  }
}  

The mistake:

Fatal error: Call to Undefined method Pdostatement::lastInserId() in /var/www/guilledev/includes/conexao.php on line 293

  • I updated my reply from your comment.

  • It turns out that you prepared the query, but did not link the parameters to the Prepared statment, and your syntax is misspelled.

3 answers

1

I could not with any of the options but they showed me a very good "north".

I did it this way only now the problem is that I only inserted an image in album even if I select two.

(The cover image is normally inserted and the lastid also works)

THE HTML:

<div class="form-group">
                        <label class="col-md-1 control-label" for="nome">Nome</label>  
                        <div class="col-md-6">
                          <input id="nome" name="nome" type="text" placeholder="" class="form-control input-md" required>
                        </div>
                      </div>

                      <!-- Text input --> 
                      <div class="form-group">
                        <label class="col-md-1 control-label" for="imagem">Capa:</label>  
                        <div class="col-md-4">
                          <input type="file" name="capa" class="form-control" required/>
                        </div>
                      </div>


                      <!-- Text input-->
                      <div class="form-group">
                        <label class="col-md-1 control-label" for="imagem">Album:</label>  
                        <div class="col-md-4">
                          <input type="file" name="imagem[]" class="form-control" multiple required/>
                        </div>
                      </div>

                      <!-- Button -->
                      <div class="form-group">
                        <label class="col-md-1 control-label" for="salvar"></label>
                        <div class="col-md-5">
                          <button id="salvar" class="btn btn-primary btn-lg">Salvar</button>
                        </div>
                      </div>

A Function:

function criar_album($tabela, $dados){
$con = conectar();
$caminho = 'uploads/';
$nome = $_POST['nome'];
$qtd = count($_FILES["imagem"]["name"]);
if ($qtd > 1){
    $nomeArquivoCapa = $_FILES["capa"]["name"];
    $nomeTemporarioCapa = $_FILES["capa"]["tmp_name"];
    $tamanhoArquivoCapa = $_FILES["capa"]["size"];

    $arquivoArrayCapa = explode(".", $nomeArquivoCapa);
    $extensaoCapa = end($arquivoArrayCapa);
    $arquivoCapa = $caminho.md5(time().rand(3212, 15452)).'.'.$extensaoCapa;

    for ($i=0; $i < $qtd; $i++) { 
        $nomeArquivo = $_FILES["imagem"]["name"][$i];
        $nomeTemporario = $_FILES["imagem"]["tmp_name"][$i];
        $tamanhoArquivo = $_FILES["imagem"]["size"][$i];

        if (!empty($nomeArquivo) && !empty($nomeArquivoCapa)) {

            $arquivoArray = explode(".", $nomeArquivo);
            $extensao = end($arquivoArray);
            $arquivo = $caminho.md5(time().rand(3212, 15452)).'.'.$extensao;


            if (move_uploaded_file($nomeTemporarioCapa, $arquivoCapa)) {
                $inserir = $con->prepare("INSERT INTO capa(nome, imagem) VALUES('$nome', '$arquivoCapa')");
                        $inseri = $inserir->execute(); // Execute a inserção

                        $last = $con->lastInsertId();
                        if (move_uploaded_file($nomeTemporario, $arquivo)) {
                            $inserir = $con->prepare("INSERT INTO $tabela(idCapa, imagem) VALUES('$last', '$arquivo')");
                            echo var_dump($inserir);
                $inseri = $inserir->execute(); // Execute a inserção    
            }
        }
        else {
            echo "Erro!";
        }
    }
}
echo '<div class="alert alert-success" role="alert">Salvo com sucesso!</div>';
   }
}

After using the var_dump($inserir) the query is normally displayed but only one...

Object(Pdostatement)[3] public 'queryString' => string 'INSERT INTO album(idCapa, imagem) VALUES('8', 'uploads/fd4123f913ba671bc75f6493a3fd1f23.png')' (length=93) Error!

  • if ($qtd > 1){, would not be if ($qtd > 0){ ?

  • I was able to solve @rray, the problem was the for insertion loop and not this if that Voce mentioned.

0

Who has the method lastInserId() is class PDO and not the Pdostatement, in that case change $inserir for $con.

Change:

$last = $inserir->lastInserId();

For:

$last = $con->lastInserId();

It seems to me better to extract the logic of the upload to a function, this will eleminate the duplication between image and cover, I suggest you create this function, mkdir() and chmod() may be part of that function if it deems it appropriate.

function upload($arquivo, $destino){
    $arq = pathinfo($arquivo['name']);
    $arq = $destino.md5(time().rand(3212, 15452)).'.'.$arq['extension'];

    if(move_uploaded_file($arquivo['tmp_name'], $arq)){
        return array('nome' => $arq, 'nome_original' => $arquivo, 'sucesso' => true);
    }else{
        return array('nome' => '', 'nome_original' => $arquivo, 'sucesso' => false);
    }
}

Master code:

$totalImagens = count($_FILE['imagem']['name']);
foreach($_FILE['imagem']['name'] as $imagem){
    $album[] = upload($_FILE['imagem'], $caminho);  
}

$capa = upload($_FILE['capa'], $caminho);
$imagensUpadas = array_count_values(array_column($album, 'sucesso'));

if($imagens_upadas['true'] == $totalImagens && capa['sucesso']){

    foreach($album as $imagem){
        $inserir = $con->prepare("INSERT INTO $tabela1(imagem) VALUES(?)");
        $inserir->execute(array($imagem['nome']));

        $last = $con->lastInserId();

        $inserirCapa = $con->prepare("INSERT INTO $tabela2(idGaleria, imagem) VALUES(?, ?)");
        $inseriCapa = $inserirCapa->execute(array($last, $capa['nome']));
    }   
}else{
  //Aqui pode fazer um função para apagar algum upload
}

With the help of: Count of Duplicate Elements in an array in php

  • Script is not inserting the image in the table galeriasto only in capa, how could I check on move_uploaded_file more than 1 file moved ?

  • That answer is a little confusing, when the move_uploades_fileis called...I do not understand very well he will execute the 2 at the same time?

  • @Rafaelacioly, upload() single upload, $capa and $imagem has the information if the upload went right or not and image name.

  • my function of criarAlbum would have only this code snippet that Voce marked as main ?

  • @Rafaelacioly, that’s right

  • The errors presented; pathinfo() expects parameter 1 to be string, array given in /var/www/guilledev/includes/conexao.php on line 260, move_uploaded_file() expects parameter 1 to be string, array given in /var/www/guilledev/includes/conexao.php on line 263

  • The file name (randomly) is in $arq['nome'], I edited the answer, @Rafaelacioly if you need anything else say there.

  • Ahhh understood in the picture field you send more than one certain?

  • Yes, it’s an album! rs

  • Roughly you’ll need one foreach for $_FILES['imagem'] @Rafaelacioly. I will edit again.

Show 6 more comments

0

lastInserId() must be related to the connection and not to the query output.

Tries to replace:

$last = $inserir->lastInserId(); 

For:

$last = $con->lastInserId();

Also, I made another move_uploaded_file to save the file in the other table, as your comment.

<?php

function criarAlbum($tabela1, $tabela2, $dados) {
    $con = conectar();

    $caminho = 'uploads/';

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

    $nomeCapa = $_FILES["capa"]["name"];
    $nomeTemporarioCapa = $_FILES["capa"]["tmp_name"];
    $tamanhoArquivoCapa = $_FILES["capa"]["size"];

    $arquivoArrayCapa = explode(".", $nomeCapa);
    $extensaoCapa = end($arquivoArrayCapa);
    $arquivoCapa = $caminho . md5(time() . rand(3212, 15452)) . '.' . $extensaoCapa;


    $arquivoArray = explode(".", $nomeArquivo);
    $extensao = end($arquivoArray);
    $arquivo = $caminho . md5(time() . rand(3212, 15452)) . '.' . $extensao;

    if (!is_dir($caminho)) {
        mkdir($caminho);
        chmod($caminho, 777);
    }

// COMO VERIFICAR SE 2 ARQUIVOS FORAM MOVIDOS DE DIFERENTES INPUTS ?

    if (move_uploaded_file($nomeTemporario, $arquivo)) {
        // Prepara a inserção no banco de dados
        $inserir = $con->prepare("INSERT INTO $tabela1(imagem) VALUES('$arquivo')");
        $inserir->execute(); // Execute a inserção

        $last = $con->lastInserId();
        if (move_uploaded_file($nomeTemporarioCapa, $arquivoCapa)) {
            // Prepara a inserção no banco de dados
            $inserir = $con->prepare("INSERT INTO $tabela2(idGaleria, imagem) VALUES($last,'$arquivoCapa')");
            $inserir->execute(); // Execute a inserção
        }
    }


    if ($inseriCapa && $inserir) { // Caso a inserção ocorra bem exibira uma mensagem de sucesso.
        echo '<div class="alert alert-success" role="alert">Salvo com sucesso!</div>';
    } else { // Caso a inserção ocorra mal exibira uma mensagem de erro.
        echo '<div class="alert alert-danger" role="alert">Erro ao inserir no banco de dados!</div>';
    }
}
?>
  • Script is not inserting the image in the table galerias only in capa, how could I check on move_uploaded_file more than 1 file moved ?

  • I edited my answer to meet your modification. I hope I helped!

  • these are the errors; explode() expects parameter 2 to be string, array given in /var/www/guilledev/includes/conexao.php on line 277, end() expects parameter 1 to be array, null given in /var/www/guilledev/includes/conexao.php on line 27, move_uploaded_file() expects parameter 1 to be string, array given in /var/www/guilledev/includes/conexao.php on line 288, Undefined variable: inseriCapa in /var/www/guilledev/includes/conexao.php on line 302

  • You’re posting more than one file as cover?

  • not Allan, only 1

Browser other questions tagged

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