Avatar billede nomisweb Nybegynder
19. juli 2007 - 17:23 Der er 16 kommentarer og
1 løsning

fejl i login funktion?

Hej,
Jeg har nedenstående loginfunktion, men der er et eller andet forkert i den og jeg kan ikke finde fejlen. Jeg har brugt den før hvor den virker fint. Det mærkelige er at jeg har taget den der virker fint og kopieret direkte over, men nu vil den ikke virke! Meget mystisk!

php ser således ud:
<?php
require_once '../library/config.php';
require_once './library/functions.php';

$errorMessage = '&nbsp;';

if (isset($_POST['txtUserName'])) {
    $result = doLogin();
    if ($result != '') {
        $errorMessage = $result;
    }
}
?>

<html>
<head>
<title>Shop Admin - Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="include/admin.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="750" border="0" align="center" cellpadding="0" cellspacing="1" class="graybox">
<tr>
  <td><img src="include/banner-top.gif" width="750" height="75"></td>
</tr>
<tr>
  <td valign="top"> <table width="100%" border="0" cellspacing="0" cellpadding="20">
    <tr>
    <td class="contentArea"> <form method="post" name="frmLogin" id="frmLogin">
      <p>&nbsp;</p>
      <table width="350" border="0" align="center" cellpadding="5" cellspacing="1" bgcolor="#336699" class="entryTable">
        <tr id="entryTableHeader">
        <td>:: Admin Login ::</td>
        </tr>
        <tr>
        <td class="contentArea">
        <div class="errorMessage" align="center"><?php echo $errorMessage; ?></div>
          <table width="100%" border="0" cellpadding="2" cellspacing="1" class="text">
          <tr align="center">
            <td colspan="3">&nbsp;</td>
          </tr>
          <tr class="text">
            <td width="100" align="right">User Name</td>
            <td width="10" align="center">:</td>
          <td><input name="txtUserName" type="text" class="box" id="txtUserName" size="10" maxlength="20"></td>
          </tr>
          <tr>
            <td width="100" align="right">Password</td>
            <td width="10" align="center">:</td>
            <td><input name="txtPassword" type="password" class="box" id="txtPassword" size="10"></td>
          </tr>
          <tr>
            <td colspan="2">&nbsp;</td>
            <td><input name="btnLogin" type="submit" class="box" id="btnLogin" value="Login"></td>
          </tr>
          </table></td>
        </tr>
      </table>
      <p>&nbsp;</p>
      </form></td>
    </tr>
  </table></td>
</tr>
</table>
<p>&nbsp;</p>
</body>
</html>

Selve login funktionen ser således ud:
function doLogin()
{
    // if we found an error save the error message in this variable
    $errorMessage = '';

    $userName = $_POST['txtUserName'];
    $password = $_POST['txtPassword'];
// first, make sure the username & password are not empty
    if ($userName == '') {
        $errorMessage = 'You must enter your username';
    } else if ($password == '') {
        $errorMessage = 'You must enter the password';
    } else {
        // check the database and see if the username and password combo do match
        $sql = "SELECT user_id FROM tbl_user WHERE user_name = '$userName' AND user_password = PASSWORD '$password')";
        $result = dbQuery($sql);
    if (dbNumRows($result) == 1) {
            $row = dbFetchAssoc($result);
            $_SESSION['plaincart_user_id'] = $row['user_id'];
            // log the time when the user last login
            $sql = "UPDATE tbl_user
                    SET user_last_login = NOW()
                WHERE user_id = '{$row['user_id']}'";
            dbQuery($sql);
// now that the user is verified we move on to the next page
// if the user had been in the admin pages before we move to
// the last page visited
            if (isset($_SESSION['login_return_url'])) {
                header('Location: ' . $_SESSION['login_return_url']);
                exit;
            } else {
                header('Location: index.php');
            exit;
            }
        } else {
            $errorMessage = 'Wrong username or password';
        }       
}

Den kommer hele tiden frem med "wrong username or password", selv om det er det rigtige. Det virker nærmest som om den ikke har forbindelse til database?!
Håber der er der kan hjælpe.
S
Avatar billede jakobdo Ekspert
19. juli 2007 - 20:47 #1
Prøv at vis hvordan din config.php er sat op.
Husk at fjern brugernavn og kodeord.
Avatar billede Slettet bruger
19. juli 2007 - 23:19 #2
require_once '../library/config.php';
require_once './library/functions.php';
Lægger disse 2 filer (config.php & functions.php) ikke i sammen mappe?
Så skal du lige rette til, der er et punktum ved den ene og 2 ved den anden.
Avatar billede nomisweb Nybegynder
20. juli 2007 - 10:51 #3
coldgate - Det er fordi der er en functions.php som høre til admin delen, hvor jeg skal bruge denne login ting, og så er der en overordnet config fil som bruge af både front og backend, så lige det med en eller to . er faktisk rigtig nok, men tak for det! :-)

