Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

digao_sk8

Não encontro o problema, ja faz 2 dias procurando o erro e nada!

Recommended Posts

Tenho o seguinte codigo e me aparece sempre este error ( SQLSTATE[HY093]: Invalid parameter number: parameter was not defined ) ja faz ai uns dois dias que faço uma varredura e nada de encontrar peço uma ajuda a rapaziada do forum, se desvendarem esse erro ficarei muito grato.

Postarei os seguintes codigos (do banco de dados que uso com o codigo ) e ( bendito codigo PDO php que me deixa doidao );

Codigo banco:

create table posts(
p_id int(11) not null AUTO_INCREMENT,
p_idCategoria int(11) ,
p_idSubCategoria int(11) ,
p_img1 varchar(255),
p_img2 varchar(255),
p_img3 varchar(255),
p_titulo varchar(255) ,
p_vitrine varchar(255) ,
p_descricaoSmall text,
p_descricaoBig longtext,
p_sistemaOperacional varchar(255),
p_downloads varchar(255),
p_siteOficial varchar(255),
p_data datetime,
p_video varchar(255),
p_inst_deInstalacao longtext,
p_tamanho varchar(255),
p_licenca varchar(255),
p_link32 varchar(255),
p_link64 varchar(255),
primary key(p_id)
);

 


Codigo php:


<?php
require_once("conexaoPDO.php");
$categoria            = @$_POST['categoria'];
$subCategoria         = @$_POST['subCategoria'];
$imagem1              = @$_POST['imagem1'];
$imagem2              = @$_POST['imagem2'];
$imagem3  = @$_POST['imagem3'];
$titulo  = @$_POST['titulo'];
$vitrine  = @$_POST['vitrine'];
$descricaoSmall  = @$_POST['descricaoSmall'];
$descricaoBig         = @$_POST['descricaoBig'];
$sistemaOperacional   = @$_POST['sistemaOperacional'];
$siteOficial  = @$_POST['siteOficial'];
$licenca  = @$_POST['licenca'];
$video                = @$_POST['video'];
$data                 = @$_POST['data'];
$tamanho              = @$_POST['tamanho'];
$link32               = @$_POST['link32'];
$link64               = @$_POST['link64'];
$inst_DeInstalacao    = @$_POST['inst_DeInstalacao'];
 
$sqlInsert = "insert into posts(p_idCategoria,p_idSubCategoria,p_img1,p_img2,p_img3,p_titulo,p_vitrine,p_descricaoSmall,p_descricaoBig,p_sistemaOperacional,p_siteOficial,p_data,p_video,p_inst_deInstalacao,p_tamanho,p_licenca,p_link32,p_link64)"; 
$sqlInsert .="values (:categoria,:subCategoria,:imagem1,:imagem2,:imagem3,:titulo,:vitrine,:descricaoSmall,:descricaoBig,:sistemaOperacional,:siteOficial,:data,:video,:inst_DeInstalacao,:tamanho,:licenca,:link32,:link64)";
try{
$insertS = $conecta->prepare($sqlInsert);
$insertS->bindValue(':P_idCategoria',$categoria,PDO::PARAM_STR);
$insertS->bindValue(':P_idSubCategoria',$subCategoria,PDO::PARAM_STR);
$insertS->bindValue(':P_img1',$imagem1,PDO::PARAM_STR);
$insertS->bindValue(':P_img2',$imagem2,PDO::PARAM_STR);
$insertS->bindValue(':P_img3',$imagem3,PDO::PARAM_STR);
$insertS->bindValue(':P_titulo',$titulo,PDO::PARAM_STR);
$insertS->bindValue(':P_vitrine',$vitrine,PDO::PARAM_STR);
$insertS->bindValue(':P_descricaoSmall',$descricaoSmall,PDO::PARAM_STR);
$insertS->bindValue(':P_descricaoBig',$descricaoBig,PDO::PARAM_STR);
$insertS->bindValue(':P_sistemaOperacional',$sistemaOperacional,PDO::PARAM_STR);
$insertS->bindValue(':P_siteOficial',$siteOficial,PDO::PARAM_STR);
$insertS->bindValue(':P_data',$data,PDO::PARAM_STR);
$insertS->bindValue(':P_video',$video,PDO::PARAM_STR);
$insertS->bindValue(':P_inst_deInstalacao',$inst_DeInstalacao,PDO::PARAM_STR);
$insertS->bindValue(':P_tamanho',$tamanho,PDO::PARAM_STR);
$insertS->bindValue(':P_licenca',$licenca,PDO::PARAM_STR);
$insertS->bindValue(':P_link32',$link32,PDO::PARAM_STR);
$insertS->bindValue(':P_link64',$link64,PDO::PARAM_STR);
$insertS->execute();
}catch(PDOexception $eInserir){print"<h3>Error ão inserir</h3> <br>" .$eInserir->getMessage();}
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

