Stijn121 / educom-webshop-oop-1693492209

0 stars 0 forks source link

Tip maak gebruik van associative array's in plaats van array's met 2 typen data #22

Open JeroenHeemskerk opened 1 year ago

JeroenHeemskerk commented 1 year ago

In onderstaande code wordt steeds een aantal ":sleutel" waarden gegeven en daarna in dezelfde volgoorde de values https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/usercrud.php#L13 https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/usercrud.php#L23 https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/usercrud.php#L33 https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/usercrud.php#L43 https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/shopcrud.php#L13 https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/shopcrud.php#L23 https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/shopcrud.php#L54

Hier mixen we sleutels en values in dezefde array, dit is niet correct, ook is er een onuitgesproken verbinding tussen de eerste helft aan values in de array naar de tweede serie aan values.

Beter is het om associatieve arrays te gebruiken (en ook de : laten vervallen voor de sleutels)

$params = array("name" => $name, "email" => $email, "password" => $password); 

Dit maakt onderstaande code in de CRUD veel eenvoudiger: https://github.com/Stijn121/educom-webshop-oop-1693492209/blob/47b4e585cb2f9121d6418c19191c6b69b646a0d1/models/crud.php#L13-L24 wordt dan

 public function createrow($sql, $params){ 
     $conn = $this -> connection(); 

     $stmt = $conn->prepare($sql); 
     foreach($params as $key => $value){ 
         $stmt -> bindParam(":".$key, $value); 
     } 
     $stmt -> execute(); 
 } 
JeroenHeemskerk commented 1 year ago

Sterker nog, het opbouwen van een connectie, het preparen, het bind-den en het executen kan nu zo hetzelfde worden dat je het in een eigen functie kan zetten (mits je de $conn een class property maakt):

private function prepareBindAndExecute() {
     $this -> connection(); 

     $stmt = $this -> conn -> prepare($sql); 
     foreach($params as $key => $value){ 
         $stmt -> bindParam(":".$key, $value); 
     } 
     $stmt -> setFetchMode(PDO::FETCH_OBJ);
     $stmt -> execute();
     return $stmt; 
}

De public functies in CRUD worden nu:

    public function createrow($sql, $params){
        $this->prepareBindAndExecute($sql, $params);
        return $this->conn->lastInsertId();
    }
    public function readOneRow($sql, $params=[]){
        $stmt = $this->prepareBindAndExecute($sql, $params);

        return $stmt -> fetch();
    }
    public function readMultipleRows($sql, $params=[]){
        $stmt = $this->prepareBindAndExecute($sql, $params);

        return $stmt -> fetchAll();
    }

    public function updaterow($sql, $params){
        $this->prepareBindAndExecute($sql, $params);
    }

    public function deleterow($sql, $params){
        $this->prepareBindAndExecute($sql, $params);
    }