Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal!
Estou iniciando os estudos sobre Mysqli e oop; porém já me deparo com um problema! Normalmente, quando programo em php estruturado (me corrijam se eu estiver falando errado), e me deparo com problemas como este, sei que o erro é bobo, mas, agora estou "navegando em águas misteriosas" e não sei onde piso... perdoem-me pelo trocadilho.
Nota: Estou usando como base de meus estudos, um post do blog do Thiago Belem; então não sei se esta é a melhor maneira de fazer. Estou aberto a sugestões.
Objetivo do código: Checar se name, lastName e login já estão em uso.
Problema encontrado: Ao realizar pesquisas no BD, nem um valor é encontrado, como resultado: o usuário é cadastrado mesmo com dados já existentes.
if($search = $connect->prepare("SELECT id FROM user WHERE name = ? && last_name = ?")){
$search->bind_param('ss', $name,$last_name);// Substitui os ? pelas variáveis
$search->execute();
if(!$search->execute()){
echo "<font color='#F60000'><h2>Erro no Arquivo <b>Register.php</b> -> Não foi possível realizar buscas. (Linha 104)</h2>";
exit;
}else{
$cont = $search->num_rows;
echo $cont; // retorna 0; por isso adiante no código, o usuário é cadastrado mesmo com nome já existente no bd.
}
}
//[...] PS.: Esta é uma adaptação do código original, apenas a parte que realiza o erro; se precisarem eu posto a original.Em primeiro lugar, obrigado por responder a minha MP e ao meu tópico!
Da linha 28 até a 38, eu estou verificando se existe usuário ($cont = 1) ou se por algum erro no bd existe mais de 1 ($cont > 1);
O problema é que já existe o usuário no bd (mesmo nome, sobrenome e login), e mesmo assim não da certo ($cont retorna 0);
Depois de ter cadastrado o usuário, duplicando os valores no bd, tento cadastrar novamente e ele aceita ($cont < 2 and $cont < 1);
Outro detalhe importante é que, já testei este código sem usar mysqli e deu tudo certo (cadastro, mensagens de erro, etc..),
Acredito que o erro esteja no select. O que você acha?
Sim, o erro tem que estar no SELECT.
echo "SELECT id FROM user WHERE name = '{$_GET['name']}' AND last_name = '{$_GET['last_name']}'";
execute essa linha, pegue o resultado dela e rode diretamente no banco.
ps: Troque o seu && por AND, troque isso no seu script também
Coloquei este código sugerido por você no final; o echo exibiu o seguinte:
SELECT id FROM user WHERE name = 'Teste' AND last_name = 'Um'
Exatamente os nomes que estão registrados no banco de dados!
Pela minha lógica, era para o código ser barrado, pois o $cont deveria ser igual a 1.
*Executei no phpmyadmin e foram encontrados todos os registros. (Por causa do bug do cadastro, já tem vários registros iguais)
Pergunta: AND é melhor que && ?
Não é questão de melhor, é que em SQL, o E lógico é AND.
&& não existe, até onde me lembro
Intendo, mas eu sempre usei && e deu certo; mas vou seguir o seu conselho.
*Em relação ao problema, continua dando errado... :(
Acho que é por causa disso aqui:
http://www.php.net/manual/en/mysqli-stmt.num-rows.php
if(!$search->execute()){
echo "<font color='#F60000'><h2>Erro no Arquivo <b>Register.php</b> -> Não foi possível realizar buscas. (Linha 104)</h2>";
exit;
}else{
$search->store_result(); // store result
$cont = $search->num_rows;
echo $cont;
}Um...verdade! Agora estou no serviço, assim que chegar em casa eu testo.
Vlw por responder ao tópico e a minha mp, novamente! Vlw mesmo!!!
Cara, perfeito!!! Funcionou muito bem... muito obrigado pela sua ajuda!
oi @Wesley,
O ponto é:
$cont = $search->num_rows;
Nessa linha o valor está diferente de 1. Ai cadastra o usuário.
Para resolver, vc precisa identificar se a query está correta, e se existem dados no banco que batem com a query que vc está fazendo.
Comece debugando dai, verificando o valor da variavel $cont, e verificando como a query está chegando no banco, e se existem dados lá.