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 extends
mia connect_pdo
- classe , ho una funzione pubblica chiamata getAreaName
che 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 ...