2012-06-06 3 views
16

Sto ancora imparando principalmente dai libri che compro, ma oggi mi sembra che il mio libro sia vecchio anche se l'ho comprato quest'anno riguardo alla programmazione in PHP. Ora so che i comandi mysql_ * in PHP sono deprecati e dovrebbero essere sostituiti con istruzioni preparate e DOP più sicure e stabili. Così mi sono messo a riscrivere tutto il mio web in base ad esso e forse avrò bisogno di alcuni consigli da voi su come farlo correttamente e lavorando da voi tutti i ragazzi più esperti :)Come riscrivere correttamente il vecchio codice mysql-php con le funzioni mysql_ * deprecate?

Così inizierò la mia riscrittura solo con la parte principale (collegarsi a db e scegliere DB) qui (il resto posso fare da solo con google e manuali). Scriverò qui la mia vecchia sceneggiatura e ti chiederò se sto facendo tutto bene e non mi manca niente e spero che questo possa essere un buon manuale/risposta per le altre persone. Quindi iniziamo.

Così in config ho qualcosa di simile:

$db = new dbConn('127.0.0.1', 'root', 'pass', 'people', 'animals'); 

che dovrebbe essere simile a questo:

$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass'); 

Destra? Ma quando ho bisogno di scegliere il database più tardi dovrei farlo senza dbname=people;? Ma come scegliere il database più tardi?

Ecco il mio unico e solo script per riscrivere, che è fondamentale nella maggior parte dei progetti web e spero che porterà non solo mi ha in qualche modo nuovo sistema DOP comprensione funziona davvero:

class dbConn 
{ 
    public function __construct($server, $user, $pass, $db_people, $db_animals) 
    {  
    if (!empty($server) && !empty($user) && !empty($pass) && !empty($db_people) && !empty($db_animals)) 
    { 
     $this->server = $server; 
     $this->user = $user; 
     $this->pass = $pass; 
     $this->db_people = $db_people; 
     $this->db_animals = $db_animals; 
     $this->connect(); 
    } 
    else 
    { 
     die("Set up connection to db"); 
    } 
    } 

    public function connect() 
    { 
    $this->conn = mysql_connect($this->server, $this->user, $this->pass) or die ('cannot connect to MySQL'); 
    } 

    public function selectDb($database) 
    { 
    switch($database) 
    { 
     case 'people': 
     mysql_select_db($this->db_people, $this->conn) or die ('cannot connect to database '.$this->db_people.'.'); 
     mysql_query("SET NAMES 'utf8'"); 
     break; 

     case 'animals': 
     mysql_select_db($this->db_animals, $this->conn) or die ('cannot connect to database '.$this->db_animals.'.'); 
     mysql_query("SET NAMES 'utf8'"); 
    } 
    } 

    public function __destruct() 
    { 
    if (!empty($this->conn)) 
    { 
     mysql_close($this->conn); 
    } 
    } 
} 

Quindi, da quello che so da Google e Wiki - funzioni come public function __construct e public function __destruct() non dovrebbero essere più necessarie, giusto? Lo stesso con funzioni come public function connect() COSÌ, solo che cosa è rimasto è public function selectDb($database) ma non ho idea di come farlo correttamente senza danneggiare ogni connessione al database. Perché nel resto del mio codice (non menzionato qui) posso facilmente scegliere il database con questo codice: $this->db->selectDb("people"); Ma con le dichiarazioni preparate non so se questo sia possibile anche in modo semplice. Spero che alcuni consigli su questo argomento aiuteranno me e gli altri utenti a capire meglio questo nuovo codice. Altre parti del codice che potresti avere sono coniate in questo PDO Tutorial for MySQL Developers. Grazie.

+8

** Woah! ** Super-duper-extra-speciale upvote per avere la temerarietà di aggiornare te stesso dal vecchio dinosauro * mysql_ * 'stanco! – rdlowrey

risposta

5

In realtà, un semplice, dolce e breve: Sì, non è più necessario.

Rivediamo il codice non che abbiamo perso qualcosa:

  • __construct - Il costruttore si limita conteneva tutta la configurazione. DOP ha un concetto molto più facile qui, una stringa di connessione che contiene la maggior parte delle informazioni:

    mysql:host=127.0.0.1;dbname=people;charset=UTF-8 
    

    anche DOP prevede il costruttore per l'uso ready-made, in modo da raddoppiare non è necessario.

  • connect - La funzione di connessione non è più necessaria. Questo viene fatto istanziando PDO già. Puoi cercare eccezioni, il manuale PHP ha un esempio on it's constructor page.

  • selectDb - Questa funzione complicata non è più necessaria. Wow, la terza funzione che possiamo semplicemente eliminare a causa della stringa di connessione PDO. Molta potenza con così tanti personaggi. Saluti!

  • __destruct - Il distruttore. Diciamo la verità: anche MySQL non ha avuto bisogno di questo. Tuttavia con PDO lo otteniamo gratuitamente, senza scrivere una sola riga di codice.

Sembra buono! Sei riuscito a migrare da quella oscura classe di database a PDO rimuovendo il codice obsoleto! Congratulazioni:

$db = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass'); 

Se ora pensi, che dire se voglio avere una classe di database per conto mio? Ebbene si può farlo, perché è possibile estendere da PDO (sì che funziona!):

class DB extends PDO 
{ 
    ... my super-new-shiny-code 
} 

Perché si potrebbe desiderare di farlo? Non ne ho idea, ma forse è più fluente per il tuo codice. Se stai cercando un esempio di codice migliore, ne ho uno a PHP/MySQL Table with Hyperlinks.

+0

Quindi posso fare qualcosa di simile? http://paste2.org/p/2047291 – Byakugan

+0

No, questo è solo codice PHP non valido. Ma forse vuoi descrivere cosa vuoi * fare e posso darti l'uno o l'altro suggerimento. – hakre

+0

A volte cambio il pass nel database per motivi di sicurezza, quindi questo codice dovrebbe verificare se la connessione è valida e in caso di errore restituire il messaggio :) oppure è che tutto fa veramente il codice PDO stesso? – Byakugan

1

Penso che il modo più semplice per cambiare la banca dati all'interno della vostra applicazione sarà:

$pdo_instance->query("USE people"); 

e

$pdo_instance->query("USE animals"); 

o (e più pulita) modo forse migliore potrebbe essere

$db_people = new PDO('mysql:host=127.0.0.1;dbname=people;charset=UTF-8', 'root', 'pass'); 

e

$db_animals = new PDO('mysql:host=127.0.0.1;dbname=animals;charset=UTF-8', 'root', 'pass'); 

Se si contrassegna un database nella classe attiva, è possibile accedere ai dati con $db_people->query() o $db_animals->query().