Avatar billede hans01 Forsker
02. november 2018 - 05:11 Der er 9 kommentarer

Login problem PDO

Jeg har lidt problemer med mit login script, jeg skal tjekke om brugernavn og password findes i mysql databasen, jeg modtager ingen fejl meldinger og scriptet sender folk til index siden selv om de ikke findes i databasen:

kan nogen hjælpe?

her er mit script:

    <?php
    session_start();
    include("dbh.php");
    ?>
    <?php
    $msg = "";
    if(isset($_POST['sublogin'])) {
      $uid = trim($_POST['uid']);
      $password = trim($_POST['password']);
      if($uid != "" && $password != "") {
          $msg = 'skal udfylde begge ';
        try {
          $query = "SELECT user_uid FROM users WHERE (username=:user_email or email=:user_email) AND password=:user_password";
          $stmt = $pdoConnect->prepare($query);
          $stmt->bindParam('user_uid', $uid, PDO::PARAM_STR);
          $stmt->bindValue('user_password', $password, PDO::PARAM_STR);
          $stmt->execute();
          $count = $stmt->rowCount();
          $row  = $stmt->fetch(PDO::FETCH_NUM);{
              echo $row['user_uid'];
          }
          if($count == 1 && !empty($row)) {
            /******************** Your code ***********************/
            $_SESSION['sess_user_uid']  = $row['uid'];
            $_SESSION['sess_user_password'] = $row['password'];
            //$_SESSION['sess_name'] = $row['name'];
         
          } else {
            $msg = "Invalid username and password!";
          }
        } catch (PDOException $e) {
          echo "Error : ".$e->getMessage();
        }
      } else {
        $msg = "Both fields are required!";
       
      }
    }else {
          header("Location:../index.php");
          exit();
      }
    ?>
Avatar billede erikjacobsen Ekspert
02. november 2018 - 08:52 #1
Feltet i din SQL-sætning hedder vel  user_email, så

    $stmt->bindParam('user_uid', $uid, PDO::PARAM_STR);

skal vel være

    $stmt->bindParam('user_email', $uid, PDO::PARAM_STR);
Avatar billede Slater Ekspert
02. november 2018 - 08:59 #2
Så vidt jeg kan se bliver man kun sendt til index.php hvis $_POST['sublogin'] slet ikke findes, hvilket vil sige at intet af resten af koden bliver kørt.

Det virker lidt underligt, men det vil da forklare hvorfor du ikke ser noget. Findes $_POST['sublogin']?

Ud over det, kan vi se du lagrer passwords som ren tekst. Det er virkelig en skidt idé på så mange måder. De bør hashes med password_hash() og tjekkes med password_verify(), hvilket betyder man slet ikke kan tjekke dem i SQL-sætningen, men bør hente brugeren ud fra navn og derefter tjekke om password stemmer.
Avatar billede olsensweb.dk Ekspert
02. november 2018 - 09:01 #3
coden er utested

>if(isset($_POST['sublogin']))
bliver denne variabel sendt ??


>$stmt->bindParam('user_uid', $uid, PDO::PARAM_STR);
>$stmt->bindValue('user_password', $password, PDO::PARAM_STR);
ser ikke rigtigt ud
hvor binder du værdien for user_email ??
tror du tænker på user_uid, som erikjacobsen er inde på



forvendtede noget ala, lig mærke til : og user_email
$stmt->bindParam(':user_email', $user_email, PDO::PARAM_STR);
$stmt->bindParam(':user_password', $password, PDO::PARAM_STR);


her
$row  = $stmt->fetch(PDO::FETCH_NUM);{
  echo $row['user_uid'];
}

ville jeg bruge FETCH_ASSOC
$row  = $stmt->fetch(PDO::FETCH_ASSOC);{
    echo $row['user_uid'];
}
Avatar billede hans01 Forsker
11. november 2018 - 08:56 #4
Hej Alle

Tak for jeres inputs, jeg har knoklet med scriptet en lille uge nu, dog uden nogen form for held..

