De temps en temps, je vois des questions concernant la connexion à la base de données.
La plupart des réponses ne sont pas comme je le fais, ou je pourrais simplement ne pas obtenir les réponses correctement. En tous cas; Je n'y ai jamais pensé parce que ma façon de faire fonctionne pour moi.
Mais voici une pensée folle; Peut-être que je fais tout cela mal, et si c'est le cas; J'aimerais vraiment savoir comment me connecter correctement à une base de données MySQL en utilisant PHP et PDO et la rendre facilement accessible.
Voici comment je fais:
Tout d'abord, voici ma structure de fichiers (dépouillée) :
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 existe une meilleure façon, ou plus correcte, d'inclure des cours, mais je ne me souviens pas de ce que c'était. Je n'ai pas encore eu le temps de l'examiner, mais je pense que c'était quelque chose avec autoload
. quelque chose comme ca...
configure.php
Ici, je remplace simplement certaines propriétés de php.ini et fais une autre configuration globale pour le site
connect.php
J'ai mis la connexion sur une classe pour que d'autres classes puissent étendre celle-ci ...
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();
//
Ici, je pense qu'il y a place pour une amélioration massive depuis que j'ai récemment commencé à apprendre la POO et à utiliser PDO au lieu de mysql.
Je viens donc de suivre quelques tutoriels pour débutants et d'essayer différentes choses ...
sessions.php
En plus de gérer les sessions régulières, j'initialise également certaines classes dans une session comme celle-ci:
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, c'est 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)
À l'intérieur de ma sqlQuery
- classe , que extends
ma connect_pdo
- classe , j'ai une fonction publique appelée getAreaName
qui gère la demande à ma base de données.
Assez chouette je pense.
Fonctionne comme un charme
Alors c'est comme ça que je le fais.
De plus, chaque fois que j'ai besoin de récupérer quelque chose de ma base de données hors d'une classe, je fais simplement 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);
Depuis que j'ai mis la connexion dans une variable à l'intérieur de connect_pdo.php , je viens d'y faire référence et je suis prêt à partir. Ça marche. J'obtiens mes résultats attendus ...
Mais indépendamment de cela; J'apprécierais vraiment que vous me disiez si je suis loin d'ici. Ce que je devrais faire à la place, les domaines que je pourrais ou devrais changer pour amélioration, etc.
J'ai hâte d'apprendre ...