• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Gdzie popełniam błąd? PDO

Aruba Cloud - Virtual Private Server VPS
+1 głos
546 wizyt
pytanie zadane 22 marca 2018 w SQL, bazy danych przez Kacper Mieliński Użytkownik (600 p.)
edycja 22 marca 2018 przez Kacper Mieliński

Witam przerzuciłem się ostatnio z mysqli na PDO i mam problem z kodem. Siedzę już troszkę nad tym i niezbyt wiem gdzie popełniam błąd.

index.php

<?php
session_start();
require_once('application/core.php');
?>
<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <title><?php echo $core->webName.' - '.$core->webDescription;?></title>
    </head>
</html>
<body>
    <form method="post" action="list.php">
        <label>Login <input type="text" name="login"></label>
        <label>Hasło <input type="password" name="pass"></label>
        <input type="submit" value="Zaloguj">
    </form>
</body>

core.php

<?php
class Web{
    
    public $webName;
    public $webDescription;
    public $host;
    public $user;
    public $pass;
    public $database;
    
    public $db;
    
    public function __construct(){
        $this->webName = 'Test';
        $this->webDescription = 'Test';
        $this->host = 'localhost';
        $this->user = 'root';
        $this->pass = '';
        $this->database = 'strona';
        try{
            $db = new PDO('mysql:host='.$this->host.';dbname='.$this->database.';charset=utf8', $this->user, $this->pass, [
            PDO::ATTR_EMULATE_PREPARES => false, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
        } catch (PDOException $error){
        exit('Database error');
        }
    }
    
}
$core = new Web;

list.php

<?php
session_start();
if (isset($_POST['login'])) {
    $login = filter_input(INPUT_POST, 'login');
    $password = filter_input(INPUT_POST, 'pass');
    
    //echo $login . " " .$password;
    require_once('application/core.php');
    $sql = "SELECT id_user, pass FROM user WHERE user = :user";
    $stmt = $core->db->prepare($sql);
    $stmt->bindValue(':user', $login, PDO::PARAM_STR);
    $stmt->execute();
    
    echo $stmt->rowCount();
        
} else {
    header('Location: index.php');
    exit();
}
?>
<!DOCTYPE html>
<html>
WORK!
</html>
    

 

2 odpowiedzi

+2 głosów
odpowiedź 22 marca 2018 przez Arkadiusz Waluk Ekspert (290,090 p.)
wybrane 22 marca 2018 przez Kacper Mieliński
 
Najlepsza
    $sql = "SELECT id_user, pass FROM user WHERE user = :user";
    $stmt->bindValue(':user', $login, PDO::PARAM_STR);
    $stmt = $core->db->prepare($sql);
    $stmt->execute();

Jak dla mnie błąd jest tutaj, najpierw próbujesz zrobić bindValue na $stmt, którego jeszcze nie ma, bo dopiero linijkę niżej zostanie zwrócone z prepare(). Czy coś poza tym nie wiem, powiedz co dokładnie nie działa i jaki masz problem.

komentarz 22 marca 2018 przez Kacper Mieliński Użytkownik (600 p.)

Fatal error: Uncaught Error: Call to a member function prepare() on null in /var/www/html/test/list.php:12 Stack trace: #0 {main} thrown in /var/www/html/test/list.php on line 12

komentarz 22 marca 2018 przez Arkadiusz Waluk Ekspert (290,090 p.)
Czyli $core->db jest nullem, nie ma tam obiektu PDO. I to w zasadzie jest zrozumiałe, bo w klasie Web nie przypisujesz połączenia z bazą do właściwości klasy, a zwykłej zmiennej $db.
komentarz 22 marca 2018 przez Kacper Mieliński Użytkownik (600 p.)

Działa dzięki! Pozdrawiam!

try{
            $this->db = new PDO('mysql:host='.$this->host.';dbname='.$this->database.';charset=utf8', $this->user, $this->pass, [
            PDO::ATTR_EMULATE_PREPARES => false, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
        } catch (PDOException $error){
            exit('Database error');
        }

 

0 głosów
odpowiedź 22 marca 2018 przez Artek Stary wyjadacz (11,800 p.)
No to za mało. Napisz na czym polega ten błąd bo może być dużo różnych.
komentarz 22 marca 2018 przez Kacper Mieliński Użytkownik (600 p.)

Fatal error: Uncaught Error: Call to a member function prepare() on null in /var/www/html/test/list.php:12 Stack trace: #0 {main} thrown in /var/www/html/test/list.php on line 12

Podobne pytania

+1 głos
1 odpowiedź 162 wizyt
+1 głos
4 odpowiedzi 451 wizyt
pytanie zadane 28 października 2017 w C i C++ przez Dudekdude Początkujący (320 p.)
0 głosów
1 odpowiedź 216 wizyt
pytanie zadane 8 czerwca 2020 w PHP przez patryk241 Użytkownik (700 p.)

93,336 zapytań

142,332 odpowiedzi

322,418 komentarzy

62,672 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...