Det er ligesom det er lige meget hvad jeg gør så kan jeg ikke scriptet til at gøre noget som helst, den viser ingen fejl. Det er som om jeg mangler et eller andet centralt.

Jeg har ændret mit script i forhold til tidligere, da jeg har hashed password.

Har nogen en ide, så jeg kan komme videre:

Her er scriptet:

<?php
session_start();
include_once ('dbh.php');
//If the POST var "login" exists (our submit button), then we can
//assume that the user has submitted the login form.
if(isset($_POST['submit-login'])){
   
    //Retrieve the field values from our login form.
    $username = !empty($_POST['uid']) ? trim($_POST['uid']) : null;
    $passwordAttempt = !empty($_POST['password']) ? trim($_POST['password']) : null;
   
    //Retrieve the user account information for the given username.
    $sql = "SELECT * FROM users WHERE user_uid=:uid AND user_password=:password";
    $stmt = $pdoConnect->prepare($sql);
   
    //Bind value.
    $stmt->bindValue(':uid', $username);
   
    //Execute.
    $stmt->execute();
   
    //Fetch row.
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
   
    //If $row is FALSE.
    if($user === false){
        //Could not find a user with that username!
        //PS: You might want to handle this error in a more user-friendly manner!
        die('Incorrect username / password combination!');
    } else{
        //User account found. Check to see if the given password matches the
        //password hash that we stored in our users table.
       
        //Compare the passwords.
        $validPassword = password_verify($passwordAttempt, $user['password']);
       
        //If $validPassword is TRUE, the login has been successful.
        if($validPassword){
           
            //Provide the user with a login session.
            $_SESSION['user_id'] = $user['id'];
            $_SESSION['logged_in'] = time();
           
            //Redirect to our protected page, which we called home.php
            header('Location: ../index.php');
            exit;
           
        } else{
            //$validPassword was FALSE. Passwords do not match.
            die('Incorrect username / password combination!');
        }
    }
   
}

?>
Avatar billede Slater Ekspert
11. november 2018 - 09:09 #5
Hvis du ikke ser nogen fejl overhovedet, så prøv altid at starte med at tvinge PHP til at vise fejl, ved at tilføje:

ini_set('display_errors', 1);
error_reporting(E_ALL);

til toppen af PHP-sektionen.

Er det noget du laver lokalt eller direkte på en server?
Avatar billede erikjacobsen Ekspert
11. november 2018 - 09:47 #6
Bare for at teste:  sæt en lille tekst til sidst, efter ?>  for at se om siden læses ind, men php-koden ikke laver noget. Bare et lille trick ;)

