De temps en temps, je vois des questions concernant la connexion à la base de données.
La plupart des réponses ne sont pas la façon dont je le fais, ou je pourrais simplement ne pas obtenir les réponses correctement. Quoi qu'il en soit, je n'y ai jamais pensé parce que la façon dont je le fais fonctionne pour moi.
Mais voici une idée folle : peut-être que je m'y prends mal, et si c'est le cas, j'aimerais vraiment savoir comment se connecter correctement à une base de données MySQL en utilisant PHP et PDO et la rendre facilement accessible.
Voici comment je m'y prends :
Tout d'abord, voici la structure de mon fichier (dépouillé) :
public_html/
* index.php
* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php
index.php
Tout en haut, j'ai require('initialize/load.initialize.php');
.
load.initialize.php
# site configurations
require('configure.php');
# connect to database
require('root/somewhere/connect.php'); // this file is placed outside of public_html for better security.
# include classes
foreach (glob('assets/classes/*.class.php') as $class_filename){
include($class_filename);
}
# include functions
foreach (glob('assets/functions/*.func.php') as $func_filename){
include($func_filename);
}
# handle sessions
require('sessions.php');
Je sais qu'il y a une meilleure façon, ou une façon plus correcte, d'inclure les classes, mais je ne me souviens pas de ce que c'était. Je n'ai pas encore eu le temps d'y jeter un coup d'œil, mais je pense que c'était quelque chose comme autoload
. quelque chose comme ça...
configure.php
Ici, je ne fais que remplacer des php.ini -et effectuer d'autres configurations globales pour le site.
connecter.php
J'ai mis la connexion sur une classe pour que les autres classes puissent étend celui-là...
class connect_pdo
{
protected $dbh;
public function __construct()
{
try {
$db_host = ' '; // hostname
$db_name = ' '; // databasename
$db_user = ' '; // username
$user_pw = ' '; // password
$con = new PDO('mysql:host='.$db_host.'; dbname='.$db_name, $db_user, $user_pw);
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$con->exec("SET CHARACTER SET utf8"); // return all sql requests as UTF-8
}
catch (PDOException $err) {
echo "harmless error message if the connection fails";
$err->getMessage() . "<br/>";
file_put_contents('PDOErrors.txt',$err, FILE_APPEND); // write some details to an error-log outside public_html
die(); // terminate connection
}
}
public function dbh()
{
return $this->dbh;
}
}
# put database handler into a var for easier access
$con = new connect_pdo();
$con = $con->dbh();
//
Je pense qu'il est possible de s'améliorer considérablement dans ce domaine, car j'ai récemment commencé à apprendre la programmation orientée objet et à utiliser PDO au lieu de mysql.
J'ai donc suivi quelques tutoriels pour débutants et essayé différents trucs...
sessions.php
En plus de gérer les sessions régulières, j'initialise également certaines classes dans une session comme ceci :
if (!isset($_SESSION['sqlQuery'])){
session_start();
$_SESSION['sqlQuery'] = new sqlQuery();
}
De cette façon, cette classe est disponible partout. Ce n'est peut-être pas une bonne pratique ( ?)...
Bref, voilà ce que cette approche me permet de faire de partout :
echo $_SESSION['sqlQuery']->getAreaName('county',9); // outputs: Aust-Agder (the county name with that id in the database)
Dans mon sqlQuery
- classe qui extends
mon connect_pdo
- classe J'ai une fonction publique appelée getAreaName
qui gère la requête vers ma base de données.
Plutôt chouette, je trouve.
Fonctionne comme un charme
Donc c'est en gros la façon dont je le fais.
De plus, lorsque j'ai besoin d'extraire quelque chose de ma base de données à partir d'une classe, je fais quelque chose de similaire à ceci :
$id = 123;
$sql = 'SELECT whatever FROM MyTable WHERE id = :id';
$qry = $con->prepare($sql);
$qry -> bindParam(':id', $id, PDO::PARAM_INT);
$qry -> execute();
$get = $qry->fetch(PDO::FETCH_ASSOC);
Puisque j'ai mis la connexion dans une variable à l'intérieur connect_pdo.php j'ai juste à m'y référer et je suis prêt à partir. Cela fonctionne. J'obtiens les résultats attendus...
Mais indépendamment de cela, j'apprécierais vraiment si vous pouviez me dire si je suis à côté de la plaque. Ce que je devrais faire à la place, les domaines que je pourrais ou devrais changer pour m'améliorer, etc...
Je suis impatient d'apprendre...
9 votes
Vous devriez utiliser un autoloader au lieu d'inclure chaque fichier unique dans votre demande immédiatement.
4 votes
Cette question est probablement mieux sur Examen du code