tony_lu 1 Denunciar post Postado Agosto 22, 2015 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
Beraldo 864 Denunciar post Postado Agosto 22, 2015 $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
tony_lu 1 Denunciar post Postado Agosto 22, 2015 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
Beraldo 864 Denunciar post Postado Agosto 22, 2015 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
tony_lu 1 Denunciar post Postado Agosto 22, 2015 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
Fernando C 128 Denunciar post Postado Agosto 22, 2015 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
Beraldo 864 Denunciar post Postado Agosto 22, 2015 Se o prepare() falhou, há erro na query. Provavelmente a tabela não existe. Logo após o prepare(), coloque: var_dump( $mysqli->error ); Vai mostrar o erro do MySQL Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Agosto 22, 2015 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
tony_lu 1 Denunciar post Postado Agosto 23, 2015 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
Beraldo 864 Denunciar post Postado Agosto 23, 2015 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