Jump to content
Carlos Rocha

INSERT duplo

Recommended Posts

Carlos Rocha

Pessoal, eu tenho o seguinte insert duplo:

INSERT INTO retornos (cotacao, empresa, servico, valor) VALUES (1,1,1,20.00);INSERT INTO retornos (cotacao, empresa, servico, valor) VALUES (1,1,2,12.00);

Isso é resultado de um while para concatenar varios inserts e executar apenas uma query.

No phpmyadmin a query é executada sem problemas.

Mas quando jogo no php não executa.

<?php
if(isset($_GET["acao"]) and $_GET["acao"]=="cadPreco")
{
 $retornoString="";
 for ($i=0;$i<count($_POST);$i++)
 {
   if($i % 2 == 0)
   {
     $_POST[$i] = str_replace(",", ".", $_POST[$i]);
     $retornoString.= "INSERT INTO retornos (cotacao, empresa, servico, valor) VALUES (".$_GET["cotacao"].",".$_GET["empresa"].",".$_POST[$i+1].",".$_POST[$i].");";
   }
 }
 print $retornoString."<br>";
 $retornoQuery=$conexao->Query($retornoString);
 if($retornoQuery)
 {echo 'sim';}
 else
 {echo 'não';}
}
?>

Aonde estará o erro?

Obs.: A conexão esta funcionando bem

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
pikax

quando a formatacao da pergunta tiver direita, poderei ajudar.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Carlos Rocha

Não entendi!

A pergunta é essa mesma!

Edited by carcleo

Share this post


Link to post
Share on other sites
pikax

escusas de declarar de novo o insert, podes fazer assim:

INSERT INTO retornos (cotacao, empresa, servico, valor) 
VALUES (1,1,1,20.00)
  ,(1,1,2,12.00)

Apesar que isso nao resolvera o teu prolema... Ajuda-nos a ajudar-te e identa o codigo.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Carlos Rocha

Sim, queres dizer que não é necessário repetir a primeira linha não é mesmo?

Mas, e, caso um desses inserts não puder ser feito, todos os demais também não poderão?

Por exemplo,

A consulta é:

INSERT INTO retornos (cotacao, empresa, servico, valor) 
VALUES (1,1,1,20.00)
  ,          (1,1,2,12.00)

Se caso o segundo insert por exemplo:

(1,1,2,12.00)

Não puder ser inserido, o que acontecerá ao primeiro e ao terceiro(caso exista). Serão executados ou não?

Share this post


Link to post
Share on other sites
pikax

Se tiveres um problema no primeiro insert, a query da' erro e os restantes nao serao executados.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Carlos Rocha

Hum,então não poderá ser assim.

Mas, aproveitando o tópico, me dê uma orientação?

Tenho uma tabela com um chave primaria quadrupla (4 chaves). Sim, é uma tabela auxiliar.

Porem, não podem repetir valores para a chave primária completa.

Exemplo:

(1,1,2,12.00)

Não poderá mais haver outro :

(1,1,2,12.__)

Tem como definir isso no MySQL, ou terei que garantir via php executando outra query?

Share this post


Link to post
Share on other sites
pikax

o mysql nao e' bem a minha praia, tens que esperar que alguem com mais conhecimento no mysql que eu possa ajudar nisso.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Carlos Rocha

Ta bom, muito obrigado, enquanto aguardo, vou usando da forma abaixo mesmo. Se for a melhor forma, deixarei a tabela com apenas 1 chave primaria mesmo.:

<?php
if(isset($_GET["acao"]) and $_GET["acao"]=="cadPreco")
{
for ($i=0;$i<count($_POST);$i++)
{
if($i % 2 == 0)
{
$consultaRegistroString=
"
SELECT cotacao, empresa, servico FROM retornos
WHERE
       cotacao=".$_GET["cotacao"]." and 
empresa=".$_GET["empresa"]." and
servico=".$_POST[$i+1]."
";
$consultaRegistroQuery=$conexao->Query($consultaRegistroString); 

if($consultaRegistroQuery->num_rows==0)
{
$_POST[$i] = str_replace(",", ".", $_POST[$i]);

$retornoString= 
"
INSERT INTO retornos (cotacao, empresa, servico, valor)
VALUES (".$_GET["cotacao"].",".$_GET["empresa"].",".$_POST[$i+1].",".$_POST[$i]."); 
";
$retornoQuery=$conexao->Query($retornoString); 
}
}
}
print "Cotação enviada com sucesso, obrigado!";
}
?>

Edited by carcleo

Share this post


Link to post
Share on other sites
HappyHippyHippo

primeiro problema :

presumo que a tua classe/biblioteca usada indica que não podes executar mais do que uma instrução por query, mas como é impossível verificar o que estás a usar, mais informação é impossível inferir do código apresentado

segundo problema :

se tens um valor diferente em um dos campos que compõem a chave composta, então nunca terás a invalidade de inserção. tens duas soluções para isso:

- uso de um stored procedures para fazer a inserção invalidando antes de inserir

- uso de um trigger a ser executado na inserção invalidando após a inserção (com eliminação do registo inserido)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Carlos Rocha

Dando f5 (Reload) na pagina após submeter o formulario, haverá uma força de guardar registro duplicado.

Por isso a segurança.

Então, devo optar mesmo por deixar apenas uma chave primaria na tabela (id), e fazer a consulta antes de inserir.como já estou a fazer no codigo acima.

O que achas?

Edited by carcleo

Share this post


Link to post
Share on other sites
brunoais

Dando f5 (Reload) na pagina após submeter o formulario, haverá uma força de guardar registro duplicado.

Já experimentaste usar um status code 303 e redirecionar o utilizador de maneira a evitar isso (procura na internet sobre como isso funciona ;))?

Uma ajuda:

Http status codes

php header()

HTTP location header

Edited by brunoais

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Kissema

Hum,então não poderá ser assim.

Mas, aproveitando o tópico, me dê uma orientação?

Tenho uma tabela com um chave primaria quadrupla (4 chaves). Sim, é uma tabela auxiliar.

Porem, não podem repetir valores para a chave primária completa.

Exemplo:

(1,1,2,12.00)

Não poderá mais haver outro :

(1,1,2,12.__)

Tem como definir isso no MySQL, ou terei que garantir via php executando outra query?

Tente definir uma constraint na sua tabela

Ex.: TabelaNome(campo1,campo2,campo3,campo4,...)

ALTER TABLE TabelaNome ADD CONSTRAINT chave_composta PRIMARY KEY (campo1,campo2,campo3,campo4);


@ pr@tic@ f@z o m&str&

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.