[RESOLVIDO]Fatal error: Call to a member function fetch_assoc() on boolean?

Galera estou com um problema nesse código para validar um login e senha:

Erro:

Fatal error: Call to a member function fetch_assoc() on boolean

Código:

$usuario=filter_input(INPUT_GET,'nUsuario');
$senha=filter_input(INPUT_GET,'nSenha');
echo $senha;
echo $usuario;
$sql = "SELECT nome,ID_TipoUsuario FROM funcionario "
        . "WHERE LOGIN_Funcionario='".$usuario."' AND SENHA_funcionario='".$senha
        ."' AND ID_TipoUsuario>=2";

$resultado = $conn->query($sql);
$row = $resultado->fetch_assoc();
$user = $row['LOGIN_Funcionario'];
$permissao = $row['ID_TipoUsuario'];
$redirecionar="";
if($row['LOGIN_Funcionario']==""){
    $redirecionar="../web/autenticarAdm.php?code=0";
}else{
    $redirecionar="../web/recuperarPedidoProjeto.php";
}
$conn->close();
header("location:$redirecionar");

Olha o possível erro que eu identifiquei foi nesta linha de código:

$sql = "SELECT nome,ID_TipoUsuario FROM funcionario "
   . "WHERE LOGIN_Funcionario='".$usuario."' AND SENHA_funcionario='".$senha
   ."' AND ID_TipoUsuario>=2";

no lugar de : '".$usuario."' e '".$senha."' passe a chave{}

Exemplo:

$sql = "SELECT nome,ID_TipoUsuario FROM funcionario "
    . "WHERE LOGIN_Funcionario = {$usuario} AND SENHA_funcionario = {$senha} 
    AND ID_TipoUsuario>=2";
1 curtida

Eu coloquei essa alterações mas continua o mesmo erro:
Fatal error: Call to a member function fetch_assoc() on boolean ele informa que o erro ta na lina 12
no caso no $row = $resultado->fetch_assoc() mas não consigo resolver.
o código ficou asisim:

$usuario=filter_input(INPUT_GET,'nUsuario');
$senha=filter_input(INPUT_GET,'nSenha');
echo $senha;
echo $usuario;
$sql = "SELECT nome,ID_TipoUsuario FROM funcionario "
        . "WHERE LOGIN_Funcionario='{$usuario}' AND SENHA_funcionario={$senha} AND ID_TipoUsuario>=2";
$resultado = $conn->query($sql);
$row = $resultado->fetch_assoc();
$user=$row['LOGIN_Funcionario'];
$permissao=$row['ID_TipoUsuario'];
$redirecionar="";
if($row['LOGIN_Funcionario']==""){
    $redirecionar="../web/autenticarAdm.php?code=0";
}else{
    $redirecionar="../web/recuperarPedidoProjeto.php";
}
$conn->close();
header("location:$redirecionar");

Conseguir resolver o problema estava realmente na query mas especificamente no select, segue abaixo como
ficou o código e obrigado pela ajuda.

$usuario=filter_input(INPUT_GET,'nUsuario');
$senha=filter_input(INPUT_GET,'nSenha');
echo $senha;
echo $usuario;
$sql = "SELECT * FROM funcionario "
        . "WHERE LOGIN_Funcionario='{$usuario}' AND SENHA_funcionario={$senha} AND ID_TipoUsuario>=2";
$row = $resultado = $conn->query($sql);
$row = $resultado->fetch_assoc();
$user=$row['LOGIN_Funcionario'];
$permissao=$row['ID_TipoUsuario'];
$redirecionar="";
if($row['LOGIN_Funcionario']==""){
    $redirecionar="../web/autenticarAdm.php?code=0";
}else{
    $redirecionar="../web/recuperarPedidoProjeto.php";
}
$conn->close();
header("location:$redirecionar");

Cara uma dica, evite concatenar variáveis com sua query, use o método prepare e evite sofrer sql injection

Outra coisa, senha via get? :open_mouth:

Valeu pelas dicas, irei fazer essas alterações para melhorar o código.

1 curtida

Dando uma incrementada na dica do @LostSoldier outra forma de evitar o sql injection é usar a função “mysqli”

include(‘conexao.php’);
$consulta = mysqli_query ($conexão, “SELECT * FROM Tabela WHERE nome =’$pesquisa’”);

Onde $conexao é uma variável de um arquivo separado que contêm as informações de conexão do seu banco de dados. Você precisa dar um include deste arquivo na onde você for trabalhar com banco de dados.

<?php //dados de acesso ao BD MySQL $servidor = "seuservidor"; $usuario = "teste"; $senha = "teste"; $banco = "database";

$conexao = mysqli_connect ($servidor, $usuario, $senha, $banco);

?>

Desculpa cara, mas devo discordar de você, as funções mysqli_ sozinhas não evitam sql injection, é necessário “jogo de cintura” do programador para usar as api’s corretamente, o que previne sql injection é forma como se limpa entrada e monta sql usando prepared statements…

E seu código dessa forma:

$consulta = mysqli_query ($conexão, "SELECT * FROM Tabela WHERE nome ='$pesquisa'");

Continua correndo risco de ataque, já que a variável pesquisa pode não ter sido limpa e foi concatenada diretamente com a string… a grosso modo algum usuário do mal pode digitar isso no campo do nome por exemplo…

';DELETE FROM Tabela;

E se não for tratado olha o que vira…

SELECT * FROM Tabela WHERE nome =''; DELETE FROM Tabela;

E o que é pior dependendo da base, ela aceita esses comandos de boa… já viu no que isso vai dar…

Outro comando muito usado e menos prejudicial…

' OR 1 = 1

No fim vira…

 SELECT * FROM Tabela WHERE nome ='' OR 1 = 1

Pronto, se você não se preveniu, o usuário conseguiu logar no sistema sem nem mesmo existir na base!

E pode não parecer, mas o @Mateuss já está usando api mysqli, acontece que ao invés de usar funções está usando orientado a objetos…

Quanto ao include de conexão, há outras formas de se fazer, criando uma classe responsável só para isso, usando namespaces + autoloads, etc…

2 curtidas

@LostSoldier Sem problemas! Na verdade a unica forma de tentar evitar isso que eu conhecia era essa. E também não sei lidar com orientação a objetos no PHP ainda.

No final o tópico acabou me ajudando também xD

1 curtida