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?
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.
Estou vendo agora que você marcou PHP, a lógica é a mesma, vai usar a lib do php(não sei qual é…kk)
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);
}
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
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.