no teu insert como tem um campo id que é auto tenque coloca=-lo no insert em branco mesmo

 

hoje esta assim

insert into posts(p_idCategoria

 

deveria estar assim

 

insert into posts('',p_idCategoria


só lembrando no value tambem

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso não deve fazer diferença, mas tente alterar essas duas linhas:

$insertS->bindValue(':P_idCategoria', $categoria, PDO::PARAM_INT);
$insertS->bindValue(':P_idSubCategoria', $subCategoria, PDO::PARAM_INT);


Essas duas colunas são do tipo INT e você está usando PDO::PARAM_STR.

Evite colocar estes "@" para esconder erros, isso não é uma boa prática de programação. Você precisa saber quais erros ocorrem.

Faça uma validação para ver se a requisição foi feita via POST:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

 

 

no teu insert como tem um campo id que é auto tenque coloca=-lo no insert em branco mesmo

 

O campo "p_id" não precisa ser colocado no INSERT, já que é AUTO_INCREMENT.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ué o nome dos pametros na insert estão diferentes dos binds

 

 

 

values (:categoria,:subCategoria,:imagem1 ....

$insertS->bindValue(':P_idCategoria'

$insertS->bindValue(':P_idSubCategoria'

Compartilhar este post


Link para o post
Compartilhar em outros sites

ué o nome dos pametros na insert estão diferentes dos binds

 

Bem observado shini!

 

Eu particularmente prefiro colocar um ponto de interrogação no prepared statement e depois passar os valores por array. Acho bem mais prático.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem observado shini!

 

Eu particularmente prefiro colocar um ponto de interrogação no prepared statement e depois passar os valores por array. Acho bem mais prático.

Gosto de colocar nomes no parametros fica mais legivel, agora quando vc não sabe o numero de pametros pq é dinamico é melhor usar '?' e passar um array pro execute()

 

só comentei pq ja tive problema com isso antes de usar orm

que problema? qual orm?

 

aqui tem problema com YII não se é o seu caso

 

http://stackoverflow.com/questions/5874383/invalid-parameter-number-parameter-was-not-defined-inserting-data

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gosto de colocar nomes no parametros fica mais legivel, agora quando vc não sabe o numero de pametros pq é dinamico é melhor usar '?' e passar um array pro execute()

 

Isso é verdade, além de ficar mais legível deve ser melhor em desempenho também, pois no método bindValue e bindParam da pra informar o tipo do campo, assim o PHP não precisa ficar tendo que descobrir qual o tipo do campo pra usar a formatação correta no SQL.

 

Pra falar a verdade eu uso bem pouco o PDO (raramente), pois uso o Doctrine no ZF2 para sistemas maiores e para sistemas menores como sites eu comecei a usar recentemente o Eloquent com Laravel, que é super produtivo. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ai galera pra ja agradecendo pela força ai !

mais deixando claro que os dois campos que estao la em cima ( :P_idCategoria) e ( :P_idSubCategoria) nao e o id da tabela e nao sao auto incremento, pois o id dessa tabela posts e auto incremento e nao precisa de passar valor no form .

esses dois campos sao relacionado a uma tabela exterior que armazena o nome das categorias e no rabo dela uma outra tabela de sub categorias .

ate agora nao consigo decifrar este problema ja fiz com mysqli e PDO mais esses dois dao sempre o mesmo problema ,mais o mysql_query->este sim nao deu defeito.

lembrando ja passei os valores por array tambem mais nada sempre a mesma menssagem ->( SQLSTATE[HY093]: Invalid parameter number: parameter was not defined )........puts ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

vc deixou igual os nomes dos binds e dos parametros?

Compartilhar este post


Link para o post
Compartilhar em outros sites

so fiz uma alteraçao nos dois primeiros campos la do bind (PDO::PARAM_INT) pois esse daqui eu dei mole mais nao era isso ,

puts brother ja estou com isso parado por dois dias e nada de achar a soluçao estou ficando fustrado com esse problema ,,,,,,

Compartilhar este post


Link para o post
Compartilhar em outros sites

teste esse codigo aqui,

 

 

$sqlInsert = "insert into posts(p_idCategoria,p_idSubCategoria,p_img1,p_img2,p_img3,p_titulo,p_vitrine,p_descricaoSmall,p_descricaoBig,p_sistemaOperacional,p_siteOficial,p_data,p_video,p_inst_deInstalacao,p_tamanho,p_licenca,p_link32,p_link64)";
$sqlInsert .="values (idCategoria, :idSubCategoria, :img1,:img2,:img3,:titulo,:vitrine,:descricaoSmall,:descricaoBig, :sistemaOperacional,:siteOficial, :data,:video,:inst_DeInstalacao,:tamanho,:licenca,:link32,:link64)";
try{
$insertS = $conecta->prepare($sqlInsert);
$insertS->bindValue(':idCategoria',$categoria);
$insertS->bindValue(':idSubCategoria',$subCategoria);
$insertS->bindValue(':img1',$imagem1);
$insertS->bindValue(':img2',$imagem2);
$insertS->bindValue(':img3',$imagem3);
$insertS->bindValue(':titulo',$titulo);
$insertS->bindValue(':vitrine',$vitrine);
$insertS->bindValue(':descricaoSmall',$descricaoSmall);
$insertS->bindValue(':descricaoBig',$descricaoBig);
$insertS->bindValue(':sistemaOperacional',$sistemaOperacional);
$insertS->bindValue(':siteOficial',$siteOficial);
$insertS->bindValue(':data',$data);
$insertS->bindValue(':video',$video);
$insertS->bindValue(':inst_deInstalacao',$inst_DeInstalacao);
$insertS->bindValue(':tamanho',$tamanho);
$insertS->bindValue(':licenca',$licenca);
$insertS->bindValue(':link32',$link32);
$insertS->bindValue(':link64',$link64);
$insertS->execute();

Compartilhar este post


Link para o post
Compartilhar em outros sites
Continua com aquela menssagem de error ,ainda nao foi isso, axo que ja avia eliminado essa parte ja pois estou 2 dias com este problema deu tempo pra testar da direita a esquerda...

obrigado assim mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Faltou dois pontos aqui:

values (idCategoria,

Deixe assim:

values (:idCategoria,

tambem não e ainda isso. mas os pontos etavam certo não?

esse problema e mais solido doque eu pensava tenho varios problema de vez e quando mais este me vai fazer largar a profissao..kk

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem no pior caso, faça o insert com uma coluna, depois com duas ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem no pior caso, faça o insert com uma coluna, depois com duas ....

ja tentei inserir somente um registro , ja tirei exceptions e nada sempre o mesmo bendito erro........

Compartilhar este post


Link para o post
Compartilhar em outros sites

No sql da tabela tem o campo :

p_downloads varchar(255)

Já no insert não, talvez seja isso, coloque o campo no insert e faça um teste.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No sql da tabela tem o campo :

p_downloads varchar(255)

Já no insert não, talvez seja isso, coloque o campo no insert e faça um teste.

vao ver se dar certo ainda nao fiz este procedimento mais a chance sera 10%..bora que vamo...

não tem efeito algum pois p_downloads e um campo null... valeu assim mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.