[RESOLVIDO] Dúvidas na inserção de registros em duas tabelas

5 respostas Resolvido
php
B

Olá a todos. Tenho uma dúvida no seguinte. Tenho uma tabela de produtos e uma tabela de tamanhos referente a esses produtos. Na tabela de produtos eu tenho um ID que é auto incrementado. Mas precisava gerar os registros de tamanhos referentes a esse produto e usaria esse ID do produto como chave estrangeira. Eu gostaria de cadastrar o produto e gerar um novo ID e gerar o registro na tabela de tamanhos referentes a esse ID. Mas até a inserção na tabela de tamanhos eu ainda não tenho o número do ID gerado do produto. Alguém tem uma solução ou sugestão simples para fazer isso?

5 Respostas

F

Olá Bruno, isso é simples de se fazer. está fazendo com java ? se sim a própria lib JDBC tem um método de recuperar o ID inserido numa tabela(você tem que passar um parâmetro para o statement) da uma pesquisada no google sobre isso que acha bem fácil, isso é o de menos.

No teu DAO(classe que você inseri na tabela produto) depois de inserir recupera o valor do ID e simplismente pega esse valor e insira na outra tabela com outro statement(outra query de insert).

Ficaria mais ou menos assim:

public void inserir(){
String queryProduto = "suaquery";
PreparedStatement ps = conn.prepareStatement(queryProduto, Statement.RETURN_GENERATED_KEYS);
Long id = null;
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
    id = rs.getInt(1);
}
if(id != null){
 //insira na outra tabela
}

}

Mais ou menos isso dai.

F

Estou vendo agora que você marcou PHP, a lógica é a mesma, vai usar a lib do php(não sei qual é…kk)

B

Na verdade eu já estou tentando resolver da seguinte forma:

O problema que consigo gerar o sql dos tamanhos mas ele não insere na tabela. Insere somente o produto principal com o id certinho. Mas a do tamanho não insere.

Se eu copiar a sql que imprimo e executar direto no banco da certinho. Mas pelo php só gera o retorno de “Erro grade”.

if(insereProduto($conexao,$produto)){

$id = localizaIdProduto($conexao);

if(insereGradeProduto($conexao,$id,$_POST[min],$_POST[max])){

echo Sucesso grade.;

}else{

echo Erro grade.;

}

$_SESSION[success]=Produto cadastrado com sucesso;

}else{

$_SESSION[danger]=Erro ao cadastrar produto;

}

function localizaIdProduto($conexao){

$query = SELECT MAX(id) id from PRODUTOS;

$consulta = mysqli_query($conexao,$query);

$resultado = mysqli_fetch_assoc($consulta);

return $resultado[id];

}

function insereGradeProduto($conexao,$id,$min,$max){

$query = “”;

for($i=$min;$i<=$max;$i++){

$query.=INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES ({$id},{$i});;

}

echo $query;

return mysqli_query($conexao, $query);

}
darlan_machado

O PHP apresenta opções para tratamento de exceção e você não utiliza nenhuma, por que?
Mesmo que seja um die da vida, você já conseguiria ter uma mensagem mais assertiva sobre a causa do problema.
O ideal seria utilizar, para envolver o bloco de conexão e execução da query, um try/catch

B
Solucao aceita

Opa. Já encontrei a solução.
Mudei a sql pra ser uma só. Parece que que não executa várias querys de uma vez só. Desculpem a abrição de tópicos. Mas eu pergunto quando não consigo pensar mais, mas vou pelejando até dar certo. Obrigado a todos. Só pra constar a minha solução:

function insereGradeProduto($conexao,$id,$min,$max){
    $query="";
    $query.="INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES";
    for($i=$min;$i<$max;$i++){
        $query.="({$id},{$i}),";
    }
    $query.="({$id},{$i});";
    return mysqli_query($conexao,$query);
}

Quanto ao tratamento de exceções falta mesmo. Sou iniciante no PHP e preciso colocar isso mesmo. Mas desde já agradeço.

Criado 18 de julho de 2018
Ultima resposta 18 de jul. de 2018
Respostas 5
Participantes 3