Jump to content
bioshock

Function (True or False) - Resolvido

Recommended Posts

bioshock

Viva.

Estou aqui com um problema numa função que quero que me retorne True ou False.

O problema é que eu não consigo detectar o valor que a mesma retorna.

Function VerificaEmail(){

    $queryEmail = $mysqli->prepare("SELECT email FROM utilizadores WHERE 
                                   email = ?");
                                   
    $queryEmail->bind_param("s", $email);
    
    $email = mysql_real_escape_string($_POST['email']);
    
    $queryEmail->execute();

    // Se já houver um email na base de dados..
    if($queryEmail->fetch()){
    // Retorna verdadeiro
    return true;
   
    }else{
    // Caso contrário retorna falso
    return false;
    
    }

Até aqui, eu creio que tenho bem. Agora o que preciso é de chamar a função, então pensei:

 

if(VerificaEmail == True){
      echo "Já existe";
     }else{
      echo "Não existe";
}

Mas não está a resultar...any ideas? ;)

Share this post


Link to post
Share on other sites
bioshock

Aff, o erro estava no mysqli, que eu tinha declarado antes da função e não me apercebi que tinha que o colocar dentro ;)

<?php 
    
    Function VerificaEmail(){
    $mysqli = @new mysqli("localhost", "root", "", "database");

    $queryEmail = $mysqli->prepare("SELECT email FROM utilizadores WHERE 
                                   email = ?");
                                   
    $queryEmail->bind_param("s", $email);
    
    $email = mysql_real_escape_string($_POST['email']);
    
    $queryEmail->execute();
    
    if($queryEmail->fetch()){
    
    return true;
   
    }else{
        
    return false;
        }
   $queryEmail->close();
   $mysqli->close();
}
if(VerificaEmail()){
      echo "Já existe";
     }else{
      echo "Não existe";
   }
     }

Share this post


Link to post
Share on other sites
mjamado

Ainda bem que já resolveste, mas duas notas:

1. Não uses o @ em instruções críticas! No sítio onde tens, em @new mysqli, se a instrução falhar ("MySQL server has gone away", por exemplo), a execução continua desnecessariamente, e depois nem sabes porque é que falhou;

2. Indenta-me esse código, carago! ;)


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
bioshock

Ainda bem que já resolveste, mas duas notas:

1. Não uses o @ em instruções críticas! No sítio onde tens, em @new mysqli, se a instrução falhar ("MySQL server has gone away", por exemplo), a execução continua desnecessariamente, e depois nem sabes porque é que falhou;

2. Indenta-me esse código, carago! ;)

Boas.

Epáh, eu utilizei o @ antes por alguma razão inicial que neste momento não me lembro. Mas acho que foi algo que vi no Manual.

Relativa-me ao "Indenta-me esse código" ainda me obrigaste a pesquisar para saber o seu significado. Mas está "descansado" que eu gosto do meu código bem organizado. :D

Share this post


Link to post
Share on other sites
brunoais

Estou vendo isso...

Aff, o erro estava no mysqli, que eu tinha declarado antes da função e não me apercebi que tinha que o colocar dentro ;)

<?php 
    
    Function VerificaEmail(){
    $mysqli = @new mysqli("localhost", "root", "", "database");

    $queryEmail = $mysqli->prepare("SELECT email FROM utilizadores WHERE 
                                   email = ?");
                                   
    $queryEmail->bind_param("s", $email); // $email não está definido
    
    $email = mysql_real_escape_string($_POST['email']); //Oh... foi definido aqui!. BTW... é preciso usar esta função? isto n é para o mysqli é para o mysql.
    
    $queryEmail->execute();

O manual n é claro em relação a dever-se usar o mysql_real_escape_string ou não, encontro isso.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
bioshock

Não percebi patavina.

O facto da variável email ser definida em baixo não têm qualquer problema.

Share this post


Link to post
Share on other sites
brunoais

As variáveis só podem ser usadas depois de serem declaradas e inicializadas. Senão são declaradas no momento com o valor null


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mjamado

As variáveis só podem ser usadas depois de serem declaradas e inicializadas. Senão são declaradas no momento com o valor null

No caso em concreto, errado.

O segundo parâmetro do método bind_param é passado por referência, o que quer dizer que assume qualquer valor atribuído à variável dali para a frente. Poder-se-ia atribuir o valor antes, mas vai dar ao mesmo, desde que seja antes do execute.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
brunoais

No caso em concreto, errado.

O segundo parâmetro do método bind_param é passado por referência, o que quer dizer que assume qualquer valor atribuído à variável dali para a frente. Poder-se-ia atribuir o valor antes, mas vai dar ao mesmo, desde que seja antes do execute.

Ok... obg. N me lembro de ter lido sobre isso no manual. Só me lmebro ter lido q é passado por referência em relação àquela função... Mas pensado um bocado até pode fazer sentido...

E em relação ao: mysql_real_escape_string()?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
mjamado
Ok... obg. N me lembro de ter lido sobre isso no manual. Só me lmebro ter lido q é passado por referência em relação àquela função... Mas pensado um bocado até pode fazer sentido...

Até pode fazer sentido? Claro que faz - tens é de saber o que é um parâmetro por referência, e isso não compete à documentação da função explicar, mas sim a um programador saber.

E em relação ao: mysql_real_escape_string()?

Só agora é que reparei que é a versão mysql_* e não mysqli_*. Provavelmente, vai retornar sempre false, porque não existe nenhuma conexão activa em mysql_*.

Mas mesmo que estivesse correcta, a instrução é desnecessária, visto que as prepared statments são automaticamente escapadas pelo motor. Mal não faz, mas bem também não.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
bioshock

Eu esqueci-me de alterar aqui o código para o mysqli_*. Mas se a instrução é desnecessária, posso retira-lá.

Share this post


Link to post
Share on other sites
socopo

Estou vendo isso...O manual n é claro em relação a dever-se usar o mysql_real_escape_string ou não, encontro isso.

http://wiki.portugal-a-programar.org/revistaprogramar_arquivo:11_edicao:vulnerabilidades_em_aplicacoes_web

No sub-titulo "Falhas de injecção e Insecure Direct Object Reference" explica a utilidade da função mysql_real_escape_string() pq foi lá que eu fiquei a conhecer essa função :P

Se faz algum sentido neste código? A meu ver não! Mas não sei até que ponto pode ter algum peso aqui

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.