Multiple image file

2

There I come to you for help novalmente! I created a function to register images in the database, one of them being the cover and the rest of the album images.

The script even registers the cover image and album, but the album is only registered in the 1 (one) image bank, the most curious thing is that the files are moved to the uploads/ folder but are not registered in the database .

HTML:

<?php //Chama a função inserir caso tenha algum dado em POST (includes/conexao)
   if (isset($_POST['salvar'])) {
   criar_album('albumImagens', 'capa', $_POST);
}  
?>

<form class="form-horizontal" method="POST" action="" enctype="multipart/form-data" runat="server" />
<fieldset>

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

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

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

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

   </fieldset>
   </form>

A function:

function criar_album($album, $destaque, $dados){
$con = conectar();
$caminho = 'uploads/';
$nome = $_POST['nome'];
$qtd = count($_FILES["imagem"]["name"]);

if ($qtd > 0){
   $nomeArquivoCapa = $_FILES["capa"]["name"];
   $nomeTemporarioCapa = $_FILES["capa"]["tmp_name"];
   $tamanhoArquivoCapa = $_FILES["capa"]["size"];

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


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

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

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

        if (move_uploaded_file($nomeTemporario, $arquivo)) {
        $inserir = $con->prepare("INSERT INTO $album(idCapa, imagem) VALUES('$last', '$arquivo')");
        $inseri = $inserir->execute(); // Execute a inserção    
        }

    else {
        echo '<div class="alert alert-danger" role="alert">Erro, tente novamente mais tarde!</div>';
        }
    }   
}

    }
echo '<div class="alert alert-success" role="alert">Salvo com sucesso!</div>';
  }
}

SQL Structure:

Table capa : ID, Name and Image

Table albumImagens : idCap, image

What seems to happen is that the for is not working, because it only makes one pass and nothing else. The% This is moving all the images at once in my view ...

  

I executed if (move_uploaded_file($nomeTemporario, $arquivo)) to see if var_dump($inserir) is being   generated and I noticed that they are being generated YES but execute only    querys happens by inserting only 1 image in the database.

object(PDOStatement)#3 (1) { ["queryString"]=> string(101) "INSERT INTO albumImagens(idCapa, imagem) VALUES('59', 'uploads/16487b1c9236bca1231deafb2e711d15.png')" } object(PDOStatement)#1 (1) { ["queryString"]=> string(101) "INSERT INTO albumImagens(idCapa, imagem) VALUES('59', 'uploads/7cb40a35907252ef2e0c401bc0561b1c.png')" }

Only image 1 with end UMA VEZ is being inserted ...

    
asked by anonymous 18.09.2015 / 22:00

2 answers

1

When it comes to developing a project, or creating a helper script, it is essential to be calm above all else, because writing code with more than 100 lines already starts to be a bit complicated when it comes to finding } , or ; in the middle of so many functions, variables and arguments, in your code, I confess that it was not different, above all I did not have notas what is usually good sometimes even for the code author itself. p>

What follows are some possible improvements I've introduced to your script , to make it more objective / efficient.

Functions

<?php

$pdo = new PDO("mysql: hostname=localhost; dbname=example;", "root", "");

// Nesta função trabalhamos uma vez mais a array, de modo a obtermos a mesma ID
function array_final($array, $id){
    if(is_array($array)){
        foreach($array as $im){
            $f[] =  array("imagem"=>$im, "id"=>$id);
        }   
        $valores = array();
        foreach($f as $p){
            $valores = array_merge($valores, array_values($p));
        }
        return $valores;
    } else {
        return false;   
    }
}

function imagens($array, $nome=null){
    if(!empty($array) && isset($array)){
        // Esta linha imprime o nome dos ficheiros em maiusculo, para o caso de $nome for diferente de vazio    
        if(isset($nome)){
            // Para multiplos ficheiros (album) 
            if(is_array($array["name"])){
                foreach($array["name"] as $id=>$item){
                    $imagem[] = $item;  
                }   
            // Para o caso de o ficheiro selecionado  ser apenas 1 (CAPA)   
            } else {
                $explode = explode(".", $array["name"]);    
                return strtoupper($explode[0]); 
            }
            if(isset($imagem)){
                foreach($imagem as $id=>$img){
                    $explode[] = explode(".", $img);
                }   
                for($i=0; $i<count($explode);$i++){
                    $explodes[] = strtoupper(array_shift($explode[$i]));    
                }
                // Retorna uma array contento o nome e a extensao dos arquivos  
                return $explodes;   
            }   
        // Para o caso de $nome for igual a  0, ou vazio    
        } else {
            // Para multiplos ficheiros (album)     
            if(is_array($array["name"])){
                foreach($array["name"] as $id=>$item){
                    $imagem[] = $item;  
                }
            // Para o caso de o ficheiro selecionado  ser apenas 1 (CAPA)       
            } else {
                return $array["name"];  
            }
            if(isset($imagem)){
                // Retorna uma array contento o nome e a extensao dos arquivos  
                return $imagem; 
            }   
        }
    } else {
        return false;   
    }   
}

