Como ultilizar fetch_assoc em um query com uma consulta ultilizando prepare statements

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

Obrigado pela ajuda.