2012-06-06 9 views
16

Todavía estoy aprendiendo principalmente de los libros que compro, pero hoy me doy cuenta de que mi libro es antiguo, aunque lo compré este año con respecto a la programación en PHP. Ahora sé que los comandos mysql_ * en PHP están en desuso y deberían ser reemplazados por declaraciones preparadas más seguras y estables y PDO. Así que me puse a reescribir toda mi web de acuerdo con ella y tal vez necesitaré algunos consejos de ustedes sobre cómo hacerlo correctamente y trabajando para ustedes todos los muchachos más experimentados :)¿Cómo reescribir con éxito el código mysql-php antiguo con las funciones mysql_ * obsoletas?

Entonces comenzaré mi reescritura solo con la parte principal (conectarse a DB y elegir DB) aquí (el resto lo puedo hacer solo con google y manuales). Escribiré aquí mi viejo guión y le preguntaré si estoy haciendo las cosas bien y sin perderme nada, y espero que este sea también un buen manual/respuesta para otras personas. Entonces comencemos.

Así que en la configuración que tienen algo como esto:

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

Cuáles deberían ser así:

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

derecho? Pero cuando tengo que elegir la base de datos más tarde, ¿debo hacerlo sin dbname=people;? ¿Pero cómo elegir la base de datos más tarde?

Aquí es mi primera y única secuencia de comandos para volver a escribir que es básico en la mayoría de los proyectos web y espero que traerá no sólo a mí de alguna manera nuevo sistema DOP comprender realmente funciona:

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); 
    } 
    } 
} 

Así que por lo que sé de Google y Wiki - funciones como public function __construct y public function __destruct() ya no deberían ser necesarias, ¿verdad? Lo mismo con funciones como public function connect() SO lo único que queda es public function selectDb($database), pero no tengo idea de cómo hacerlo correctamente sin dañar toda la conexión a la base de datos. Porque en el resto de mi código (no mencionado aquí) puedo elegir fácilmente la base de datos con este código: $this->db->selectDb("people"); Pero con las declaraciones preparadas, no sé si esto es incluso posible de una manera fácil. Espero que algunos consejos acerca de esto nos ayuden a mí y a otros usuarios a entender mejor este nuevo código. Se explican otras partes en el código que puede tener en este PDO Tutorial for MySQL Developers. Gracias.

+8

** ¡Woah! ** Voto especial super-dupero-extra-especial por tener la temeridad de mejorarte del viejo y cansado dinosaurio 'mysql_ *'! – rdlowrey

Respuesta

5

En realidad, un simple, dulce y corto: Sí, ya no es necesario.

Repasemos el código no es que nos hemos perdido algo:

  • __construct - El constructor más que contenían toda la configuración. DOP tiene un concepto mucho más fácil aquí, una cadena de conexión que contiene la mayoría de la información:

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

    también DOP proporciona al constructor para su uso ya hecho, por lo que no es necesario duplicar.

  • connect - La función de conexión ya no es necesaria. Esto se hace instanciando PDO ya. Puede buscar excepciones, el manual de PHP tiene un ejemplo on it's constructor page.

  • selectDb - Esta función complicada ya no es necesaria. Guau, la tercera función que podemos simplemente dejar caer debido a la cadena de conexión PDO. Mucho poder con menos personajes. ¡Aclamaciones!

  • __destruct - El destructor. Seamos justos: MySQL no necesitaba esto también. Sin embargo, con PDO lo obtenemos de forma gratuita, sin escribir una sola línea de código.

Se ve bien! ¡Usted logró migrar de esa clase oscura de la base de datos a PDO eliminando el código obsoleto! Felicidades:

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

Si ahora piensa, ¿qué pasa si yo quiero tener la clase de base de datos por mi cuenta? Bien se puede hacer eso, porque se puede extender desde DOP (sí que funciona!):

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

¿Por qué es posible que desee hacer eso? No tengo idea, pero tal vez sea más fluido para tu código. Si está buscando un mejor ejemplo de código, tengo uno al PHP/MySQL Table with Hyperlinks.

+0

Entonces, ¿puedo hacer algo como esto? http://paste2.org/p/2047291 – Byakugan

+0

No, es solo un código PHP no válido. Pero tal vez quieras describir lo que quieres * y puedo darte una u otra sugerencia. – hakre

+0

A veces cambio el pase en la base de datos por razones de seguridad, por lo que este código debería verificar si la conexión es válida y en caso de falsa devolución del mensaje :) o ¿es realmente todo eso el código PDO? – Byakugan

1

Creo que la forma más fácil de cambiar la base de datos dentro de su aplicación será:

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

y

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

o (y limpia) forma quizás mejor podría ser

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

y

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

Si marca una base de datos en su clase activa, puede acceder a los datos con $db_people->query() o $db_animals->query().

Cuestiones relacionadas