Ir para conteúdo
Fórum Script Brasil
  • 0

Tratando erros com restrinções em chaves estrangeiras em PHP


Fagner Cruz

Pergunta

Olá a todos do forum,

Este é meu primeiro post, pois estou com um certo problema um pouco chato, porém pesquisei nos forum e não achei algo semelhante.

O problema é o seguinte: tenho um pequeno sistema em php + mysql rodando localmente. Antes, eu usava a engine MyISAM, fazia as operações de insert, update, delete tudo ok, sem nenhum problema e para verificar o sucesso ou falha em alguma operação de inclusão eu usava o seguinte código de teste

$resultado = mysql_query ("insert into estoque (nome,qtde,almox) values ('$id_prod',345,'$id_almox')");
$linhas = mysql_affected_rows();
if (!($linhas){
   echo "Falha";
}else    {
   echo "Sucesso";
}

Como surgiu a necessidade de se utilizar chaves estrangeiras e aproveitar as rstrinções baseada nelas, mudei a engine para InnoDB. O único problema que me surgiu foi que, ao induzir o sistema a inserir um tupla onde um ou mais valores dos campos correspondia a uma chave inexistente em outra tabela, o mysql disparava um erro, o que era de se esperar, entretanto no meu código php o else era executado, como se mesmo havendo o erro devido as restrinções das chaves estrangeiras, o método mysql_affected_rows() retornasse um valor positivo. Qualquer outra indução a erro que não levasse a estrinção às chaves, o mysql_affected_rows() retornava zero, levando a execução do bloco if corretamente.

Gostaria de saber se eu estou verificando de forma correta ou o meu código é falho e existe uma forma melhor de verificar essas restrições em php?

Sem mais, agradeço antecipadamente a todos os membros deste excelente forum pela atenção prestada.

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
Olá a todos do forum,

Este é meu primeiro post, pois estou com um certo problema um pouco chato, porém pesquisei nos forum e não achei algo semelhante.

O problema é o seguinte: tenho um pequeno sistema em php + mysql rodando localmente. Antes, eu usava a engine MyISAM, fazia as operações de insert, update, delete tudo ok, sem nenhum problema e para verificar o sucesso ou falha em alguma operação de inclusão eu usava o seguinte código de teste

$resultado = mysql_query ("insert into estoque (nome,qtde,almox) values ('$id_prod',345,'$id_almox')");
$linhas = mysql_affected_rows();
if (!($linhas){
   echo "Falha";
}else    {
   echo "Sucesso";
}

Como surgiu a necessidade de se utilizar chaves estrangeiras e aproveitar as rstrinções baseada nelas, mudei a engine para InnoDB. O único problema que me surgiu foi que, ao induzir o sistema a inserir um tupla onde um ou mais valores dos campos correspondia a uma chave inexistente em outra tabela, o mysql disparava um erro, o que era de se esperar, entretanto no meu código php o else era executado, como se mesmo havendo o erro devido as restrinções das chaves estrangeiras, o método mysql_affected_rows() retornasse um valor positivo. Qualquer outra indução a erro que não levasse a estrinção às chaves, o mysql_affected_rows() retornava zero, levando a execução do bloco if corretamente.

Gostaria de saber se eu estou verificando de forma correta ou o meu código é falho e existe uma forma melhor de verificar essas restrições em php?

Sem mais, agradeço antecipadamente a todos os membros deste excelente forum pela atenção prestada.

invés de verificar a quantidade de linhas afetadas pela sua query verifique o $resultado que você obterar o resultado correto de sua query false ou true;

para descobrir qual erro faça mais ou menos assim

if (!$resultado){

echo "Falha".mysql_error();

}else {

echo "Sucesso";

}

ou na propria variavel

$resultado = mysql_query ("insert into estoque (nome,qtde,almox) values ('$id_prod',345,'$id_almox')") or die(mysql_error());

até mais

Link para o comentário
Compartilhar em outros sites

  • 0
Bom, pelo que vi, você está verificando se a variável linhas têm algum valor, e ela sempre vai ter, afinal 0 também é um valor. Ou seja, nesse caso ai, sempre vai retornar "Sucesso".

Mas o if testa um valor "booleano" 0 para false e qualquer nº positivo para true, por isso antes funcionava pois quando a query dava erro (valor de linhas retornadas = 0) o bloco else era executado mas quando o erro é provocado pela restrição de FK isso não acontece.

invés de verificar a quantidade de linhas afetadas pela sua query verifique o $resultado que você obterar o resultado correto de sua query false ou true;

para descobrir qual erro faça mais ou menos assim

if (!$resultado){

echo "Falha".mysql_error();

}else {

echo "Sucesso";

}

ou na propria variavel

$resultado = mysql_query ("insert into estoque (nome,qtde,almox) values ('$id_prod',345,'$id_almox')") or die(mysql_error());

até mais

Olá rickayron, vou testar a sua sugestão e assim que obtiver os resultados eu posto aquí se houve sucesso ou não, mas mesmo assim muitíssimo obrigado pela sugestão.

Link para o comentário
Compartilhar em outros sites

  • 0

Fagner,

Analisei no manual do PHP (muito útil por sinal... baixa o chm que é um espetáculo) sobre a função mysql_affected_rows. Essa função retorna -1 em caso do statement SQL falhar (INSERT, UPDATE, DELETE).

E é isso que está acontecendo.... erro de constraint é um erro e vai retornar -1, passando pela seu desvio condicional.

Utilize apenas as funções mysql_errno e para mostrar o erro mysql_error.

Exemplo:

$resultado = mysql_query ("insert into estoque (nome,qtde,almox) values ('$id_prod',345,'$id_almox')");
if (mysql_errno()){
   echo "Falha".mysql_error();
}else    {
   echo "Sucesso";
}

Ainda através do número do erro é possível identificar se é erro de constraint.

Editando... para que apareça quando não inserir dados na tabela também, é bom usar o mysql_afected_rows... ou alterar a validação para verificar se menor que 1. Testa aí.

Espero ter ajudado melhor agora.... rs

Editado por Woody
Link para o comentário
Compartilhar em outros sites

  • 0
Fagner,

Analisei no manual do PHP (muito útil por sinal... baixa o chm que é um espetáculo) sobre a função mysql_affected_rows. Essa função retorna -1 em caso do statement SQL falhar (INSERT, UPDATE, DELETE).

E é isso que está acontecendo.... erro de constraint é um erro e vai retornar -1, passando pela seu desvio condicional.

Utilize apenas as funções mysql_errno e para mostrar o erro mysql_error.

Exemplo:

$resultado = mysql_query ("insert into estoque (nome,qtde,almox) values ('$id_prod',345,'$id_almox')");
if (mysql_errno()){
   echo "Falha".mysql_error();
}else    {
   echo "Sucesso";
}

Ainda através do número do erro é possível identificar se é erro de constraint.

Editando... para que apareça quando não inserir dados na tabela também, é bom usar o mysql_afected_rows... ou alterar a validação para verificar se menor que 1. Testa aí.

Espero ter ajudado melhor agora.... rs

Opa! muito obrigado pela sugestão, ainda não testei mas pelo jeito pode dar certo como você sugeriu. Assim que eu testar eu posto aquí os resultados.

Link para o comentário
Compartilhar em outros sites

  • 0

fazendo alguns teste cheguei a seguinte conclusão:

Como Woody havia comentado, o erro de statement do sql retorna -1 e por isso ele desviava do teste condicional. tanto a solução proposta por ele como a solução proposta por JCMPJ foram eficazes. agradeço a todos que puderam me ajudar neste problema. Muitíssimo obrigado a todos do forum.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...