Jump to content

INSERT duplo


Carlos Rocha
 Share

Recommended Posts

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

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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."

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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%.

Link to comment
Share on other sites

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&

Link to comment
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
 Share

×
×
  • 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.