PDO, OOP, Composer

0

Witam,

Zacząłem ambitniej uczyć się programowania obiektowego w PHP i natrafiłem na pewien problem z zapytaniami. Z dodawaniem rekordów do bazy sobie poradziłem, mam problem z ich pobieraniem. Tak oto prezentuje się mój kod:

class DB.php


public function select($table,$conditions = array()){
        $sql = 'SELECT ';
        $sql .= array_key_exists("select",$conditions)?$conditions['select']:'*';
        $sql .= ' FROM '.$table;
        if(array_key_exists("where",$conditions)){
            $sql .= ' WHERE ';
            $i = 0;
            foreach($conditions['where'] as $key => $value){
                $pre = ($i > 0)?' AND ':'';
                $sql .= $pre.$key." = '".$value."'";
                $i++;
            }
        }
 
        if(array_key_exists("order_by",$conditions)){
            $sql .= ' ORDER BY '.$conditions['order_by'];
        }
 
        if(array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){
            $sql .= ' LIMIT '.$conditions['start'].','.$conditions['limit'];
        }elseif(!array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){
            $sql .= ' LIMIT '.$conditions['limit'];
        }
 
        $query = $this->db->prepare($sql);
        $query->execute();
         
        return !empty($data)?$data:false;
    }

class User.php


public function loginUser($credentials){
        $db = new DB();
        $email = $credentials['email'];
        $password = $credentials['password'];
        $result = $db->select('users', array('where'=>array('email'=>$email),'password'=>$password));
        if ($result->rowCount() > 0){
            //
        }else{
            //
        }
    }

login.php


<?php
require __DIR__ . '/../../../vendor/autoload.php';
 
use App\User;
 
$credentials = [
    'email' => $_POST['email'],
    'password' => $_POST['password']
];
$user = new User();
$user->loginUser($credentials);

błąd który otrzymuję

Fatal error: Uncaught Error: Call to a member function rowCount() on bool

0

Może spróbuj zaimplementować MVC, bo te zapytanie do bazy trochę "brudne" z jakimś if, foreach, jak dla mnie to najpierw powinieneś przygotować dane, a dopiero potem na nich pracować, czy foreach we widokach dopiero. Może zobacz jak to we frameworkach wygląda, lub wygooglaj mvc.

1

To co robisz pierwszą funkcją, czyli:

public function select

to zwracanie zawsze false, bo tak jak jest to skonstruowane to nigdy nie zwrócisz $data, bo nie przyporządkowujesz tej zmiennej wyniku działania funkcji query dlatego dostajesz ten komunikat:

Fatal error: Uncaught Error: Call to a member function rowCount() on bool

To co próbujesz robić tą funkcją realizują tak zwane ORMy, dzięki którym możesz budować zapytania SQL dynamicznie. Jednym z popularniejszych jest ORM Doctrine, ja używam fremeworka Phalcon i ORMa z tego frameworka.

W niektórych sytuacjach używanie ORMów bardzo ułatwia życie, ale trzeba pamiętać, że zapytania z ORM zawsze będą mniej wydajne chociażby przez narzut wielu funkcji w porównaniu do napisania prostego zapytania SQL tekstowo, po drugie relizacja pewnych natywnych spraw albo związanych z JSON w bazach danych jest utrudnione w większości ORMów. Ja stosuje ORMy głównie w panelach administracyjnych, natomiast do generowania danych na frontend który jest poza panelem administracyjnym dla adminów/właścicela systemu, ORMów zazwyczaj nie potrzeba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1