[PHP - Google] Problema com Insert e PDO

233 views
Skip to first unread message

Ramon José Silva

unread,
Jul 30, 2011, 11:12:46 PM7/30/11
to Lista PHP - [Google Group]
Olá galera!

Venho por emio deste email pedir uma luz para todos.

Estou PDO no meu projeto, só que estou tendo um problema para inserir os dados no banco, pois toda vez que vou inserir os dados no banco, a query é executada 2 vezes, o que acaba duplicando o numero de dados iguais no banco.

Alguém pode me ajudar com este pequeno problema? Meu código está da seguinte maneira:

        $stmt = $connect->prepare("INSERT INTO users(name, pass, email, admin) VALUES (?, ?, ?, ?)");
        $stmt->bindParam(1, $name);
        $stmt->bindParam(2, $pass);
        $stmt->bindParam(3, $email);
        $stmt->bindParam(4, $choose);
        $stmt->execute();

Olhei na documentação do PDO no php.net para ver se tinha algo de errado, mas não vi nada de errado no código, procurei na net algo sobre esse problema, até achei, porém o cara que estava com esse mesmo problema, não conseguiu achar uma solução para o problema.

O tópico é esse aqui: http://forum.imasters.com.br/topic/368227-insert-com-pdo/

Agradeço desde já pela ajuda galera!

Abraço a todos.




--
What power would hell have if those imprisoned here would not be able to dream of heaven? "

Anderson Aguiar

unread,
Jul 30, 2011, 11:18:19 PM7/30/11
to list...@googlegroups.com
Troca o bindParam por bindValue.



--
============================================================
LEIAM SEMPRE AS REGRAS DA LISTA:
http://groups.google.com.br/group/listaphp/web/regras-da-lista-php
--
JQUERY MAGAZINE > http://www.jquerymagazine.com.br
--
PHP MAGAZINE > http://www.phpmagazine.com.br
--
LISTA NODE.JS > https://groups.google.com/group/lista-nodejs?hl=pt-br
--
AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
--
PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
--
DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
============================================================



--
Att Anderson Aguiar
E-mail: revs...@gmail.com
Twitter: http://twitter.com/andersonaguiar
Skype: anderson.senai
MSN: and-a...@hotmail.com

Ramon José Silva

unread,
Jul 31, 2011, 11:31:17 AM7/31/11
to list...@googlegroups.com
Anderson, obrigado pela dica, eu troquei de bindParam por bindValue, mas não adiantou. Ainda continua inserindo duas vezes a mesma coisa. Eu procurei comentar o ob_start e ob_end_clean para ver se resolvia alguma coisa, porém continuo a mesma coisa.

2011/7/31 Anderson Aguiar <revs...@gmail.com>

Anderson Aguiar

unread,
Jul 31, 2011, 11:57:07 AM7/31/11
to list...@googlegroups.com
Tais usando singleton? Às vezes ele ta instanciando mais de uma vez a classe de conexão.

O código que você passou está correto, acho que você deveria debugar a cima disso.

Caso não tenha sucesso coloque seu código no http://jsbin.com/ ou http://jsfiddle.net para o pessoal poder analisar.

Ramon José Silva

unread,
Jul 31, 2011, 5:08:51 PM7/31/11
to list...@googlegroups.com
Então Anderson, eu tenho mais outras 3 queries de insert, e elas funcionam perfeitamente, sem problema algum, é só essa de inserir usuários ela acaba inserindo duas vezes os mesmos dados.

2011/7/31 Anderson Aguiar <revs...@gmail.com>

Rubens Takiguti Ribeiro

unread,
Jul 31, 2011, 7:30:36 PM7/31/11
to list...@googlegroups.com
Tente apagar a variável $stmt após realizar o insert. Talvez ela foi usada novamente.

unset($stmt);

Também pode ser uma trigger no seu banco.

Rubens Takiguti Ribeiro
TecnoLivre - Cooperativa de Tecnologia e Soluções Livres
Bacharel em Ciência da Computação - UFLA
Zend Certified Engineer - PHP 5
http://rubsphp.blogspot.com/

Ramon José Silva

unread,
Jul 31, 2011, 8:12:09 PM7/31/11
to list...@googlegroups.com
Rubens, valeu pela dica, meu banco não possui nenhuma trigger, e eu tentei apagar a $stmt após o insert ter sido realizado, porém não adiantou, porque, os dados continuam sendo inseridos duas vezes!

2011/7/31 Rubens Takiguti Ribeiro <rub...@gmail.com>

Wellington Rodrigues

unread,
Jul 31, 2011, 1:11:07 PM7/31/11
to list...@googlegroups.com
Ramon,

Trabalho de uma forma um pouco diferente.

$stm = $pdo->prepare('EXEC PROC_0008_HORARIO_AULA_I :id_dia_semana,
:id_disciplina_professor_trimestre, :opcao, :hora_inicio, :hora_termino,
:datausu, :usuario');
$stm->bindValue(':id_dia_semana',
$horarioAula->id_dia_semana);
$stm->bindValue(':id_disciplina_professor_trimestre',
$horarioAula->id_disciplina_professor_trimestre);
$stm->bindValue(':hora_inicio',
$horarioAula->hora_inicio);
$stm->bindValue(':hora_termino',
$horarioAula->hora_termino);
$stm->bindValue(':datausu',
$horarioAula->datausu);
$stm->bindValue(':usuario',
$horarioAula->usuario);
$stm->bindValue(':opcao',
$horarioAula->opcao);
$stm->execute();

J� experimentou desta forma?

Grande abra�o,

Wellington Rodrigues
http://www.twitter.com/programmerbr

Ramon Jos� Silva wrote:
> Ol� galera!


>
> Venho por emio deste email pedir uma luz para todos.
>

> Estou PDO no meu projeto, s� que estou tendo um problema para inserir os

> dados no banco, pois toda vez que vou inserir os dados no banco, a query

> � executada 2 vezes, o que acaba duplicando o numero de dados iguais no
> banco.
>
> Algu�m pode me ajudar com este pequeno problema? Meu c�digo est� da
> seguinte maneira:
>
> * $stmt = $connect->prepare("INSERT INTO users(name, pass, email,

> admin) VALUES (?, ?, ?, ?)");
> $stmt->bindParam(1, $name);
> $stmt->bindParam(2, $pass);
> $stmt->bindParam(3, $email);
> $stmt->bindParam(4, $choose);
> $stmt->execute();
>

> *Olhei na documenta��o do PDO no php.net <http://php.net> para ver se
> tinha algo de errado, mas n�o vi nada de errado no c�digo, procurei na
> net algo sobre esse problema, at� achei, por�m o cara que estava com
> esse mesmo problema, n�o conseguiu achar uma solu��o para o problema.
>
> O t�pico � esse aqui:
> http://forum.imasters.com.br/topic/368227-insert-com-pdo/
>
> Agrade�o desde j� pela ajuda galera!
>
> Abra�o a todos.
>
>
>
>
> --
> " /What power would hell have if those imprisoned here would not be able
> to dream of heaven?// /"

Ramon José Silva

unread,
Aug 1, 2011, 2:25:52 PM8/1/11
to list...@googlegroups.com
Wellington,

Dessa maneira eu ainda não tinha tentado, mas vlw pela dica!

2011/7/31 Wellington Rodrigues <equ...@desenvolvendosites.com>
Ramon,

Trabalho de uma forma um pouco diferente.

$stm = $pdo->prepare('EXEC PROC_0008_HORARIO_AULA_I :id_dia_semana, :id_disciplina_professor_trimestre, :opcao, :hora_inicio, :hora_termino, :datausu, :usuario');
$stm->bindValue(':id_dia_semana', $horarioAula->id_dia_semana);
$stm->bindValue(':id_disciplina_professor_trimestre', $horarioAula->id_disciplina_professor_trimestre);
$stm->bindValue(':hora_inicio', $horarioAula->hora_inicio);
$stm->bindValue(':hora_termino', $horarioAula->hora_termino);
$stm->bindValue(':datausu', $horarioAula->datausu);
$stm->bindValue(':usuario', $horarioAula->usuario);
$stm->bindValue(':opcao', $horarioAula->opcao);
$stm->execute();

Já experimentou desta forma?

Grande abraço,

Wellington Rodrigues
http://www.twitter.com/programmerbr

Ramon José Silva wrote:
Olá galera!


Venho por emio deste email pedir uma luz para todos.

Estou PDO no meu projeto, só que estou tendo um problema para inserir os dados no banco, pois toda vez que vou inserir os dados no banco, a query é executada 2 vezes, o que acaba duplicando o numero de dados iguais no banco.

Alguém pode me ajudar com este pequeno problema? Meu código está da seguinte maneira:


*        $stmt = $connect->prepare("INSERT INTO users(name, pass, email, admin) VALUES (?, ?, ?, ?)");
       $stmt->bindParam(1, $name);
       $stmt->bindParam(2, $pass);
       $stmt->bindParam(3, $email);
       $stmt->bindParam(4, $choose);
       $stmt->execute();

*Olhei na documentação do PDO no php.net <http://php.net> para ver se tinha algo de errado, mas não vi nada de errado no código, procurei na net algo sobre esse problema, até achei, porém o cara que estava com esse mesmo problema, não conseguiu achar uma solução para o problema.


O tópico é esse aqui: http://forum.imasters.com.br/topic/368227-insert-com-pdo/

Agradeço desde já pela ajuda galera!

Abraço a todos.




--



--

Ramon José Silva

unread,
Aug 1, 2011, 5:00:51 PM8/1/11
to list...@googlegroups.com
Wellington,

Apesar da sua dica, mas mesmo assim continuo com o mesmo problema. Será que alguém do grupo teria mais alguma solução?

Abraço.

Bruno Nascimento

unread,
Aug 1, 2011, 5:13:23 PM8/1/11
to list...@googlegroups.com
... constraint unique mysql ajuda bem. rs

Pode ser composta... acredito que no seu caso o e-mail não pode se repetir?

abraços
[]'s

Bruno Nascimento
www.dbrunonascimento.com.br

Anderson Aguiar

unread,
Aug 1, 2011, 5:23:16 PM8/1/11
to list...@googlegroups.com
Mas isso é gambiarra. O pessoal já deu algumas dicas, se não obteve sucesso até agora, o negócio é ir debugando pra ver pq está inserindo duplicado.



2011/8/1 Bruno Nascimento <dbruno.n...@gmail.com>



--

Bruno Nascimento

unread,
Aug 1, 2011, 6:05:37 PM8/1/11
to list...@googlegroups.com
O que é gambiarra? Usar Constraint?

Rubens Takiguti Ribeiro

unread,
Aug 1, 2011, 6:46:10 PM8/1/11
to list...@googlegroups.com
Bruno.

Usar constraint pode "solucionar" o problema pela ponta, mas não pela sua essência. Esta prática normalmente é chamada de gambiarra.

Nosso amigo gostaria de saber se a utilização do PDO que ele apresentou está correta ou não, pois está gerando um comportamento estranho. Pelo que notamos, a utilização está aparentemente correta, mas existe algum detalhe no código (ou até externo a ele) que está causando essa inserção duplicada. Saber o porquê disso é que nortearia a solução.

De fato, recomendamos que, após solucionar a essência do problema, o Ramon também use constraint para garantir a integridade do BD. Note que a gambiarra não está em usar a constraint, mas sim em usá-la "apenas para" solucionar tal problema.


Rubens Takiguti Ribeiro
TecnoLivre - Cooperativa de Tecnologia e Soluções Livres
Bacharel em Ciência da Computação - UFLA
Zend Certified Engineer - PHP 5
http://rubsphp.blogspot.com/

Bruno Nascimento

unread,
Aug 1, 2011, 9:37:35 PM8/1/11
to list...@googlegroups.com
Sim, claro.

Infelizmente não será possível deduzir as causas do problemas mostrando apenas 3 ou 4 linhas de código. Portanto o buraco é mais embaixo...
Muitos casos inserção duplicada acontece quando se realiza a atualização da página ou inclusão de arquivos de uma forma indevida. Considerando que o algoritmo está correto, resta então que a camada de persistência verifique a redundância dos dados... usar a constraint irá no mínimo ajudar a produzir alguns erros.

Anderson Aguiar

unread,
Aug 1, 2011, 9:44:20 PM8/1/11
to list...@googlegroups.com
Mas você não acha mais conveniente tentar debugar o código, e achar esse "buraco mais embaixo"?

Constraint com certeza iria resolver o problema, mas você conseguiria dormir a noite sabendo que o seu código estaria tentando inserir 2 vezes os registros na base?

Eu não (:



2011/8/1 Bruno Nascimento <dbruno.n...@gmail.com>

Bruno Nascimento

unread,
Aug 1, 2011, 9:51:14 PM8/1/11
to list...@googlegroups.com
Rsrs, Concordo que precisa debugar, refatorar, reescrever, remodelar... achar o problema.

Tinha entendido que as contraints eram gambirras de um modo geral.

abraços 

Ramon José Silva

unread,
Aug 1, 2011, 10:50:03 PM8/1/11
to list...@googlegroups.com
Bruno e Anderson, estou revendo meu código e tentando achar o erro aqui!

Obrigado pelas dicas!

2011/8/1 Bruno Nascimento <dbruno.n...@gmail.com>

Wellington Rodrigues

unread,
Aug 1, 2011, 6:29:39 PM8/1/11
to list...@googlegroups.com
Ramon,

V� dando var_dump ap�s a execu��o de cada linha do seu script e v�
olhando o banco (� chato pra caramba, mas...).

Grande abra�o,

Wellington Rodrigues
http://www.twitter.com/programmerbr

Ramon Jos� Silva wrote:
> Wellington,
>

> Apesar da sua dica, mas mesmo assim continuo com o mesmo problema. Ser�
> que algu�m do grupo teria mais alguma solu��o?
>
> Abra�o.
>
> 2011/8/1 Ramon Jos� Silva <joseph.s.ru <http://joseph.s.ru>@gmail.com
> <http://gmail.com>>
>
> Wellington,
>
> Dessa maneira eu ainda n�o tinha tentado, mas vlw pela dica!
>
> 2011/7/31 Wellington Rodrigues <equ...@desenvolvendosites.com
> <mailto:equ...@desenvolvendosites.com>>


>
> Ramon,
>
> Trabalho de uma forma um pouco diferente.
>
> $stm = $pdo->prepare('EXEC PROC_0008_HORARIO_AULA_I

> :id_dia_semana, :id_disciplina_professor___trimestre, :opcao,


> :hora_inicio, :hora_termino, :datausu, :usuario');

> $stm->bindValue(':id_dia___semana', $horarioAula->id_dia_semana);
> $stm->bindValue(':id___disciplina_professor___trimestre',
> $horarioAula->id_disciplina___professor_trimestre);
> $stm->bindValue(':hora_inicio'__, $horarioAula->hora_inicio);
> $stm->bindValue(':hora___termino', $horarioAula->hora_termino);


> $stm->bindValue(':datausu', $horarioAula->datausu);
> $stm->bindValue(':usuario', $horarioAula->usuario);
> $stm->bindValue(':opcao', $horarioAula->opcao);
> $stm->execute();
>

> J� experimentou desta forma?
>
> Grande abra�o,
>
> Wellington Rodrigues

> http://www.twitter.com/__programmerbr


> <http://www.twitter.com/programmerbr>
>
> Ramon Jos� Silva wrote:
>

> Ol� galera!


>
> Venho por emio deste email pedir uma luz para todos.
>

> Estou PDO no meu projeto, s� que estou tendo um problema


> para inserir os dados no banco, pois toda vez que vou

> inserir os dados no banco, a query � executada 2 vezes, o


> que acaba duplicando o numero de dados iguais no banco.
>

> Algu�m pode me ajudar com este pequeno problema? Meu c�digo
> est� da seguinte maneira:


>
> * $stmt = $connect->prepare("INSERT INTO users(name,
> pass, email, admin) VALUES (?, ?, ?, ?)");
> $stmt->bindParam(1, $name);
> $stmt->bindParam(2, $pass);
> $stmt->bindParam(3, $email);
> $stmt->bindParam(4, $choose);
> $stmt->execute();
>

> *Olhei na documenta��o do PDO no php.net <http://php.net>
> <http://php.net> para ver se tinha algo de errado, mas n�o
> vi nada de errado no c�digo, procurei na net algo sobre esse
> problema, at� achei, por�m o cara que estava com esse mesmo


> problema, n�o conseguiu achar uma solu��o para o problema.
>
>
> O t�pico � esse aqui:

> http://forum.imasters.com.br/__topic/368227-insert-com-pdo/


> <http://forum.imasters.com.br/topic/368227-insert-com-pdo/>
>
> Agrade�o desde j� pela ajuda galera!
>

> Abra�o a todos.


>
>
>
>
> --
> " /What power would hell have if those imprisoned here would
> not be able to dream of heaven?// /"
>
>
> --

> ==============================__==============================


> LEIAM SEMPRE AS REGRAS DA LISTA:

> http://groups.google.com.br/__group/listaphp/web/regras-da-__lista-php
> <http://groups.google.com.br/group/listaphp/web/regras-da-lista-php>
> --
> JQUERY MAGAZINE > http://www.jquerymagazine.com.__br


> <http://www.jquerymagazine.com.br>
> --
> PHP MAGAZINE > http://www.phpmagazine.com.br
> --
> LISTA NODE.JS >

> https://groups.google.com/__group/lista-nodejs?hl=pt-br
> <https://groups.google.com/group/lista-nodejs?hl=pt-br>
> --
> AJAX-BRASIL > http://groups.google.com/__group/ajax-brasil
> <http://groups.google.com/group/ajax-brasil>
> --
> PYTHON-GOOGLE >
> http://groups.google.com.br/__group/python-google
> <http://groups.google.com.br/group/python-google>
> --
> DOTNET-BRASIL >
> http://groups.google.com.br/__group/dotnet_br
> <http://groups.google.com.br/group/dotnet_br>
> ==============================__==============================
>
>
> --
> ==============================__==============================


> LEIAM SEMPRE AS REGRAS DA LISTA:

> http://groups.google.com.br/__group/listaphp/web/regras-da-__lista-php
> <http://groups.google.com.br/group/listaphp/web/regras-da-lista-php>
> --
> JQUERY MAGAZINE > http://www.jquerymagazine.com.__br


> <http://www.jquerymagazine.com.br>
> --
> PHP MAGAZINE > http://www.phpmagazine.com.br
> --
> LISTA NODE.JS >

> https://groups.google.com/__group/lista-nodejs?hl=pt-br
> <https://groups.google.com/group/lista-nodejs?hl=pt-br>
> --
> AJAX-BRASIL > http://groups.google.com/__group/ajax-brasil
> <http://groups.google.com/group/ajax-brasil>
> --
> PYTHON-GOOGLE >
> http://groups.google.com.br/__group/python-google
> <http://groups.google.com.br/group/python-google>
> --
> DOTNET-BRASIL > http://groups.google.com.br/__group/dotnet_br
> <http://groups.google.com.br/group/dotnet_br>
> ==============================__==============================

Ramon José Silva

unread,
Aug 5, 2011, 8:29:48 PM8/5/11
to list...@googlegroups.com
Bem galera, depois de muito tentar arrumar e não descobrir o que estava fazendo com que a query rodasse duas vezes, acabei colocando um redirect na página e por incrivel que pareça, não foi inserido o mesmo valor duas vezes. O ADM cadastra um usuário, se tiver inserido certinho os dados, redireciona o ADM para a página com todos os usuários. Quando fui ver, só apareceu 1 vez o usuário que foi inserido e não duas vezes como antigamente.

Bem, agradeço a todos pela ajuda que foi dada e um forte abraço.

2011/8/1 Wellington Rodrigues <equ...@desenvolvendosites.com>
Ramon,

Vá dando var_dump após a execução de cada linha do seu script e vá olhando o banco (é chato pra caramba, mas...).


Grande abraço,

Wellington Rodrigues
http://www.twitter.com/programmerbr

Ramon José Silva wrote:
Wellington,

Apesar da sua dica, mas mesmo assim continuo com o mesmo problema. Será que alguém do grupo teria mais alguma solução?

Abraço.

2011/8/1 Ramon José Silva <joseph.s.ru <http://joseph.s.ru>@gmail.com <http://gmail.com>>


   Wellington,

   Dessa maneira eu ainda não tinha tentado, mas vlw pela dica!

   2011/7/31 Wellington Rodrigues <equ...@desenvolvendosites.com
   <mailto:equipe@desenvolvendosites.com>>


       Ramon,

       Trabalho de uma forma um pouco diferente.

       $stm = $pdo->prepare('EXEC PROC_0008_HORARIO_AULA_I
       :id_dia_semana, :id_disciplina_professor___trimestre, :opcao,
       :hora_inicio, :hora_termino, :datausu, :usuario');
       $stm->bindValue(':id_dia___semana', $horarioAula->id_dia_semana);
       $stm->bindValue(':id___disciplina_professor___trimestre',
       $horarioAula->id_disciplina___professor_trimestre);
       $stm->bindValue(':hora_inicio'__, $horarioAula->hora_inicio);
       $stm->bindValue(':hora___termino', $horarioAula->hora_termino);
       $stm->bindValue(':datausu', $horarioAula->datausu);
       $stm->bindValue(':usuario', $horarioAula->usuario);
       $stm->bindValue(':opcao', $horarioAula->opcao);
       $stm->execute();

       Já experimentou desta forma?

       Grande abraço,

       Wellington Rodrigues
       http://www.twitter.com/__programmerbr
       <http://www.twitter.com/programmerbr>

       Ramon José Silva wrote:

           Olá galera!


           Venho por emio deste email pedir uma luz para todos.

           Estou PDO no meu projeto, só que estou tendo um problema

           para inserir os dados no banco, pois toda vez que vou
           inserir os dados no banco, a query é executada 2 vezes, o

           que acaba duplicando o numero de dados iguais no banco.

           Alguém pode me ajudar com este pequeno problema? Meu código
           está da seguinte maneira:


           *        $stmt = $connect->prepare("INSERT INTO users(name,
           pass, email, admin) VALUES (?, ?, ?, ?)");
                  $stmt->bindParam(1, $name);
                  $stmt->bindParam(2, $pass);
                  $stmt->bindParam(3, $email);
                  $stmt->bindParam(4, $choose);
                  $stmt->execute();

           *Olhei na documentação do PDO no php.net <http://php.net>
           <http://php.net> para ver se tinha algo de errado, mas não
           vi nada de errado no código, procurei na net algo sobre esse
           problema, até achei, porém o cara que estava com esse mesmo

           problema, não conseguiu achar uma solução para o problema.


           O tópico é esse aqui:
           http://forum.imasters.com.br/__topic/368227-insert-com-pdo/
           <http://forum.imasters.com.br/topic/368227-insert-com-pdo/>

           Agradeço desde já pela ajuda galera!

           Abraço a todos.



--
Reply all
Reply to author
Forward
0 new messages