2

J'ai étudié l'injection de dépendances.Injection de dépendances en PHP

  • Suis-je sur quelque chose ou est-il complètement éteint?
  • Le code est-il bon ou mauvais - Injection de dépendances ou non?

Le code ci-dessous est la base d'un système CMS

En ce moment, il y a une table appelée « page_details » avec toutes les pages Web stockées.

Structure de répertoire/fichier

.htaccess 
index.php 
classes/Db.class.php 
classes/Page.class.php 
config/config.php 
config/init.php 

.htaccess

# Mod rewrite enabled. 
Options +FollowSymLinks 
RewriteEngine on 

# ---- Rules ---- 

RewriteRule ^([A-Za-z0-9-_]+)\.html$ index.php?page=$1 [NC,L] 

index.php

<?php require_once ('config/init.php'); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" /> 
    <meta http-equiv="imagetoolbar" content="no" /> 
    <title></title> 
    <meta name="Description" content="" /> 
    <meta name="Keywords" content="" /> 
    <link href="/css/styles.css" media="screen" rel="Stylesheet" type="text/css" /> 
</head> 
<body> 
<?php 
$page = new Pages($db); 
print_r($page->get_page($_GET['page'])); 
?> 
</body> 
</html> 

Db.class.php

<?php 
class Db 
{ 
    private $dbhost; 
    private $dbuser; 
    private $dbpassword; 
    private $dbname; 
    private $connection; 
    public $query; 
    function __construct($dbhost, $dbuser, $dbpassword, $dbname) 
    { 
     $this->dbhost = $dbhost; 
     $this->dbuser = $dbuser; 
     $this->dbpassword = $dbpassword; 
     $this->dbname = $dbname; 
    } 
    public function open_connection() 
    { 
     try 
     { 
      $this->connection = mysqli_connect($this->dbhost, $this->dbuser, $this-> 
       dbpassword, $this->dbname); 
     } 
     catch (exception $e) 
     { 
      throw $e; 
     } 
    } 
    public function close($query) 
    { 
     try 
     { 
      mysqli_close($this->connection); 
     } 
     catch (exception $e) 
     { 
      throw $e; 
     } 
    } 
    public function query($query) 
    { 
     try 
     { 
      $this->open_connection(); 
      $result = mysqli_query($this->connection, $query); 
      return $result; 
     } 
     catch (exception $e) 
     { 
      throw $e; 
     } 
     $this->close_connection(); 
    } 
    public function fetchArray($query) 
    { 
     $row = mysqli_fetch_assoc($query); 
     return $row; 
    } 
    public function count_rows($query) 
    { 
     $row = mysqli_num_rows($query); 
     return $row; 
    } 
    public function rows_affected() 
    { 
     $row = mysqli_affected_rows($this->connection); 
     return $row; 
    } 
    public function created_id() 
    { 
     $row = mysqli_insert_id($this->connection); 
     return $row; 
    } 
} 
?> 

Page.class.php

<?php 
class Pages 
{ 
    private $db; 
    function __construct($db) 
    { 
     $this->db = $db; 
    } 
    function get_page($seo_url) 
    { 
     $sql = $this->db->query("SELECT * FROM page_details WHERE seo_url='$seo_url'"); 
     $row = $this->db->fetchArray($sql); 
     return $row; 
    } 
} 
?> 

config.php

<?php 
$config = array(); 
$config['dbtype'] = 'mysqli'; 
$config['dbhost'] = 'localhost'; 
$config['dbname'] = 'name'; 
$config['dbuser'] = 'user'; 
$config['dbpassword'] = 'password'; 
$config['absolute_path'] = '/var/www/vhosts/example.com/httpdocs'; 
$config['website_root'] = 'http://www.example.com/'; 
$config['dummy'] = ''; 
?> 

init.php

<?php 
require_once ('config/config.php'); 
function __autoload($class_name) 
{ 
    require_once (''.$config['absolute_path'].'classes/' . $class_name . '.class.php'); 
} 
$db = new Db($config['dbhost'], $config['dbuser'], $config['dbpassword'], $config['dbname']); 
?> 
+1

Vous devez échapper $ seo_url, il y a une injection sql. – Kevin

+0

Gotcha. Merci. – Cudos

Répondre

2

Je ne sais pas comment vous vous attendez à se __autoload à appeler (je ne vois pas vous appeler new someclass partout dans votre code), mais sur le visage de celui-ci à l'aide __autoload pour inclure automatiquement les classes qui doivent être chargés est une bonne idée, et vous l'utilisez correctement.

Quelques commentaires généraux sur votre code cependant:

  1. Je l'ai utilisé AOP au lieu de mysqli directement - il un peu plus sûr (injection SQL sage), plus l'épreuve du futur, et je pense que c'est aussi plus facile.
  2. Je vérifie que le fichier require d existe avant d'essayer de le faire, et lance une exception qui peut être attrapée par l'application et signalée de façon agréable.
  3. vous voulez probablement print votre contenu et non print_r il, mais je suppose que vous faites cela pour le débogage.
+0

Pour le moment, il ne récupère que Db.class.php & Pages.class.php - ils sont appelés dans init.php et index.php. Beaux points sur PDO & requis. J'utilise print_r pour le débogage. C'est simplement pour mettre la structure en place. – Cudos

0

L'injection de dépendance est la DB -> Pages? Oui, ça a l'air bien. Cela semble être une approche raisonnable.

Voici une idée d'encapsulation (pas DI): Vous pourriez penser à ce que vous obtenez de la classe Pages.En ce moment, il vous donne simplement le nom de la table db. Et si c'était un Page? Au lieu de renvoyer la ligne $ de données, il pourrait le posséder. Vous pouvez ensuite ajouter des méthodes à Page pour faciliter l'accès à ces différentes colonnes des données de page. Cette architecture vous donnerait une place pour mettre du code sur la page. Ce serait au lieu d'aller directement à la ligne $ dans le code d'affichage (la ligne print_r maintenant).

+0

Point intéressant. Pourriez-vous s'il vous plaît expliquer plus à ce sujet? – Cudos

Questions connexes