D'accord : include_once dirname(__DIR__)."/includes/config.php"; mais l'autoload ? (sur ce point, je doute que ça soit un oubli)
D'accord : include_once dirname(__DIR__)."/includes/config.php"; mais l'autoload ? (sur ce point, je doute que ça soit un oubli)
Malgré mes recherches, j'ai pas trouvé ce que signifiait fichier pleinement qualifié. Est-ce que quelqu'un peut me renseigner ?
Salut,
Lis bien cette discussion, toutes les explications sont dedans.
Salut,
j'ai beau avoir regardé de nouveau cette discussion, j'ai fait ce code :
fichier principal, lignes du début :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php include_once dirname(__DIR__)."/includes/config.php"; require_once dirname(__DIR__).'/includes/connect/testautoloader2.php'; include_once dirname(__DIR__)."/includes/connect/connect_mysql.php"; ?>
config.php :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php session_start(); define("ROOT", "html5test"); ?>
testautoloader2.php :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 <?php include_once dirname((__DIR__))."\config.php"; $autoloader = function($full_class_name) { // on prépare le terrain : on remplace le séparteur d'espace de nom par le séparateur de répertoires du système $name = str_replace('\\', DIRECTORY_SEPARATOR, $full_class_name); // on construit le chemin complet du fichier à inclure : // il faut que l'autoloader soit toujours à la racine du site $path = ROOT."\includes\connect\\".$name.'.php'; // on vérfie que le fichier existe et on l'inclut // sinon on passe la main à une autre autoloader (return false) if (is_file($path)) { include $path; } else { return false; } }; spl_autoload_register($autoloader); ?>
connect_mysql.php :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <?php //include_once dirname((__DIR__))."\config.php"; use includes\connect\MyPdo; //// connexion try{ $bdd = new MyPdo("calendar");//("calendar"); } catch(PDOException $e){ echo "argggggggggggggg".$e->getMessage(); return(FALSE); } ?>
MyPdo.php :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 <?php namespace includes\connect; error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE); ini_set('display_errors','1'); // MyPDO // ls : la classe MyPdo hérite de la classe PDO (extends) class MyPdo extends PDO { protected $DB_NAME; protected $HOST = "---"; protected $USER ="---"; protected $PASS ="---"; // ls : le constructeur de MyPdo appelle le constructeur de PDO en lui passant ses paramètres function __construct($db_name) { /* ls : la variable $pdo_options, ça date de ma formation de 2012 */ $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;//important sur les configs récentes $pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;//pour le mode objet $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";//pour l'utf-8 $this->DB_NAME = $db_name; parent::__construct('mysql:host=' . $this->HOST . ';dbname=' . $this->DB_NAME,$this->USER,$this->PASS,$pdo_options); } } ?>
message d'erreur :Donc ça n'a pas suffi...Class 'includes\connect\MyPdo' not found in C:\wamp64\www\vhstest160218\includes\connect\connect_mysql.php on line 7![]()
Salut,
on va reprendre :
On doit être clair : ton fichier principal correspond au fichier sur lequel sont redirigées toutes les requêtes ? Dans ce cas, il est toujours lu au démarrage de chaque requête, c'est bien ça, j'ai bien compris ?
dans ton fichier principal qui doit se situer à la racine du site tu mets ceci :
Pour ta classe PDO, tu va faire comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 <?php define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR); $autoloader = function($full_class_name) { // on prépare le terrain : on remplace le séparteur d'espace de nom par le séparateur de répertoires du système $name = str_replace('\\', DIRECTORY_SEPARATOR, $full_class_name); // on construit le chemin complet du fichier à inclure : // il faut que l'autoloader soit toujours à la racine du site $path = DIR_ROOT.$name.'.php'; // on vérfie que le fichier existe et on l'inclut // sinon on passe la main à une autre autoloader (return false) if (is_file($path)) { include $path; return true; } else { return false; } }; spl_autoload_register($autoloader);
- tu va créer un dossier à la racine du site Bdd, ensuite dans ce dossier tu va créer fichier nommé PDOCalendar.php dans lequel tu va mettre :
Ensuite dans ton code, partout où tu auras besoin d'un accès au données tu devras juste faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 <?php namespace Bdd; // ICI ÇA CORRESPOND AUX NOMS DES RÉPERTOIRES CONTENANT LE FICHIER -> LARBORESCENCE DEPUIS LA RACINE DU SITE use PDO; /** * @throws \PDOException */ class PDOCalendar { const DB_NAME = 'calendar'; const HOST = ''; const USER = ''; const PASS = ''; /** * @var \PDO */ private static $cnx = null; /** * @return \PDO * @throws \PDOException */ public static function getPDO() { // si la connexion n'a pas déjà été ouverte, on l'ouvre sinon on la renvoie (SINGLETON) if (self::$cnx === null) { // ouverture de la connexion $options = [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_EMULATE_PREPARES => false, \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ, \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ]; $dsn = 'mysql:host='.self::HOST.';dbname='.self::DB_NAME; $pdo = new \PDO($dsn, self::USER, self::PASS, $options); self::$cnx = $pdo; } return self::$cnx; } }
Comme tu peux le voir, tu n'as plus aucune inclusion à faire, le PHP se débrouille tout seul.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?php use Bdd\PDOCalendar; $pdo = PDOCalendar::getPDO();
L'auto-chargement transforme le nom de la classe pleinement qualifié : Bdd\PDOCalendar en un fichier DIR_ROOT/Bdd/PDOCalendar.php, puis vérifie que ce fichier existe et si oui, l'inclut pour toi.
Si tu ne comprends pas ceci, je ne sais pas comment délayer encore plus mes explications.
Bonjour,
en fait mon code ne fonctionne pas comme tu le penses. Ce n'est pas de la POO et donc il n'y a pas de contrôleur pour recevoir toutes les requêtes et appeler le bon code. Mes différentes pages sont au niveau 1 et si on dit que la racine est au niveau 0, ces pages sont codées comme cela :donc un répertoire pour chaque page et ces différents répertoires sont des sous-répertoires de la racine.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 <!DOCTYPE html> <html lang="fr"> <head> <title>titre du site</title> <link href="../css/style-menu2.css" rel="stylesheet"/> <meta charset="UTF-8"/> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <header> <?php include("../entete.php"); ?> </header> <nav> <?php include("../menu3.php"); ?> </nav> <section id="id_section"> <article id="article0"> squelette </article> </section> <footer> <?php include("../footer.php"); ?> </footer> </body> </html>
Donc si je dois créer un fichier principal qui soit à la racine et appelé à chaque fois, je pense modifier le menu et donc pour chaque rubrique, faire un lien vers un fichier unique index.php avec un paramètre indiquant la page à ouvrir et dans ce fichier index.php faire une redirection vers la page indiquée par le paramètre. Est-ce une bonne méthode ?
Donc l'idée est simple : tu continues à utiliser ton site tel quel surtout au niveau des chemins : https://www.tonsite.com/admin/journal/add ou https://www.tonsite.com/admin/journal/add.php mais en arrière plan tu centralises tous tes appels vers index.php qui devient ton unique point d'entrée du site et à partir de ce point tu décides quel fichier exécuter.
Cette approche t'ouvre la porte du concept MVC plus précisément tu touches du doigt le Contrôleur (Front controller).
Voici le code d'un micro-contrôleur (de mon cru) qui fait exactement ce que j'ai décrit juste avant :
et donc ton fichier index.php devient (avec l'autoloader et maintenant avec le micro-contrôleur) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 // micro-contrôleur // récupération du path de l'url $path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); $path = rtrim($path, '.php'); // quand la page demandée est différente du point d'entrée du site index.php // on analyse la demande et on essaie de trouver un fichier qui serait suceptible // de prendre en charge la requête if ($path !== '') { $parts = explode('/', $path); // on vérifie que les valeurs du tableau ne sont que des 0..9 a..z A..Z foreach ($parts as $p) { if ( ! ctype_alnum($p)) { exit('Erreur dans la requête'); } } // transformation du path du chemin de l'URL en chemin de fichier $file = DIR_ROOT.implode(DIRECTORY_SEPARATOR, $parts).'.php'; if (is_file($file)) { // on passe la main au fichier en charge de fournir une réponse à la requête include $file; exit; } else { exit('Erreur dans la requête'); } } // ici tu mets code source de la page index.php à envoyer à l'utilisateur
Pour que cela fonctionne tu dois indiquer au serveur web (Apache par exemple) de rediriger toutes les requêtes vers ton unique point d'entrée du site index.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 <?php define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR); $autoloader = function($full_class_name) { // on prépare le terrain : on remplace le séparteur d'espace de nom par le séparateur de répertoires du système $name = str_replace('\\', DIRECTORY_SEPARATOR, $full_class_name); // on construit le chemin complet du fichier à inclure : // il faut que l'autoloader soit toujours à la racine du site $path = DIR_ROOT.$name.'.php'; // on vérfie que le fichier existe et on l'inclut // sinon on passe la main à une autre autoloader (return false) if (is_file($path)) { include $path; return true; } else { return false; } }; spl_autoload_register($autoloader); // micro-contrôleur // récupération du path de l'url $path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); $path = rtrim($path, '.php'); // quand la page demandée est différente du point d'entrée du site index.php // on analyse la demande et on essaie de trouver un fichier qui serait suceptible // de prendre en charge la requête if ($path !== '') { $parts = explode('/', $path); // on vérifie que les valeurs du tableau ne sont que des 0..9 a..z A..Z foreach ($parts as $p) { if ( ! ctype_alnum($p)) { exit('Erreur dans la requête'); } } // transformation du path du chemin de l'URL en chemin de fichier $file = DIR_ROOT.implode(DIRECTORY_SEPARATOR, $parts).'.php'; if (is_file($file)) { // on passe la main au fichier en charge de fournir une réponse à la requête include $file; exit; } else { exit('Erreur dans la requête'); } } // ici tu mets le code source de la page index.php à envoyer à l'utilisateur ou un include du genre accueil.php
Tu rediriges tout sauf les requêtes réclamant des fichiers de base du genre .css, .js .jpg .png ...
Je pars du postulat de base que tes css sont dans un répertoire /css, javascript dans /js et images dans /img
Voici ce qu tu dois ajouter dans le fichier de configuration d'apache :
Une fois le fichier de configuration modifié, n'oublie pas de redémarrer le serveur web Apache pour qu'il prenne en compte la nouvelle configuration.
Code text : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 RewriteEngine On RewriteCond %{REQUEST_URI} /(index)|(home)(\..{3,4})?$ [NC] RewriteRule ^.* http://www.tonsite.fr [R=301,L] RewriteCond %{REQUEST_FILENAME} !^/css/.*$ RewriteCond %{REQUEST_FILENAME} !^/js/.*$ RewriteCond %{REQUEST_FILENAME} !^/img/.*$ RewriteRule . /index.php [QSA,L]
Bon ça fait un gros pavé mais ça devrait te servir et aux autres aussi![]()
Ouh là là !
autant le code de l'autoloader, je suivais, mais là, le micro-contrôleur, je suis largué (sans oublier le code du post #26). Bon ce soir et demain dans la journée, pas le temps d'y toucher mais je garde ça pour demain soir...
et la modif de la config apache, ça concerne bien un fichier httpd.conf ?
Bon, j'ai laissé ça de côté plusieurs jours, mais je m'y remets.
Déjà, que me conseilles-tu ? Tenter de comprendre ton code avant de l'utiliser (ce qui n'est pas du tout le cas pour le moment) ou faire confiance et l'utiliser comme une boîte noire ?
Et même si je pars sur l'option boîte noire, je ne vois pas comment m'y prendre : quel type d'URL va rentrer l'utilisateur et où est le menu ?
Salut,
je ne sais pas comment t'as l'habitude de procéder, donc comment faire je n'en sais rien.
Ensuite pour les URL je ne vois pas où est le problème.
Tes URL ne changent pas, tu continues à les utiliser comme avant, tu continues à créer tes fichiers PHP comme avant avec l'arborescence comme avant, bref ça ne change presque rien pour toi sauf qu'au lieu d'avoir un point d'entrée à chaque URL, tu n'auras plus qu'une seule et unique porte d'entrée pour tout le site ce qui te permettra de charger simplement un environnement d'exécution personnalisé avec tes fonctions, classes et modules communs à tout le site sans être obligé d'aller faire du gymkhâna pour gérer tes inclusions.
Salut,
même si je tente d'utiliser ton code sans chercher à le comprendre, je ne vois pas comment l'utiliser.
Dans mon code actuel, chaque page a la structure suivante :
Donc tu vois qu'à la ligne 13, j'inclue le menu, et effectivement pour chaque page, j'ai un point d'entrée spécifique. Et donc, dans ce menu, pour atteindre une page, l'URL (relative) est de la forme ../rép._de_la_page/page.php et donc l'URL d'une des pages du site est http://mon_site/rép._de_la_page/page.php. Je suppose donc qu'il faudra au moins enlever cet include (et est-ce que je laisse les autres ? (en-tête, footer et css (pas un include celui-là, mais quand même code commun à tout le site)). Mais en y réfléchissant, il faut bien y avoir un menu, donc plutôt garder l'include et modfier le menu, mais comment ?
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 <!DOCTYPE html> <html lang="fr"> <head> <title>titre du site</title> <link href="../css/style-menu2.css" rel="stylesheet"/> <meta charset="UTF-8"/> </head> <body> <header> <?php include("../entete.php"); ?> </header> <nav> <?php include("../menu3.php"); ?> </nav> <section> <article> <?php //code de la page ?> </article> </section> <footer> <?php include("../footer.php"); ?> </footer> </body> </html>
le micro-contrôleur va analyser l'url reçue : http://mon_site/rép._de_la_page/page.php et va vérifier s'il existe un fichier rep_racine_du_site/rep_de_la_page/page.php, si oui va l'inclure comme s'il était appelé directement
OK mais si je laisse le menu tel quel, le micro-contrôleur ne sera pas appelé, vu qu'on appelera http://mon_site/rép._de_la_page/page.php et non http://mon_site/index.php donc d'après moi, ça ne peut pas marcher...à moins que la modif de la config de apache ne soit là pour ça ! Tu peux confirmer ?
Oui, il faut modifier la configuration d'Apache.
C'est le serveur web qui se charge de rediriger tout le trafic sur la page d'index.php
Je suis pour le test sous wamp. J'ai modifié httpd.conf comme indiqué et créé index.php (copier-coller du code du post 29) maisquand j'entre l'URL http://mon_site/index.phpErreur dans la requête![]()
Salut,
bon, j'ai testé chez moi et le micro-contrôleur fonctionne sans soucis.
Tiens vérifie un truc :
Vérifie que le fichier appelé existe bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $file = DIR_ROOT.implode(DIRECTORY_SEPARATOR, $parts).'.php'; echo $file; exit;
Bonsoir, j'ai investigué un peu plus et je pense avoir découvert l'origine du problème mais ne sais pas le résoudre :
testmvc/index.php :
donne
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $imp=implode(DIRECTORY_SEPARATOR, $parts); $file = DIR_ROOT.implode(DIRECTORY_SEPARATOR, $parts).'.php'; echo $file." ////DIR_ROOT=".DIR_ROOT."<br/>"; var_dump($parts); var_dump($imp); exit;
EDIT : j'ai testé sur serveur/var/www/vhosts/vercorshandisport.org/httpdocs/testmvc/testmvc/index.php ////DIR_ROOT=/var/www/vhosts/vercorshandisport.org/httpdocs/testmvc/
array(2) { [0]=> string(7) "testmvc" [1]=> string(5) "index" } string(13) "testmvc/index"
Ben le comportement que tu obtiens est tout à fait normal.
Tu réclames l'url : testmvc/index.php
Vu que DIR_ROOT=/var/www/vhosts/vercorshandisport.org/httpdocs/testmvc/ le chemin vers le fichier appelé est DIR_ROOT/testmvc/index.php ce qui donne une fois les éléments résolus : /var/www/vhosts/vercorshandisport.org/httpdocs/testmvc/testmvc/index.php
Demande donc juste index.php ou juste la racine du site sans index.php
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager