Jak prawidłowo skonfigurować połączenie PDO
Od czasu do czasu widzę pytania dotyczące łączenia się z bazą danych.
Większość odpowiedzi to nie jest sposób, w jaki to robię, albo mogę po prostu nie uzyskać prawidłowych odpowiedzi. Tak czy inaczej; Nigdy o tym nie myślałem, ponieważ sposób, w jaki to robię, działa na mnie.
Ale tu jest szalona myśl; Może robię to wszystko źle, a jeśli tak jest; Naprawdę chciałbym wiedzieć, jak poprawnie połączyć się z bazą danych MySQL przy użyciu PHP i PDO i uczynić go łatwo dostępnym.
Oto jak to robię:
Po pierwsze, oto moja struktura plików(rozebrany):
public_html/
* index.php
* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php
index.php
Na samym szczycie mamrequire('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');
Wiem, że istnieje lepszy lub bardziej poprawny sposób włączenia klas, ale nie pamiętam, co to było. Nie zdążyłem jeszcze zajrzeć do tego, ale myślę, że to było cośautoload
. coś w tym stylu...
configure.php
Tutaj po prostu nadpisuję niektórephp.ini-properties i wykonaj inną globalną konfigurację witryny
connect.php
Połączyłem połączenie z klasą, aby inne klasy mogłyrozciąga się ten...
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();
//
Tutaj wierzę, że jest miejsce na ogromną poprawę, odkąd niedawno zacząłem uczyć się OOP i używać PDO zamiast mysql.
Po prostu śledziłem kilka samouczków dla początkujących i wypróbowałem różne rzeczy ...
session.php
Oprócz obsługi zwykłych sesji, inicjalizuję niektóre klasy w sesji takiej jak ta:
if (!isset($_SESSION['sqlQuery'])){
session_start();
$_SESSION['sqlQuery'] = new sqlQuery();
}
W ten sposób ta klasa jest dostępna w każdym miejscu. To może nie być dobra praktyka (?) ...
W każdym razie to właśnie pozwala mi to robić wszędzie:
echo $_SESSION['sqlQuery']->getAreaName('county',9); // outputs: Aust-Agder (the county name with that id in the database)
W moimsqlQuery
-klasa, któryextends
mójconnect_pdo
-klasa, Mam funkcję publiczną o nazwiegetAreaName
który obsługuje żądanie do mojej bazy danych.
Myślę, że całkiem fajnie.
Działa jak marzenie
Więc w zasadzie to robię.
Ponadto zawsze, gdy muszę pobrać coś z mojej bazy danych nie z klasy, robię coś podobnego do tego:
$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);
Odkąd umieściłem połączenie w zmiennej wewnątrzconnect_pdo.php, Po prostu się do tego odnosiłem i dobrze jest iść. To działa. Otrzymuję oczekiwane wyniki ...
Ale niezależnie od tego; Naprawdę byłbym wdzięczny, gdybyście mogli mi powiedzieć, czy jestem tutaj daleko. Co powinienem zamiast tego zrobić, obszary, które mógłbym lub powinienem zmienić w celu poprawy itp ...
Jestem chętny do nauki ...