Ir para conteúdo
Fórum Script Brasil
  • 0

mysql_result()


Yugi Moto

Pergunta

Olá pessoal !!!

Fiz um script para atualizar senhas sem precisar utilizar sessions, tudo funciona bem, porem quando eu digito um usuário que não existe no DB ele me retorna estes erros:

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 3 in C:\xampp\htdocs\site\change_pass2.php on line 47

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 3 in C:\xampp\htdocs\site\change_pass2.php on line 47

Warning: mysql_result() [function.mysql-result]: Unable to jump to row 0 on MySQL result index 4 in C:\xampp\htdocs\site\change_pass2.php on line 52
as linhas que ele retorna são essas:
if(mysql_result($result,0) != $pass3 && mysql_result($result,0) != NULL){    //Linha 47

            if(mysql_result($checkloginres,0) == NULL) {  //Linha 52
o script todo está abaixo...
<?php
// Conexão com o DB
$db_server = 'localhost'; // Endereço do Banco de dados
$db_user = 'root'; // Usuário que tenha previlegios ao banco de dados
$db_pass = ''; // Senha do Usuário Acima.
$db_db = 'teste100'; // Banco de dados

if (isset($_POST['userid']) != NULL && isset($_POST['pass']) != NULL && isset($_POST['pass2']) != NULL) {
    $link = @mysql_connect($dbserver,$db_user,$db_pass);
    $userid = mysql_real_escape_string($_POST['userid']);
    $pass = mysql_real_escape_string($_POST['pass']);
    $pass2 = mysql_real_escape_string($_POST['pass2']);
    $pass3 = md5($_POST['pass']);
    $pass4 = md5($_POST['pass2']);
    if (strlen($userid) < 4) {
        echo 'Login Incorreto';
    }
    elseif (strlen($pass) < 4 || strlen($pass2) < 4 || $pass == NULL || $pass2 == NULL) {
        echo "Digite uma Senha!";
      } else {
        $result = mysql_query("SELECT 'user_pass' FROM $db_db.login WHERE 'userid' = '$userid'");
        if(mysql_result($result,0) != $pass3 && mysql_result($result,0) != NULL){
            echo 'Senha incorreta !!';
        } else {
            $checklogin = "SELECT 'userid' FROM $db_db.login WHERE 'userid' = '$userid'";
            $checkloginres = mysql_query($checklogin);
            if(mysql_result($checkloginres,0) == NULL) {
                echo 'Um Erro foi encontrado';
               } else {
                $query = "UPDATE $db_db.login SET 'user_pass' = '$pass4' WHERE 'userid' = '$userid'";
                mysql_query($query);
                echo 'Senha foi mudada com sucesso';
            }
        }
    }
    mysql_close($link);
}
?>
Como eu disse, o script funciona muito bem, só ocorre o erro se eu digito um usuário que não existe... outra duvida..
$pass = mysql_real_escape_string($_POST['pass']);
    $pass2 = mysql_real_escape_string($_POST['pass2']);
    $pass3 = md5($_POST['pass']);
    $pass4 = md5($_POST['pass2']);

existe um geito de fazer tudo de uma vez??

tipo, anti_injection+MD5+mysql_real_escape_string ???

pra não ficar essa coisa grotesca...

Valeu pessoal !!!

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Quanto a essa sua dúvida:

"existe um geito de fazer tudo de uma vez??

tipo, anti_injection+MD5+mysql_real_escape_string ???"

Dá pra fazer assim, por exemplo:

$pass = md5(mysql_real_escape_string($_POST['pass']));
    $pass2 = md5(mysql_real_escape_string($_POST['pass2']));
Só que pense um pouco, pra que um antisql injection em uma variável que vai ser passada pra hash MD5? Se o cara tentar inflitrar qualquer coisa, essa coisa vai ser passada pra MD5 e não vai fazer diferença alguma... O que está acontecendo com o seu código é que, mysql_result quando não encontra um resultado baseado no que você informou, gera um warning... ai você tem duas alternativas: Primeira, resgata os dados da query com mysql_fetch_assoc ou mysql_fetch_array, que não gera esse erro, exemplo:
$x = mysql_fetch_assoc($result);
        if($x['ser_pass'] != $pass3 && !empty($x['ser_pass'])){
            echo 'Senha incorreta !!';
Segunda, omite o erro com o @, exemplo...
@$pass_bd = mysql_result($result,0);
        if($pass_bd != $pass3 && !empty($pass_bd)){
            echo 'Senha incorreta !!';

Note que eu troquei != NULL pela função empty, por ela ser mais rápida (a diferença é mínima, mas existe)...

Link para o comentário
Compartilhar em outros sites

  • 0

hmmm, entendi ESerra, no exemplo abaixo, me corrija se estiver errado...

Antes

$checklogin = "SELECT 'userid' FROM $db_db.login WHERE 'userid' = '$userid'";
            $checkloginres = mysql_query($checklogin);
            if(mysql_result($checkloginres,0) == NULL) {
                echo 'user dont exist';
Depois
$checklogin = mysql_query("SELECT `userid` FROM $db_db.login WHERE `userid` = '$userid'");
            $x = mysql_fetch_assoc($checklogin);
            if($x == NULL) {
                echo 'user dont exist!';
não testei o código, mas seguindo o seu exemplo é para funcionar...xD quanto ao:
$pass = md5(mysql_real_escape_string($_POST['pass']));
    $pass2 = md5(mysql_real_escape_string($_POST['pass2']));

a minha ideia é carregar um anti injection e o mysql_real_escape_string

ou será que não tem necessidade de utilizar os dois ??

Link para o comentário
Compartilhar em outros sites

  • 0
hmmm, entendi ESerra, no exemplo abaixo, me corrija se estiver errado...

Antes

$checklogin = "SELECT 'userid' FROM $db_db.login WHERE 'userid' = '$userid'";
            $checkloginres = mysql_query($checklogin);
            if(mysql_result($checkloginres,0) == NULL) {
                echo 'user dont exist';
Depois
$checklogin = mysql_query("SELECT `userid` FROM $db_db.login WHERE `userid` = '$userid'");
            $x = mysql_fetch_assoc($checklogin);
            if($x == NULL) {
                echo 'user dont exist!';
não testei o código, mas seguindo o seu exemplo é para funcionar...xD
Tá errado... $x não retornar nada, o correto é $x['ALGUMA COISA'], onde alguma coisa vai ser o nome da coluna (ou colunas) que vieram na consulta...
$pass = md5(mysql_real_escape_string($_POST['pass']));
    $pass2 = md5(mysql_real_escape_string($_POST['pass2']));

a minha ideia é carregar um anti injection e o mysql_real_escape_string

ou será que não tem necessidade de utilizar os dois ??

O problema não é carregar um anti sql injection e o mysql_real_escape_string, se você for aplicar o MD5 não precisa nada disso, pois mesmo que o cara coloque lá -> algumacoisa OR 1=1, na hora que passar isso pra MD5 acaba o perigo... afinal de contas isso dai vai virar um hash...

Link para o comentário
Compartilhar em outros sites

  • 0

Nossa então sera o meu PHP que está com problema ??

pois eu rodei do geito que eu fiz e funcionou normal...

se eu coloco um usuário que não existe ele retorna a mensagem,

to usando o Xampp com PHP5.

-----------------------------------------

já o anti sql injection e o mysql_real_escape_string entendi, realmente não tem sentido fazer tratamento se vai virar um hash.

Do mais Obrigado ESerra !!!

Link para o comentário
Compartilhar em outros sites

  • 0

Você não entendeu o que eu disse, o mysql_result retorna um erro SE não tiver nada para exibir conforme os parâmetros que foram passados, SE a sua consulta não retornar nenhum resultado é claro que vai dar erro, pois nesse caso o mysql_result não vai ter nada pra retornar, agora se o usuário for encontrado o mysql_result vai funcionar perfeitamente... se quiser apenas omitir o erro coloque o @ conforme eu passei acima... assim não será mostrado o warning mesmo que o mysql_result falhe...

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652k
×
×
  • Criar Novo...