• 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

Object Storage Arubacloud
+1 głos
367 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 (288,330 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 (288,330 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ź 121 wizyt
+1 głos
4 odpowiedzi 295 wizyt
pytanie zadane 28 października 2017 w C i C++ przez Dudekdude Początkujący (320 p.)
0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 8 czerwca 2020 w PHP przez patryk241 Użytkownik (700 p.)

92,757 zapytań

141,679 odpowiedzi

320,441 komentarzy

62,101 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...