Insert image into 2 different tables [duplicate]

1

I created a function to register images as if it were an album;

A table for capa and a table for galeria .

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 error:

  

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

    
asked by anonymous 11.09.2015 / 17:36

3 answers

1

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

I did it this way, but now the problem is that I only insert an image into an album even if I select two.

(Cover image is inserted normally and lastid works as well)

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 var_dump($inserir) the query is normally displayed but only one ...

  

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

    
11.09.2015 / 21:35
0

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

Try to replace:

$last = $inserir->lastInserId(); 

By:

$last = $con->lastInserId();

In addition, I made another move_uploaded_file to save the file in the other table, according to 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>';
    }
}
?>
    
11.09.2015 / 17:44
0

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

Switch:

$last = $inserir->lastInserId();

By:

$last = $con->lastInserId();

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

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);
    }
}

Primary 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

    
11.09.2015 / 17:44