Men ellers står der:

    if(isset($_POST['submit-login'])){ 

og hvis den ikke er sand springes alt over. Er du sikker på der findes sådan en værdi. Prøv evt lige efter session_start() at udskrive:

  print_r($_POST);
Avatar billede hans01 Forsker
11. november 2018 - 11:33 #7
@slater, satte dit forslag ind, giver ingen fejl..

den er local hosted.

@erikJacobsen, her er print:

Array ( [uid] => admin [password] => B1T1xKLp0Ksi [submit] => Login ) hej verden

så min send knap virker.. sært
Avatar billede olsensweb.dk Ekspert
11. november 2018 - 12:37 #8
#4 >if(isset($_POST['submit-login'])){
dette skulle gerne modsvare den variabel du sender her
ref #7 >[submit] => Login
så du kommer aldrig til din sql!!,


du har i din sql også en fejl, med AND user_password=:password";, du binder ikke password, men det skal heller ikke bruges i din nuværende sql.
du har ikke helt styr på hvad du kalder dine felter i db / html form


jeg prøvet at omskrive den lidt, så den virker

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
session_start();
include_once ('dbh.php');
//If the POST var "login" exists (our submit button), then we can
//assume that the user has submitted the login form.
if (isset($_POST['submit-login'])) {
    //Retrieve the field values from our login form.
    $username = !empty($_POST['uid']) ? trim($_POST['uid']) : null;
    $passwordAttempt = !empty($_POST['password']) ? trim($_POST['password']) : null;
    //Retrieve the user account information for the given username.
    $sql = "SELECT user_password FROM users WHERE user_uid=:uid";
    $stmt = $pdoConnect->prepare($sql);
    //Bind value.
    $stmt->bindValue(':uid', $username);
    //Execute.
    $stmt->execute();
    //Fetch row.
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    //If $row is FALSE.
    if ($user === false) {
        //Could not find a user with that username!
        //PS: You might want to handle this error in a more user-friendly manner!
        die('Incorrect username / password combination!');
    } else {
        //User account found. Check to see if the given password matches the
        //password hash that we stored in our users table.
        //Compare the passwords.
        $validPassword = password_verify($passwordAttempt, $user['user_password']);

        //If $validPassword is TRUE, the login has been successful.
        if ($validPassword) {
            //Provide the user with a login session.
            $_SESSION['user_id'] = $user['id'];
            $_SESSION['logged_in'] = time();
            //Redirect to our protected page, which we called home.php
            header('Location: ../index.php');
            exit;
        } else {
            //$validPassword was FALSE. Passwords do not match.
            die('Incorrect username / password combination!');
        }
    }
}
?>

test form
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
    <label><b>Username</b></label>
    <input type="text" placeholder="Enter Username" name="uid" required>
    <label><b>Password</b></label>
    <input type="password" placeholder="Enter Password" name="password" required>
    <button type="submit" name="submit-login" >Login</button>
</form>
         

test tabel
CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `firstname` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `lastname` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `user_uid` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `user_password` varchar(255) COLLATE utf8_danish_ci NOT NULL COMMENT '1234'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `users` (`id`, `firstname`, `lastname`, `user_uid`, `user_password`) VALUES
(1, 'rip', 'andemad', 'rip', '$2y$11$J1klMqKG9H4YQ1Tc.nRwROOvh7fqh0j2M3uR.LB1frNGNRwp.nmhK'),
(3, 'rap', 'and', 'rap', '$2y$11$IDHlfC86DWb9QeJF8oX8oebt7h1nFtU8EFmxuPRq5i6m5JB8r35H6'),
(4, 'rup', 'and', 'rup', '$2y$11$dR4Hh1ohiRilHKtncuhRYOIh4bxaDkEekp70KVgu1ymmNadB2Ji2y'),
(5, 'mickey', 'mouse', 'mickey', '$2y$11$3M2aXkLJdsbLhTN1pLpkvO0UtvgZ6Sy9Ohl5b8t2RCPBdxa2F8OK.'),
(7, 'bimmer', 'vildmand', 'bimmer', '$2y$11$lmBBjwPfC.QSBcENr3e8I.ryzxxvvZsSvM6ooH4O3v.7X0LYM8/GK'),
(8, 'jule', 'mand', 'jule', '$2y$11$GplmOAAdCLzzWoRTEXrzf.GqS8TvRk77eKZkr2bPN2i7LA8j3njRm');


ALTER TABLE `users`
  ADD PRIMARY KEY (`id`), 
  ADD KEY `idx_lastname` (`lastname`);


ALTER TABLE `users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
         

log ind med feks rap og password 1234
Avatar billede hans01 Forsker
13. november 2018 - 06:08 #9
God morgen Olsensweb, tak for et flot forslag, jeg har fulgt dit forslag, jeg har oprettet en ny database, med navnet jf, min formular ligger i en bootstrap modal, og efter jeg har oprettet den nye database, vil min modal ikke åbne..

skifter jeg til den gamle database er der ingen problemer.. Jeg modtager ingen fejl meldinger.

min dbh.php ser sådan ud:

<?php

$dbServername = "localhost";
$dbUsername = "root";
$dbPassword = "";
$dbname = "jf";

try{
    $pdoConnect = new PDO("mysql:host=$dbServername; dbname=$dbname;", $dbUsername, $dbPassword);
    $pdoConnect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
       
} catch(PDOException $e){
    die("connection failed: " . $e->getMessage());
    }
   
   
    ?>
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

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