Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][pdo] Logowanie.
Forum PHP.pl > Forum > PHP
PawelBah
Witam, mam problem ze skryptem logowania.

W bazie mam użytkownika test, hasło: test. Podaje poprawne dane, ale niestety system zwraca informacje, że dane są błędne. Oto kod:

  1. <?php require_once 'header.php'; ?>
  2. <div id="container_background">
  3. <div id="container_content">
  4. <?php
  5. if((isset($_SESSION['logged'])) && logged($_SESSION['logged'], $_SESSION['browser'])){
  6. echo 'Zostałeś poprawnie zalogowany';
  7. //session_destroy();
  8. }else{?>
  9. <div id="home_logo"></div>
  10. <form id="login_form" action="login.php" method="POSt">
  11. <legend>Panel logowania</legend>
  12. <div>
  13. <label for="login">Login: </label>
  14. <input type="text" name="login"/>
  15. </div>
  16. <div>
  17. <label for="password">Hasło: </label>
  18. <input type="password" name="password"/>
  19. </div>
  20. <input type="image" src="../images/button_login.png" alt="Zaluguj się" name="login" id="login">
  21. </form>
  22. <?php } ?>
  23. </div>
  24. </div>
  25. </body>
  26. </html>


  1. <?php
  2. require 'header.php';
  3. require_once '../function.php';
  4.  
  5. if(isset($_POST['login_x'])){
  6. $_POST = array_map('trim', $_POST);
  7. $user = login($_POST['login'], $_POST['password']);
  8. if($user){
  9. $_SESSION['logged'] = true;
  10. $_SESSION['user'] = $user;
  11. $_SESSION['browser'] = $_SERVER['HTTP_USER_AGENT'];
  12. header('Location: '.$_SERVER['HTTP_REFERER']);
  13. }else{?>
  14. <p class="info">Wprowadziłeś błędne dane. Spróbuj raz jeszcze. <a href="<?php echo $_SERVER['HTTP_REFERER'];?>"><<< Wróć</a>.</p>
  15. <?php }
  16.  
  17. }
  18.  
  19. ?>


  1. function db_connect(){
  2. try{
  3. $db = new PDO('mysql:host='.DB_HOST.';db_name:'.DB_NAME, DB_USER, DB_PASS);
  4. return $db;
  5. }catch(PDOException $e){
  6. echo $e->getMessage();
  7. die();
  8. }
  9. }//db_connect
  10.  
  11. function login($login, $password){
  12. $db = db_connect();
  13. $stmt = $db->prepare('SELECT login FROM users WHERE login = :login AND password = :password');
  14. $stmt->bindValue(':login', $login);
  15. $stmt->bindValue(':password', sha1($password));
  16. $stmt->execute();
  17. $user = $stmt->fetch();
  18. if($user){
  19. return $user;
  20. }
  21. return false;
  22. }// login();
  23.  
  24. function logged($login, $browser){
  25. if($login && $browser == $_SERVER['HTTP_USER_AGENT']){
  26. return true;
  27. }
  28. return false;
  29. }


Męczę się z tym już trochę, zmieniłem na mysqli i o dziwo działało, ale chciałbym w PDO, ale niestety jest jakiś problem - jakieś sugestie?

*w pliku header znajduje się session_start()
CuteOne
  1. $stmt = $db->prepare('SELECT login FROM users WHERE login = :login AND password = :password');
  2. $stmt->execute(array(':login'=>$login, ':password'=>sha1($password));
  3. $user = $stmt->fetch(PDO::FETCH_ASSOC);
  4. //if($user){
  5. print_r($user); //zobacz co wyświetli..
  6. //return $user;
  7. //}
PawelBah
Nic nie wyświetla, natomiast var_dump($user) wyświetla: bool(false)
CuteOne
czyli w zapytaniu/konfiguracji masz błąd

spróbuj z samym loginem (z hasłem może być coś nie tak) lub zmień zapytanie na takie, które nie wymaga bindowania - sprawdzisz czy dobrze z konfigurowałeś połączenie
PawelBah
  1. function login($login, $password){
  2. $db = db_connect();
  3. $stmt = $db->query('SELECT login FROM users WHERE login = "test"');
  4. var_dump($stmt); //zobacz co wyświetli..
  5. if($stmt){
  6. return $stmt;
  7. }
  8. return false;
  9. }// login();


Ograniczyłem do takiego zapytania i:
var_dump: bool(false);

Zapytanie z poziomu MySQL zwraca jeden rekord.
Funkcja db_connect() jest ok! Nie rzuca wyjątkami.
WampServer Version 2.0

  1. try
  2. {
  3. $pdo = new PDO('mysql:host='.DB_HOST.';db_name:'.DB_NAME, DB_USER, DB_PASS);
  4. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.  
  6. $stmt = $pdo -> query('SELECT * FROM users WHERE login = test');
  7. echo '<ul>';
  8. foreach($stmt as $row)
  9. {
  10. echo '<li>'.$row['nazwa'].': '.$row['opis'].'</li>';
  11. }
  12. $stmt -> closeCursor();
  13. echo '</ul>';
  14. }
  15. catch(PDOException $e)
  16. {
  17. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  18. }


Postanowiłem sprawdzić na jakiś sprawdzonym kawałku kodu(z Wiki) i wywala wyjątek:

Połączenie nie mogło zostać utworzone: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

Szperam u Wujka G, ale jakby ktoś wiedział gdzie leży problem to byłbym wdzięczny.
Mephistofeles
A nie przypadkiem
  1. ;db_name=
?
PawelBah
Faktycznie, ale problem i tak nie został rozwiązany.
Smertius
Powinno być raczej
  1. dbname


Bez _

Poniżej przykładowe kod tworzący połączenie z bd

  1. $pdo= new PDO('mysql:host=localhost;dbname='. DB_NAME , DB_USER , DB_PASS , array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

PawelBah
Dzięki winksmiley.jpg Pierdoła, a zjadła 1/4 dnia winksmiley.jpg
wdev
To ja też, chociaż spóźniony, dorzucę parę groszy, tak dla potomności winksmiley.jpg PDO nie rzuca wyjątkami domyślnie (ma ustawione ERRMODE_SILENT), więc trudno się je debuguje. Pomaga ustawienie atrybutu:
  1. $podObject->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Więcej w manualu o błedach PDO: pdo.error-handling.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.