function enviar($ficheiro, $caminho){
    // Arquivo existe ? 
    if(count($ficheiro) <= 0){
        return false;   
    } else {
        // Para multiplos ficheiros (album)         
        if(is_array($ficheiro["name"])){
            foreach($ficheiro["name"] as $id=>$imagem){
                $upload = $caminho . basename($imagem);
                $estado = move_uploaded_file($ficheiro["tmp_name"][$id], $upload) ? true : false;   
            }   
        // Para o caso de o ficheiro selecionado  ser apenas 1 (CAPA)       
        } else {
            $upload = $caminho . basename($ficheiro["name"]);
            $estado = move_uploaded_file($ficheiro["tmp_name"], $upload) ? true : false;    
        }
        // se o ficheiro for movido com sucesso, retorna true como ultima declaracao
        if($estado == true){
            return true;    
        }   
    }   
}

function criar_album($album, $capa){
// chamar a váriavel pdo atravez do escopo global       
global $pdo;
// Caminho/diretorio para onde vao os ficheiros
$caminho = 'up/';
$qtd = count($_FILES["imagem"]["name"]);

if ($qtd > 0){
       $nomeArquivoCapa = $_FILES["capa"]["name"];
       $upload = $caminho . basename($nomeArquivoCapa);
       // Se o ficheiro de capa e o(s) ficheiro(s) forem movidos com sucesso
       if(enviar($_FILES["capa"], $caminho, "capa") && enviar($_FILES["imagem"], $caminho, "imagem")){
            // Prepara a primeira consulta SQL 
           $inserir = $pdo->prepare("INSERT INTO {$capa} (nome, imagem) VALUES (:nome, :imagem)");
           // Passando multiplos parametros atravez do metodo execute do PDO
           // inserir->execute(array(":bind1"=>valor1, "bind2"=>valor2, ...));
           $inserir->execute(array(":nome"=>imagens($_FILES["capa"], 1), ":imagem"=>imagens($_FILES["capa"])));
           // Captar a ultima ID inseriida
           $id = $pdo->lastInsertId();
            // Aqui iniciamos uma transação para maior fluidez  
           $pdo->beginTransaction();
           // calcular o numero de placeholders para a query em questao
           foreach(imagens($_FILES["imagem"]) as $p){
               $interr[] = '(?,?)';
           }
            // Aqui concatenamos os valores anteriormente trabalhados, incluindo os placeholders
           $sql = "INSERT INTO {$album} (imagem, idCapa) VALUES ". implode(",", $interr);   
           echo $sql;
           // Preparar a consulta SQL
           $inserir = $pdo->prepare($sql);
           try{
           // Executar a consulta, com multiplos parametros
           // INSERT INTO tabela (campo1, campo2) VALUES (?,?),(?,?)...
                $inserir->execute(array_final(imagens($_FILES["imagem"]), $id));
           // Capturar a exceção        
           } catch (PDOException $e){
           // Imprimir a exceção, se existir        
                $e->getMessage();
           }
           // Confirmar inclusao 
           $pdo->commit();
      } 
    }
}

?>

In this case, what was wanted was to register a set of values at one time in the database. However it was necessary to construct a query of this genre:

  

INSERT INTO table (field1, field2) VALUES (?,?), (?,?) ...

Once you have worked with placeholders then you put the pontos de interrogação in the place where the values would be replaced.

Since the result set for the query was something like this:

Array ( [0] => usr1.jpg [1] => 55 [2] => usr2.jpg [3] => 55 ) 

               (imagem)       (id)       (imagem)       (id)

According to the site , performing query using this process may even be faster than usual.

  

Above all, I just hope I have not complicated your life with these   new functions that I have added, I will soon edit my   I'll add some more details to explain what was going on with   your original code, or how to fix the problem on it.

Original Script

<?php

$pdo = new PDO("mysql: hostname=localhost; dbname=example;", "root", "");

function criar_album($album, $capa){
global $pdo;
$caminho = 'up/';
$nome = $_POST['nome'];
$qtd = count($_FILES["imagem"]["name"]);

if ($qtd > 0){
   $nomeArquivoCapa = $_FILES["capa"]["name"];
   $nomeTemporarioCapa = $_FILES["capa"]["tmp_name"];
   $tamanhoArquivoCapa = $_FILES["capa"]["size"];

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


    if (!empty($nomeArquivoCapa)) {
        $arquivoArrayCapa = explode(".", $nomeArquivoCapa);
        $extensaoCapa = end($arquivoArrayCapa);
        $arquivoCapa = $caminho.md5(time().rand(3212, 15452)).'.'.$extensaoCapa;
        // Descomente a linha para guardar a imagem com o nome original no banco de dados
        //$arquivo = $nomeArquivoCapa;

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

        if (!empty($nomeArquivo)) {
        $arquivoArray = explode(".", $nomeArquivo);
        $extensao = end($arquivoArray);
        $arquivo = $caminho.md5(time().rand(3212, 15452)).'.'.$extensao;
        // Descomente a linha para guardar a imagem com o nome original no banco de dados
        //$arquivo = $nomeArquivo;
        if (move_uploaded_file($nomeTemporario, $arquivo)) {
        $inserir = $pdo->prepare("INSERT INTO $album(idCapa, imagem) VALUES('$last', '$arquivo')");
        $inseri = $inserir->execute(); // Execute a inserção    
        }

    else {
        echo '<div class="alert alert-danger" role="alert">Erro, tente novamente mais tarde!</div>';
        }
    }   
}

    }
echo '<div class="alert alert-success" role="alert">Salvo com sucesso!</div>';
  }
}

?>

If you read the lines carefully, you will notice that I did not change anything, only 1 sinal was removed, which was in looping for .

From:

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

To:

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

I also changed the value name of the variable path, which was uploads , to up , the rest is the same thing. I confess that it still plays me trying to understand your code.

However, here you are doing upload and cadastro successfully, so you only have to cite the error.

The most likely error is in the structure of your table. This is how my table (s) is structured:

--
-- Estrutura da tabela 'albumimagens'
--

CREATE TABLE IF NOT EXISTS 'albumimagens' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'idCapa' int(11) NOT NULL,
  'imagem' varchar(36) NOT NULL,
  PRIMARY KEY ('id'),
  KEY 'idCapa' ('idCapa')
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;


CREATE TABLE IF NOT EXISTS 'capa' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'nome' varchar(36) NOT NULL,
  'imagem' varchar(36) NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=77 ;

Although the values in the% cos_defaults fields are insufficient for the varchar generated for the name of the images, the images were being halved.

Another thing is, if you look at my two tables, they both have a hash independent ID and primary key field, which for the case in question is mandatory and in others, is simply recommended. So if possible, delete and re-create the auto_increment table and try again.

Even more, and good luck.

Other sources:

PDO Prepared insert with mult. rows ...

    
21.09.2015 / 21:06
1

The problem that I noticed is this, as you approach it, your intention is to register an album with a cover image and the rest being extras. However, in your current role you have upload and cover log within loop for. So you are recording the album in the same amount of times as the image occurrences.

To solve this is simple simply remove the file code code from the album from within the for.

<?php
function criar_album($album, $destaque, $dados){
    $con = conectar();
    $caminho = 'uploads/';
    $nome = $_POST['nome'];
    $qtd = count($_FILES["imagem"]["name"]);

    if ($qtd > 0){
        $nomeArquivoCapa = $_FILES["capa"]["name"];
        $nomeTemporarioCapa = $_FILES["capa"]["tmp_name"];
        $tamanhoArquivoCapa = $_FILES["capa"]["size"];

        if(empty($nomeArquivoCapa)){
            echo '<div class="alert alert-danger" role="alert">Erro, capa nao inserida!</div>';
            return;
        }

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

        if (move_uploaded_file($nomeTemporarioCapa, $arquivoCapa)) {
            $inserir = $con->prepare("INSERT INTO $destaque(nome, imagem) VALUES('$nome', '$arquivoCapa')");
            $inseri = $inserir->execute(); // Execute a inserção
            $last = $con->lastInsertId();
        }else{
            echo '<div class="alert alert-danger" role="alert">Erro, tente novamente mais tarde!</div>';
        }

        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)) {
                $arquivoArray = explode(".", $nomeArquivo);
                $extensao = end($arquivoArray);
                $arquivo = $caminho.md5(time().rand(3212, 15452)).'.'.$extensao;

                if (move_uploaded_file($nomeTemporario, $arquivo)) {
                    $inserir = $con->prepare("INSERT INTO $album(idCapa, imagem) VALUES('$last', '$arquivo')");
                    $inseri = $inserir->execute(); // Execute a inserção    
                }else{
                    echo '<div class="alert alert-danger" role="alert">Erro, tente novamente mais tarde!</div>';
                }
            }

        }
        echo '<div class="alert alert-success" role="alert">Salvo com sucesso!</div>';
    }
}
    
21.09.2015 / 14:57