2012-03-15 13 views
7

Sono abbastanza nuovo di PDO e anche OOP con PHP in generale quindi per favore sii gentile :) Fondamentalmente sto cercando di creare un oggetto di connessione basato su PDO in modo che possa avere una connessione che chiamo attraverso il mio sito.Il modo migliore per creare una classe di connessione statica mysql PDO?

Ho bisogno di alcune istruzioni preparate che si limitino a cercare risultati diversi in base a un ID che passo usando lo stesso oggetto db che sto cercando di creare sotto.

Come faccio a impostare e accedere alla classe db I impostata di seguito e quindi utilizzare le funzioni al suo interno per estrarre le informazioni rilevanti di cui ho bisogno? Qualsiasi esempio sarebbe bello per farmi un'idea delle migliori pratiche, ecc.

Molte grazie in anticipo.

class db { 

    private static $connection; 

    private function __construct(){} 
    private function __clone(){} 

    private static function connect($db_server="localhost", $db_user="user", $db_pass="password") { 
     if(!$this->connection){ 
      try{ 
       $this->connection = new PDO($db_server, $db_user, $db_pass); 
      } catch (PDOException $e) { 
       $this->connection = null; 
       die($e->getMessage()); 
      } 
     } 
     return $this->connection; 
    } 

} 

$dbh = new db::connect(); 

$stmt = $dbh->prepare("SELECT * FROM questions where id = ?"); 
if($stmt->execute(array($_REQUEST['testid']))) { 
    while ($row = $stmt->fetch()) { 
    print_r($row); 
    } 
} 
+0

la pseudo-variabile $ questo non è disponibile all'interno di metodi statici e per proprietà statiche. Dovresti usare self :: $ property. Altrimenti dirà la proprietà db :: proprietà non definita – jscripter

+0

@BubuDaba non modificherà il codice improprio nella domanda in quanto può rendere irrilevanti altre asnwers. Se hai un suggerimento per l'OP, scrivi una risposta o un commento –

risposta

5

Si potrebbe iniziare non mai utilizzare nuovamente Singleton modello. Questo (e le classi statiche in generale) è negativo per tutti gli stessi motivi per cui le variabili globali nella programmazione procedurale sono cattive.

Detto questo ... Invece di cercare di rafforzare l'unicità dell'oggetto di connessione, dovresti semplicemente assicurarti di utilizzare la stessa connessione dappertutto.

Ecco un esempio di ciò che intendo:

class Foo 
{ 
    protected $connection = null; 
    public function __construct(PDO $connection) 
    { 
     $this->connection = $connection; 
    } 
} 

class Bar 
{ 
    // all the same as in Foo 
} 

$connection = new PDO('sqlite::memory'); 

$foo = new Foo($connection); 
$bar = new Bar($connection); 

A questo punto entrambi $foo e $bar oggetti avranno accesso allo stesso esempio DOP. Se si dispone di un oggetto che deve accedere al database, basta fornire una connessione nel costruttore.

Ci sono due video si potrebbe desiderare di guardare (slides conterranno il codice Java, ma si dovrebbe avere alcuna comprensione troble esso):

+0

Perché dici che le classi statiche sono in generale cattive? Io uso una classe statica per il mio wrapper PDO ... Sembra che funzioni bene per me. C'è una ragione particolare per cui dovremmo evitarli? – BenOfTheNorth

+0

@BenGriffiths, diversi motivi. Il problema principale è che con * classi statiche * non è possibile utilizzare il polimorfismo. L'esecuzione dei metodi è legata al ** nome ** della classe. Anche questo non è veramente OOP. La classe statica è effettivamente lì solo per uno spettacolo. Quello che hai sono una lista di funzioni, legate in una struttura di namespace.Ad ogni modo, dovresti solo cercare l'argomento. Ci sono molti materiali [Puoi iniziare da qui] (http://kore-nordmann.de/blog/0103_static_considered_harmful.html) se sei disposto ad apprendere alcune migliori pratiche. –

+0

grazie, ci penserò. La mia ragione personale per usare l'static è perché non devo dichiarare la classe ovunque, o continuare a doverla passare ad altri oggetti - È utile come una sorta di oggetto costante. Non ho bisogno di una classe enorme nel mio caso, ma averlo racchiuso in una piccola classe statica lo rende più ordinato e facile da gestire. – BenOfTheNorth

0

Le connessioni persistenti sono costruiti in:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true 
)); 

Vedi Example #4 Persistent connections

+0

Questo è utile anche se non fornisce risposta alla domanda originale, forse dovrebbe essere pubblicato come commento ... '/ * O forse perché il tuo */la risposta di classe estende LogicException {}; prova {$ to = include ('some/more.php'); '' e $ re = new Answer(); if ('vuoi' == $ a);} catch (Points $ for) {new Answer () o die ($ for.'this ');} ' –

+2

Hai un comico qui. –

Problemi correlati