starten af config filen ser således ud:
<?php
ini_set('display_errors', 'On');
//ob_start("ob_gzhandler");
error_reporting(E_ALL);

// start the session
session_start();

// database connection config
$dbHost = 'localhost';
$dbUser = 'user';
$dbPass = 'password';
$dbName = 'name';

// setting up the web root and server root for
// this shopping cart application
$thisFile = str_replace('\\', '/', __FILE__);
$docRoot = $_SERVER['DOCUMENT_ROOT'];

$webRoot  = str_replace(array($docRoot, 'library/config.php'), '', $thisFile);
$srvRoot  = str_replace('library/config.php', '', $thisFile);

define('WEB_ROOT', $webRoot);
define('SRV_ROOT', $srvRoot);

?>

Der er også en "database" fil som måske I vil se også:
<?php
require_once 'config.php';

$dbConn = mysql_connect ($dbHost, $dbUser, $dbPass) or die ('MySQL connect failed. ' . mysql_error());
mysql_select_db($dbName) or die('Cannot select database. ' . mysql_error());

function dbQuery($sql)
{
    $result = mysql_query($sql) or die(mysql_error());
    return $result;
}

function dbAffectedRows()
{
    global $dbConn;
    return mysql_affected_rows($dbConn);
}

function dbFetchArray($result, $resultType = MYSQL_NUM) {
    return mysql_fetch_array($result, $resultType);
}

function dbFetchAssoc($result)
{
    return mysql_fetch_assoc($result);
}

function dbFetchRow($result)
{
    return mysql_fetch_row($result);
}

function dbFreeResult($result)
{
    return mysql_free_result($result);
}

function dbNumRows($result)
{
    return mysql_num_rows($result);
}

function dbSelect($dbName)
{
    return mysql_select_db($dbName);
}

function dbInsertId()
{
    return mysql_insert_id();
}
?>
Avatar billede jakobdo Ekspert
20. juli 2007 - 21:38 #4
Din funktion burde melde fejl, hvis ikke kunne forbinde til databasen.

Det gør din kode her:

$dbConn = mysql_connect ($dbHost, $dbUser, $dbPass) or die ('MySQL connect failed. ' . mysql_error());
mysql_select_db($dbName) or die('Cannot select database. ' . mysql_error());
Avatar billede nomisweb Nybegynder
20. juli 2007 - 22:25 #5
ja og det gør den ikke. Kan det være noget med opsætningen af serveren det ligger på? Jeg bruger det som sagt et sted hvor det virker, men på denne nye server virker det så ikke.
Avatar billede jakobdo Ekspert
20. juli 2007 - 22:43 #6
Du skal nok debugge din kode og tjekker om hver funktion går godt eller ej.
Avatar billede nomisweb Nybegynder
20. juli 2007 - 23:39 #7
ja desværre! :-(
Avatar billede ranglen Nybegynder
20. juli 2007 - 23:52 #8
$sql = "SELECT user_id FROM tbl_user WHERE user_name = '$userName' AND user_password = PASSWORD '$password')";

prøv at sætte fejludskrift på når du sender denne sql af sted
Avatar billede nomisweb Nybegynder
21. juli 2007 - 11:31 #9
Ok nu har jeg prøvet at lave noget fejludskrift, men jeg er ikke sikker på det er helt som du mente! :-)
Jeg satte dette ind:
$errorMessage = 'Wrong username or password '.$result.' '.$sql.' '.dbNumRows($result);

