Foreach - check and record only those not in the BD

Asked

Viewed 547 times

1

Inside a foreach I need to make an Insert in my database only of the records that are not recorded, thus avoiding duplication of records, but I couldn’t imagine a solution to check if a record is recorded in the bank and if I’m ignoring and checking the next one, what I have is this:

    // Recebendo o array com os ID´S
$checkboxes = $_POST['check'];  

// laço para buscar ID´s e efetuar cadastro
foreach($checkboxes as $IdColaborador) {

    $IdTreinamento = $_POST['IdTreinamento'];

    // Verificando se Treinamento e Colaborador já existe 
    mysql_select_db($database_conexao, $conexao);
    $query_rsVerifica = "SELECT * FROM treParticipantesTreinamento WHERE IdTreinamento = $IdTreinamento AND IdColaborador = $IdColaborador";
    $rsVerifica = mysql_query($query_rsVerifica, $conexao) or die(mysql_error());
    $row_rsVerifica = mysql_fetch_assoc($rsVerifica);
    $totalRows_rsVerifica = mysql_num_rows($rsVerifica);

    // Buscando dados do Colaborador
    mysql_select_db($database_conexao, $conexao);
    $query_rsRegistro = "SELECT * FROM comColaborador WHERE IdColaborador = $IdColaborador AND ativo = 1";
    $rsRegistro = mysql_query($query_rsRegistro, $conexao) or die(mysql_error());
    $row_rsRegistro = mysql_fetch_assoc($rsRegistro);
    $totalRows_rsRegistro = mysql_num_rows($row_rsRegistro);

    // Buscando dados do Treinamento                
    mysql_select_db($database_conexao, $conexao);
    $query_rsTreinamento = "SELECT * FROM treTreinamento WHERE IdTreinamento = $IdTreinamento";
    $rsTreinamento = mysql_query($query_rsTreinamento, $conexao) or die(mysql_error());
    $row_rsTreinamento = mysql_fetch_assoc($rsTreinamento); 
    $totalRows_rsTreinamento = mysql_num_rows($row_rsTreinamento);

    // Dados do Colaborador
    $Nome = $row_rsRegistro['nome'];
    // Dados do Treinamento
    $Horas = $row_rsTreinamento['CargaHoraria'];
    $FezTreinamento = 0;    
    $Log = $row_rsTreinamento['Log'];       

    // Inserindo dados no banco de dados se não existir cadastro        
    mysql_select_db($database_conexao, $conexao);
    $sqlTreinamento = "INSERT INTO treParticipantesTreinamento ( 
                    IdTreinamento, 
                    IdColaborador,
                    Nome,
                    Horas,
                    FezTreinamento,
                    Log ) 
                VALUES (
                    '$IdTreinamento', 
                    '$IdColaborador',
                    '$Nome',                        
                    '$Horas',   
                    '$FezTreinamento',                      
                    '$Log')";                               
    $resultado = mysql_query($sqlTreinamento, $conexao) or die ("Erro Inserindo Registro: " . mysql_error());

    // 1 = TRUE, 2 = FALSE
    $status = $resultado;       

} // fim do foreach*/
  • Two options, use the REPLACE in place of INSERT or make a query comparing the data that cannot be repeated and if records result give a continue in the foreach...

  • Hello @Jader, can you give me an example of the Continue command? Thanks.

  • something like this after consultation: if ($num_rows > 0) continue;

2 answers

2


Do it like this:

    // Recebendo o array com os ID´S
    $checkboxes = $_POST['check'];  

    $IdTreinamento = $_POST['IdTreinamento'];    

    // Verificando os Colaboradores existente 

    mysql_select_db($database_conexao, $conexao);
    $query_rsVerifica = "SELECT * FROM treParticipantesTreinamento WHERE IdTreinamento = $IdTreinamento";
    $rsVerifica = mysql_query($query_rsVerifica, $conexao) or die(mysql_error());
    $totalRows_rsVerifica = mysql_num_rows($rsVerifica);
    $trePT = Array();
    if ($totalRows_rsVerifica > 0)
       while ($row_rsVerifica = mysql_fetch_assoc($rsVerifica)) $trePT[] = $row_rsVerifica['IdColaborador'];



// laço para buscar ID´s e efetuar cadastro
foreach($checkboxes as $IdColaborador) {

    // Se colaborador existir passa para próximo
    if (in_array($IdColaborador, $trePT)) continue;

    // Buscando dados do Colaborador
    mysql_select_db($database_conexao, $conexao);
    $query_rsRegistro = "SELECT * FROM comColaborador WHERE IdColaborador = $IdColaborador AND ativo = 1";
    $rsRegistro = mysql_query($query_rsRegistro, $conexao) or die(mysql_error());
    $row_rsRegistro = mysql_fetch_assoc($rsRegistro);
    $totalRows_rsRegistro = mysql_num_rows($row_rsRegistro);

    // Buscando dados do Treinamento                
    mysql_select_db($database_conexao, $conexao);
    $query_rsTreinamento = "SELECT * FROM treTreinamento WHERE IdTreinamento = $IdTreinamento";
    $rsTreinamento = mysql_query($query_rsTreinamento, $conexao) or die(mysql_error());
    $row_rsTreinamento = mysql_fetch_assoc($rsTreinamento); 
    $totalRows_rsTreinamento = mysql_num_rows($row_rsTreinamento);

    // Dados do Colaborador
    $Nome = $row_rsRegistro['nome'];
    // Dados do Treinamento
    $Horas = $row_rsTreinamento['CargaHoraria'];
    $FezTreinamento = 0;    
    $Log = $row_rsTreinamento['Log'];       

    // Inserindo dados no banco de dados se não existir cadastro        
    mysql_select_db($database_conexao, $conexao);
    $sqlTreinamento = "INSERT INTO treParticipantesTreinamento ( 
                    IdTreinamento, 
                    IdColaborador,
                    Nome,
                    Horas,
                    FezTreinamento,
                    Log ) 
                VALUES (
                    '$IdTreinamento', 
                    '$IdColaborador',
                    '$Nome',                        
                    '$Horas',   
                    '$FezTreinamento',                      
                    '$Log')";                               
    $resultado = mysql_query($sqlTreinamento, $conexao) or die ("Erro Inserindo Registro: " . mysql_error());

    // 1 = TRUE, 2 = FALSE
    $status = $resultado;       

} // fim do foreach*/
  • Hi @Carlos, I just made a change, I put your initial check inside my foreach, because there was no way to get the employee ID and then it was perfect, thanks for the great help.

  • Opa @adventistapr beauty, actually I was supposed to have removed the AND IdColaborador = $IdColaborador that ai need not be doing another query inside the loop, I fixed there, see if it works there.

  • That’s really true, thanks for the help and precious help @Carlos.

-1

Avoid using mysql_* functions as they are in the process of being discontinued. Instead use PDO or mysqli.

An example of optimizing your code would be using Prepared statements:

$conn = new PDO('connstr', 'usuario','senha');
$prepared = $conn->prepare("SELECT * FROM comColaborador WHERE IdColaborador = :ID AND ativo = 1");

foreach($checkboxes as $IdColaborador) {
  $prepared->bindValue(':ID', $idColaborador, PDO::PARAM_INT);
  $exec = $prepared->execute();
}

With the above technique you 'prepare' the employee consultation only once at the bank and only change your parameter for each employee. This will make the code much faster.

Browser other questions tagged

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