1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[PHP][Resolvido]mysql_query (Insert... )or die + equivalente a TryCatch

Discussão em 'Web Development' iniciada por Armadillo, 21 de Dezembro de 2007. (Respostas: 20; Visualizações: 3887)

  1. Armadillo

    Armadillo Folding Member

    Boas pessoal.
    Entao la venho eu com o mesmo assunto: PHP.

    É assim, eu tou a inserir um registo no mysql
    PHP:
    $sqlSTR="Insert into tdu_reg_import (Nome_Fich, Data_Fich, Data_Import) values ('" $FicheiroOrigem "' ,  now(), now() )";
            
    $ExecutaSQL mysql_query ($sqlSTR) or die ("Inserção inválida!!" $sqlSTR);        

    Só que se o registo ja existir, capuum!! die!
    Será que eu posso fazer isto:
    PHP:
    $sqlSTRIns="Insert into tdu_reg_import (Nome_Fich, Data_Fich, Data_Import) values ('" $FicheiroOrigem "' ,  now(), now() )";
    $sqlSTRUpdate="Update tdu_reg_import ...";
    $ExecutaSQL mysql_query ($sqlSTRIns) or mysql_query ($sqlSTRUpdate);
    senao, como é que faço para actualizar a bd se o resgisto ja existir?:009:

    Thank you guys!!
     
    Última edição: 2 de Janeiro de 2008
  2. hasta.g5

    hasta.g5 I quit My Job for Folding

    PHP:
    $query "SELECT * FROM tdu_reg_import WHERE Nome_Fich='$FicheiroOrigem'";
    $result mysql_query($query) or die(mysql_error());
    if(
    mysql_num_rows($result)) {
         
    //Se existir
    }
    else {
         
    //Se não existir
    }
     
  3. Armadillo

    Armadillo Folding Member

    heiha mano... isso ja é muito query... :( lol

    nao ha forma de fazer um try->catch e se der erro de duplicação de dados ai trato o erro e em vez de inserir, actualizo os dados?

    Eu queria era evitar ter de fazer uma selecção á bd.
    mas se tiver que ser,lá terá que ser...

    Obrigado.
     
  4. hasta.g5

    hasta.g5 I quit My Job for Folding

    Hmm... Não sei se funciona, penso que não. Acho que quando fazes um query que dá erro na base de dados, recebes sempre uma mensagem na página. Se houver alguma maneira para fazer o que pretendes, acho que a solução que deste seria a que funcionaria. Já testaste?

    Sendo que estás a procurar nomes de ficheiros, em vez de procurares na base de dados podes ver mesmo se eles existem no disco.

    Mas se essa tabela não for muito grande, não vejo o problema de fazer mais uma query.
     
  5. Armadillo

    Armadillo Folding Member

    nao posso ir la pelo nome di ficheiro. pa, a tabela pode ter mais de 135000 registos :004: (assim por alto).
    pá, php nao é o meu forte e debugar e try-catch nisto nao tou a ver como funcionam!
    Se alguem souber como tratar erros em PHP, chibe-se por favor.
     
  6. hasta.g5

    hasta.g5 I quit My Job for Folding

    Eu agora não te posso testar isso, mais tarde talvez.

    Entretanto fica aqui uma nota. Se de facto o registo existir, vais fazer o mesmo número de queries à BD que fazes com o teste do SELECT. Acrescentando LIMIT 1 ao SELECT faz com que ele pare se encontrar uma ocorrência o que sempre diminui o peso. Se prevês que isso vai acontecer muito, o teste não é assim tão mau.
     
  7. Armadillo

    Armadillo Folding Member

    Sim, claro.
    É assim, isto é pra correr todos os dias ás tantas da manhã...
    Mas também vai importar para a bd tons de registos todos os dias.
    Mas fazer um query destes mesmo com o limit ainda fica bem pesado, e entao multiplicas isto por 1000,2000,3000 registos e:freak3: na chamada seguinte, o processo anterior ainda tava a correr.

    Mas vou testar esta treta e depois digo alguma coisa.

    Em relação ao try->catch continuem a postar por favor...

    Obrigado hasta.g5
     
  8. p3dro

    p3dro Power Member

    O campo é uma chave primária? ou está definido como index do tipo Unique?
     
  9. hasta.g5

    hasta.g5 I quit My Job for Folding

    Deduzo que seja unique, para dar erro quando tentas introduzir um ficheiro com o mesmo nome.

    Não há-de ser assim tão pesado, por muitos milhares de entradas que sejam. Senão não havia Techzone para ninguém. =P
     
  10. Armadillo

    Armadillo Folding Member

    primary key apenas...
     
  11. p3dro

    p3dro Power Member

    Não sei se isto vai funcionar correctamente, mas tenta fazer desta maneira:

    PHP:
    $sqlInsert="Insert into tdu_reg_import (Nome_Fich,Data_Fich,Data_Import) values ('$FicheiroOrigem',now(),now())";
    $sqlUpdate="Update tdu_reg_import ...";

    if(!
    mysql_query($sqlInsert)){
      
    mysql_query($sqlUpdate);
    }
     
  12. Armadillo

    Armadillo Folding Member

    parece-me bem! vou testar e depois digo se funca! :p
     
  13. hasta.g5

    hasta.g5 I quit My Job for Folding

    A sugestão que deste funciona, Armadillo.

    Testei com os seguintes php's:

    createdb.php
    PHP:
    mysql_connect('...','...','...') or die(mysql_error());
    mysql_select_db('teste') or die(mysql_error());

    $query 'CREATE TABLE teste ( id INT NOT NULL PRIMARY KEY , blabla VARCHAR( 10 ))';
    mysql_query($query) or die(mysql_error());
    teste.php
    PHP:
    mysql_connect('...','...','...') or die(mysql_error());
    mysql_select_db('teste') or die(mysql_error());

    $insQuery "INSERT INTO teste ( id , blabla ) VALUES ( 5 , 'lalala')";
    $updQuery "UPDATE teste SET blabla='la' WHERE id=5";
    mysql_query($insQuery) or mysql_query($updQuery);
    Correndo a primeira vez tens "lalala" na coluna blabla e da segunda tens "la", isto sem mostrar nenhum tipo de erro na página.
     
  14. Armadillo

    Armadillo Folding Member

    Rock n Roll!!
    Testei a tua e a minha sugestao e infelizmente nao consegui (devo tar todo cego e a mandar as vars erradas).
    Cool!
    Obrigadão:p
     
  15. hasta.g5

    hasta.g5 I quit My Job for Folding

    Faz echo's para saberes que queries estás a mandar, sempre ajuda.
    Que erros é que estás a ter?
     
  16. Armadillo

    Armadillo Folding Member

    ai está, nenhum. ele corre tudo direitinho mas na bd nao tao actualizados os dados. Vê se me está a escapar alguma coisa:
    PHP:
            $sqlSTR="Insert into tdu_reg_import (Nome_Fich, Data_Fich, Data_Import) values ('" basename($FicheiroOrigem) . "' ,  now(), now() )";
            
    $sqlUpdate="Update tdu_reg_import SET Data_Fich=now(), Data_Import=now() = WHERE Nome_Fich='" basename($FicheiroOrigem) . "'";
        

            
    $ExecutaSQL mysql_query ($sqlSTR) or mysql_query ($sqlUpdate);        
            
    Obrigado
     
  17. AliFromCairo

    AliFromCairo Power Member

    Boas, podes sempre criar um Trigger no MySQL que faz a verificação, e actualiza a tua tabela caso seja necessário.
     
  18. hasta.g5

    hasta.g5 I quit My Job for Folding

    Experimenta isto, para saberes que erros te está a dar:
    PHP:
    $sqlSTR="Insert into tdu_reg_import (Nome_Fich, Data_Fich, Data_Import) values ('" basename($FicheiroOrigem) . "' ,  now(), now() )";
    $sqlUpdate="Update tdu_reg_import SET Data_Fich=now(), Data_Import=now() = WHERE Nome_Fich='" basename($FicheiroOrigem) . "'";

    if (!
    mysql_query($sqlSTR)) {
       echo 
    'sqlSTR - '.mysql_error();
       if (!
    mysql_query($sqlUpdate)) {
          echo 
    'sqlUpdate - '.mysql_error();
       }
    }
    Já agora uma nota, se estiveres em unix acho que o nome dos ficheiros é case-sensitive.
     
    Última edição: 21 de Dezembro de 2007
  19. Armadillo

    Armadillo Folding Member

    Solved.
    Nabice minha - erro no sql
    :dormir2:
     
  20. fulgas

    fulgas Power Member

    Ainda bem que resolveste. O mysql tem a syntax ON DUPLICATE para efectuares updates as chaves q já esxistem.
     

Partilhar esta Página