Eu tenho esse código que faz a consulta no meu banco de dados, porém quando eu executo o código o php mostra um erro na execução da função query eu queria saber porque acontece isso. Fiz isto para poder usar o comando password_verify().
$email = $conexao->real_escape_string(filter_input(INPUT_POST, 'loginEmail', FILTER_SANITIZE_EMAIL));
$senha = $conexao->real_escape_string(htmlspecialchars($_POST['loginSenha']));
$sqlCode = $conexao->prepare("SELECT * FROM users WHERE email = ?");
if(!$sqlCode){
echo 'erro na consulta: '. $conexao->errno .' - '. $conexao->error;
}
$sqlCode->bind_param('s', $email);
$sqlCode->execute();
$sqlCode->store_result();
$sqlQuery = $conexao->query($sqlCode);
$usuario = $sqlQuery->fetch_assoc();
Fatal error: Uncaught TypeError: mysqli::query(): Argument #1 ($query) must be of type string, mysqli_stmt given in C:\xampp\htdocs\Site\scripts\php\LoginCadastro.php:18
Stack trace:
#0 C:\xampp\htdocs\Site\scripts\php\LoginCadastro.php(18): mysqli->query(Object(mysqli_stmt))
#1 {main}
thrown in
C:\xampp\htdocs\Site\scripts\php\LoginCadastro.php on line
18
Como a mensagem de erro informa, o primeiro argumento da função query() deve ser uma string (com o comando sql), e você está passando um mysqli_stmt.
Pelo código, você está tentando realizar 2 vezes a consulta (uma com execute, outra com quer). O que espera obter com isso?
Abraço.
Desculpa, é porque eu segui dois tutoriais um sobre proteção contra sql injection e outro para criptografia de senhas para a inserção em um banco de dados, aí os códigos são diferentes, aí me criou uma bagunça mas acredito ter conseguido resolver, por favor varifique se o código está correto
email = $conexao->real_escape_string(filter_input(INPUT_POST, 'loginEmail', FILTER_SANITIZE_EMAIL));
$senha = $conexao->real_escape_string(htmlspecialchars($_POST['loginSenha']));
//Validando dados de email do form
$sqlCode = $conexao->prepare("SELECT * FROM users WHERE email = ?");
if(!$sqlCode){
echo 'erro na consulta: '. $conexao->errno .' - '. $conexao->error;
}
$sqlCode->bind_param('s', $email);
$sqlCode->execute();
$result = $sqlCode->get_result();
$usuario = $result->fetch_assoc();
O primeiro teste para saber se um código está correto é: dá o resultado que você espera? Se sim, você já está em um bom caminho.
Você está usando PDO ou mysqli? Pois alguns dos comandos parecem ser do mysqli (com o qual não estou familiarizado). PDO é normalmente o recomendado hoje em dia.
De toda forma, você pode passar os parâmetros diretamente pro execute, então o bind_param em si é desnecessario. Passando como array, os parâmetros casam com as respectivas interrogações, na ordem que estão no select. Não me lembro o que faz o get_result(), mas não costumo usá-lo. Em PDO, seria algo como:
$sqlCode = $conexao->prepare("SELECT * FROM users WHERE email = ?");
$sqlCode->execute([$email]);
$usuario = $result->fetch(PDO::FETCH_ASSOC);
(Veja a referência: PHP: PDOStatement::fetch - Manual )
Isso vai retornar um array com todos os campos da tabela, sendo o nome da coluna a chave do campo, então para pegar os valores, seria algo como:
$nome = $usuario['nome']; // supondo que existe uma coluna nome.
Não lembro se count($usuario) ou isset($usuario) funcionam pra testar se há registros, precisaria experimentar.
Note que você pode usar o query também, mas normalmente precisa optar prepare+execute ou query entre um e outro.
Abraço.
1 curtida