Så funktionen kom til at se således ud:
function doLogin()
{
    // if we found an error save the error message in this variable
    $errorMessage = '';
   
    $userName = $_POST['txtUserName'];
    $password = $_POST['txtPassword'];
   
    // first, make sure the username & password are not empty
    if ($userName == '') {
        $errorMessage = 'You must enter your username';
    } else if ($password == '') {
        $errorMessage = 'You must enter the password';
    } else {
        // check the database and see if the username and password combo do match
        $sql = "SELECT user_id FROM tbl_user WHERE user_name = '$userName' AND user_password = PASSWORD('$password')";
        $result = dbQuery($sql);
   
        if (dbNumRows($result) == 1) {
            $row = dbFetchAssoc($result);
            $_SESSION['plaincart_user_id'] = $row['user_id'];
           
            // log the time when the user last login
            $sql = "UPDATE tbl_user SET user_last_login = NOW() WHERE user_id = '{$row['user_id']}'";
            dbQuery($sql);

            // now that the user is verified we move on to the next page
            // if the user had been in the admin pages before we move to
            // the last page visited
            if (isset($_SESSION['login_return_url'])) {
                header('Location: ' . $_SESSION['login_return_url']);
                exit;
            } else {
                header('Location: index.php');
                exit;
            }
        } else {
            $errorMessage = 'Wrong username or password '.$result.' '.$sql.' '.dbNumRows($result);
        }       
           
    }
   
    return $errorMessage;
}

Min $errorMessage ser så ud sådan her:
Wrong username or password Resource id #10 SELECT user_id FROM tbl_user WHERE user_name = 'simon' AND user_password = PASSWORD('simon') 0

Der sker altså et eller andet forkert fra $result = dbQuery ($sql); til dbNumRows($result), men jeg forstår ikke hvad. Jeg er ved at lede efter noget om Resource id #, måske hjælper det?
Det skal også lige sige at database forbindelsen fungere fint med alle de funktioner jeg bruger når man er logget ind!
Avatar billede jakobdo Ekspert
21. juli 2007 - 12:04 #10
Er dit brugernavn og kodeord: simon?
Avatar billede nomisweb Nybegynder
21. juli 2007 - 12:16 #11
ja, det er jo bare som test. der er også en anden der er admin for begge dele, men ingen virker!
Avatar billede jakobdo Ekspert
22. juli 2007 - 13:17 #12
Hvis du i phpmyadmin laver:

SELECT PASSWORD('simon');
Får du så det samme "tekst" som står ud for password og brugernavnet simon?
Avatar billede nomisweb Nybegynder
22. juli 2007 - 13:42 #13
Jeg fik en tekst streng på 41 tegn, men i min database havde jeg sat varchar til 32 tegn. Nu har jeg ændret det i min database og login virkede! FEdt!
Men har du en ide til hvorfor det virkede på en anden server med samme opsætning i database som jeg bruger nu, og ikke virkede her?
Sender du et svar?
Tak for hjælp...
Avatar billede nomisweb Nybegynder
22. juli 2007 - 13:44 #14
er det fordi der er forskel på den phpmyadmin som der bruges på de 2 servere jeg har prøvet, eller måske i php versionerne?
Avatar billede jakobdo Ekspert
22. juli 2007 - 13:58 #15
Det har ikke noget med php eller phpmyadmin at gøre.
PASSWORD er en MYSQL funktion.

Og hvorfor der er forskel på serverne/versioner, skal du nok hellere læse her:
http://dev.mysql.com/doc/refman/4.1/en/password-hashing.html
Du får et svar.
Avatar billede nomisweb Nybegynder
22. juli 2007 - 14:09 #16
Jamen så lærte jeg det! Tak :-)
Hvor er det latterligt det "bare" var det...typisk!
Avatar billede jakobdo Ekspert
22. juli 2007 - 14:12 #17
:o)
Jeg takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester