<pedrocorreia.net ⁄>
corner
<mySearch ⁄> <mySearch ⁄>

corner
 
corner
<mySnippets order="rand" ⁄> <mySnippets order="rand" ⁄>

corner
 
corner
<myContacts ⁄> <myContacts ⁄>

<email ⁄>


pc@pedrocorreia.net

<windows live messenger ⁄>


pedrojacorreia@hotmail.com

<myCurriculum type="pdf" ⁄>


Download
corner
 
corner
<myBlog show="last" ⁄> <myBlog show="last" ⁄>

corner
 
corner
<myNews show="rand" ⁄> <myNews show="rand" ⁄>

corner
 
corner
<myNews type="cat" ⁄> <myNews type="cat" ⁄>

corner
 
corner
<myQuote order="random" ⁄> <myQuote order="random" ⁄>

corner
 
corner
<myPhoto order="random" ⁄> <myPhoto order="random" ⁄>

<pedrocorreia.net ⁄>
corner
 
corner
<myAdSense ⁄> <myAdSense ⁄>

corner
 
corner
<myVisitorsMap ⁄> <myVisitorsMap ⁄>

corner
 
 

<Gerar instruções MySQL - Insert e Update ⁄ >




clicks: 13246 13246 2006-12-08 2006-12-08 goto mySnippets mySnippets php  Download  Bookmark This Bookmark This



Inserir e actualizar dados numa tabela é o pão nosso de cada dia para quem trabalham em bases de dados, quem trabalha com bases de dados, de certeza que já sabe as instruções SQL de cor e salteado, porém se podermos simplificar o nosso trabalho, melhor ainda.

Suponhamos que temos uma BD com a seguinte estrutura:
  1. # Table "dados_imagens" DDL
  2.  
  3. CREATE TABLE `dados_imagens` (
  4. `pk_imagem` tinyint(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  5. `descricao` varchar(255) NOT NULL DEFAULT '',
  6. `url` varchar(255) NOT NULL DEFAULT '',
  7. PRIMARY KEY (`pk_imagem`)
  8. ) ENGINE=MyISAM



Os campos são indiferentes já que o snippet é facilmente adaptado a qualquer tipo de tabela.

A função baseia-se em alguns pressupostos, o 1º elemento do array de campos e valores será o nome da chave primária.

Se por exemplo a valor do chave primária for >0 então partimos do principio que estamos a actualizar um registo, logo é gerado uma instrução Update; caso o 1º valor não seja um número ou seja =0, é gerada uma instrução Insert.
Existe ainda outra hipótese, caso queiramos "forçar" sempre uma instrução Insert, basta que o 4º parâmetro (isFirstFieldPk) da função seja false

nota: este snippet faz uso de uma função "left", a função é explicada noutro snippet

  1. <?php
  2. /**
  3. * @param $arrFields - array com o nome dos campos
  4. * @param $arrValues - array com o valor dos campos
  5. * @param $table - nome da tabela
  6. * @param $isFirstFieldPk - o 1º campo é uma chave primária?
  7. *
  8. */
  9. function generateSQL($arrFields,$arrValues,$table,$isFirstFieldPk=true){
  10. if(!is_array($arrFields) || !is_array($arrValues)) return "";
  11. $size=sizeof($arrFields);
  12. if($arrValues[0]>0 && $isFirstFieldPk){ //update record
  13. $sqlRestriction=" Where $arrFields[0]='$arrValues[0]' ";
  14. for($i=1;$i<$size;$i++){
  15. $iSQL.=$arrFields[$i]."='$arrValues[$i]',";
  16. }
  17. $iSQL=left($iSQL,strlen($iSQL)-1); //retirar , final
  18. $iSQL="Update $table set $iSQL $sqlRestriction";
  19. }
  20. else{ //new record
  21. $startAt=($isFirstFieldPk)?1:0;
  22. for($i=$startAt;$i<$size;$i++){
  23. $sqlFields.=$arrFields[$i].",";
  24. $sqlValues.="'$arrValues[$i]',";
  25. }
  26. $sqlFields=left($sqlFields,strlen($sqlFields)-1);
  27. $sqlValues=left($sqlValues,strlen($sqlValues)-1);
  28. $iSQL="Insert Into $table ($sqlFields) values ($sqlValues)";
  29. }
  30. return $iSQL;
  31. }
  32.  
  33. function left ($str, $howManyCharsFromLeft){
  34. return substr ($str, 0, $howManyCharsFromLeft);
  35. }
  36. ?>



Exemplos:

1)
$arrFields=array("pk_imagem","descricao","url");
$arrValues=array(0,"Descrição de Teste","imagens/imagem.jpg");
$table="dados_imagens";
$iSQL=generateSQL($arrFields, $arrValues, $table);

Vai gerar isto:
Insert Into dados_imagens (descricao,url) values ('Descrição de Teste','imagens/imagem.jpg')


2)
$arrFields=array("descricao","url");
$arrValues=array("Descrição de Teste","imagens/imagem.jpg");
$table="dados_imagens";
$iSQL=generateSQL($arrFields, $arrValues, $table, false);

Vai gerar a mesma instrução do exemplo anterior 1)


3)
$arrFields=array("pk_imagem","descricao","url");
$arrValues=array(1,"Descrição de Teste","imagens/imagem.jpg");
$table="dados_imagens";
$iSQL=generateSQL($arrFields, $arrValues, $table);

Vai gerar esta instrução:
Update dados_imagens set descricao='Descrição de Teste',url='imagens/imagem.jpg' Where pk_imagem='1'


Qualque dúvida/ erro é só dizer.









clicks: 13246 13246 2006-12-08 2006-12-08 goto mySnippets mySnippets php  Download  Bookmark This Bookmark This