Di tanto in tanto vedo domande riguardanti la connessione al database.
La maggior parte delle risposte non è il modo in cui lo faccio, o potrei semplicemente non ottenere le risposte correttamente. Comunque; Non ci ho mai pensato perché il modo in cui lo faccio funziona per me.
Ma ecco un pensiero folle; Forse sto sbagliando tutto, e se è così; Mi piacerebbe davvero sapere come connettermi correttamente a un database MySQL utilizzando PHP e PDO e renderlo facilmente accessibile.
Ecco come lo sto facendo:
Prima di tutto, ecco la struttura del mio file (ridotta) :
public_html/
* index.php
* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php
index.php
In cima, ho 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');
So che esiste un modo migliore, o più corretto, per includere le lezioni, ma non ricordo cosa fosse. Non ho ancora avuto il tempo di esaminarlo, ma penso che fosse qualcosa con autoload. qualcosa del genere...
configure.php
Qui fondamentalmente sovrascrivo solo alcune proprietà php.ini e faccio qualche altra configurazione globale per il sito
connect.php
Ho messo la connessione su una classe in modo che altre classi possano estendere questa ...
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();
//
Qui credo che ci sia spazio per enormi miglioramenti da quando ho iniziato di recente a imparare OOP e utilizzare PDO invece di mysql.
Quindi ho appena seguito un paio di tutorial per principianti e ho provato cose diverse ...
sessioni.php
Oltre a gestire sessioni regolari, inizializzo anche alcune classi in una sessione come questa:
if (!isset($_SESSION['sqlQuery'])){
session_start();
$_SESSION['sqlQuery'] = new sqlQuery();
}
In questo modo questa classe è disponibile ovunque. Questa potrebbe non essere una buona pratica (?) ...
Comunque, questo è ciò che questo approccio mi permette di fare ovunque:
echo $_SESSION['sqlQuery']->getAreaName('county',9); // outputs: Aust-Agder (the county name with that id in the database)
All'interno della mia sqlQuery- classe , che della extendsmia connect_pdo- classe , ho una funzione pubblica chiamata getAreaNameche gestisce la richiesta al mio database.
Abbastanza pulito penso.
Funziona come un fascino
Quindi è fondamentalmente come lo sto facendo.
Inoltre, ogni volta che ho bisogno di recuperare qualcosa dal mio DB da non all'interno di una classe, faccio qualcosa di simile a questo:
$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);
Dal momento che ho inserito la connessione in una variabile all'interno di connect_pdo.php , mi sto solo riferendo ad essa e sono a posto. Funziona. Ottengo i risultati attesi ...
Ma indipendentemente da quello; Apprezzerei davvero se voi ragazzi poteste dirmi se sono lontano da qui. Cosa dovrei fare invece, aree che potrei o dovrei cambiare per migliorare ecc ...
Sono ansioso di imparare ...