Ir para conteúdo

POWERED BY:

Arquivado

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

tony_lu

Erro no bind_param em mysqli

Recommended Posts

Ola pessoal, tudo bem?

 

Estou com um problema no bind_param com mysqli ... sei que o melhor é o PDO, porém neste projeto ja foi definido a ultilização do mysqli.

 

Quero fazer um simples cadastro com o bind_param mas tá dando erro ao tentar gravar no banco:

 

Fatal error: Call to a member function bind_param() on a non-object in

 

da este erro na linha do bind_param conforme codigo abaixo:

 

// Preparar o Cadastro
$stmt = $mysqli->prepare("INSERT INTO produtos (nome_empresa, nome, email, logomarca, telefone, cep, endereco, numero, complemento, bairro, cidade, estado, site, latitude, longitude, data_solicitacao, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");


$stmt->bind_param("sssssssssssssssdi", $nomeempresa, $nome, $email, $imagem_nome, $telefone, $cep, $rua, $numero, $complemento, $bairro, $cidade, $estado, $site, $latitude, $longitude, $data, $status);


$stmt->execute();

Alguem pode me ajudar a resolver este erro?!

 

Muito obrigado!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

$stmt não é um objeto. Ou seja, prepare() falhou.

Aparentemente sua query está correta.

 

Habilite todas as exibições de erro, como mostrado neste tópico e tente de novo. Se houver algum outro erro, vai aparecer

 

Também dê um var_dump() em $stmt, para ver qual valor está recebendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Beraldo

 

coloquei o ini_set( 'display_errors', true ); mas não apareceu nenhum erro a mais...

 

Aparentemente o erro é nessa linha do bind_param e não no prepare():

$stmt->bind_param("sssssssssssssssdi", $nomeempresa, $nome, $email, $imagem_nome, $telefone, $cep, $rua, $numero, $complemento, $bairro, $cidade, $estado, $site, $latitude, $longitude, $data, $status);

Não consegui dar o var_dump() em $stmt porque chega nessa linha ele ja dá o erro ... será que pode ser algo do servidor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloquei o ini_set( 'display_errors', true ); mas não apareceu nenhum erro a mais...

Não basta só ini_set. Mais importante é o error_reporting. Deixe-o em E_ALL e teste de novo. Veja o exemplo no link que mandei no post #2

 

 

 

Aparentemente o erro é nessa linha do bind_param e não no prepare():

$stmt->bind_param("sssssssssssssssdi", $nomeempresa, $nome, $email, $imagem_nome, $telefone, $cep, $rua, $numero, $complemento, $bairro, $cidade, $estado, $site, $latitude, $longitude, $data, $status);

O PHP aponta essa linha, porém a causa é a linha anterior. Se prepare() retornar FALSE (o que não é um erro exatamente) vai gerar erro ao tentar usar FALSE como objeto

 

 

Não consegui dar o var_dump() em $stmt porque chega nessa linha ele ja dá o erro ... será que pode ser algo do servidor?

Dê var_dump() em $stmt logo após o prepare(), antes de qualquer bind_param

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim eu coloquei o error_reporting ALL como esta no topico que você passou e não estava aparecendo nada a mais de erro.

 

Fiz o que você falou, coloquei o var_dump() em $stmt logo após o prepare() antes do bind_param, e deu este resultado (bool(false) ):

bool(false) 
Fatal error: Call to a member function bind_param() on a non-object in ...

será algo no banco de dados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifique se declarou corretamente as variaveis, conforme o exemplo:

 

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

 

http://php.net/manual/pt_BR/mysqli-stmt.bind-param.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 obs: fiz 1 teste aqui, tb não estava dando certo, mas como a tabela tinha + 1 coluna (id), tive que declarar as colunas; ex:

"INSERT INTO CountryLanguage(coluna1, coluna2,coluna3, coluna4) VALUES (?, ?, ?, ?)"

ai deu certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite pessoal,

 

realmente era problema na query, agora arrumei e esta resolvido, agradeço a todos vocês pela ajuda!

 

Realmente usando o bind_param eu estou protegido de sql-injection ou ainda sim eu tenho que usar funções anti-sql-injection nas variaveis antes de jogar na query?!

 

Obrigado mais uma vez!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente usando o bind_param eu estou protegido de sql-injection ou ainda sim eu tenho que usar funções anti-sql-injection nas variaveis antes de jogar na query?!

Sim, o próprio SGBD vai eliminar os caracteres inválidos e escapar o que for necessário.

Não precisa de nenhuma outra função nti-injection

Leia sobre Prepared Statements, e vai entender melhor como funciona.

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.