2012-05-22 43 views
37

Acabo de terminar un curso de introducción en PHP, y en todo el foro de stackoverflow personas me han recomendado cambiar a PDO, declaraciones preparadas o MYSQLi, revisé brevemente el manual, pero la mayoría pasó por mi cabeza.PHP PDO y MySQLi

He estado usando las funciones de mysql_ * hasta ahora, por lo que estos conceptos son nuevos para mí. Creo que se utilizan para acceder y realizar acciones específicas de la base de datos, pero no estoy seguro.

Entonces, ¿cuál es la diferencia entre PDO, declaraciones preparadas y MySQLi, son características diferentes que realizan la misma tarea? ¿Son compatibles en un script o es "elegir uno u otro"? Y, por último, ¿cuál ofrece el mejor rendimiento?

Actualización: Gracias por las respuestas, estaré buscando más tutoriales de PDO.

Como referencia también me encontré con los siguientes mensajes de utilidad:

Which one is fast and light - mysqli or PDO

mysqli or PDO - what are the pros and cons?

+3

Recomiendo comenzar aquí: http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html – Brad

+0

Gracias por todas sus respuestas y dejarlo en claro para mí. – grasshopper

+0

Aquí hay un buen tutorial en pdo http://a2znotes.blogspot.in/2014/09/introduction-to-pdo.html –

Respuesta

38

En el nivel básico, todas las extensiones mysql, mysqli y PDO responden a la pregunta ¿cómo hablo con la base de datos? Todos ellos proporcionan funciones y funcionalidad para conectarse a una base de datos y enviar y recuperar datos desde ella. Puede usarlos todos al mismo tiempo, estableciendo varias conexiones a la base de datos a la vez, pero eso generalmente no tiene sentido.

mysql * es una extensión muy simple que básicamente le permite conectarse a la base de datos, enviar consultas SQL y no mucho más.
mysqli mejora esto (como su nombre indica) al agregar consultas parametrizadas y algunas otras cosas en la mezcla.
PDO es una extensión que abstrae varios controladores de bases de datos en un paquete, es decir, le permite usar el mismo código para conectarse a MySQL, Oracle, MS SQL Server y otras bases de datos sin necesidad de usar extensiones específicas de la base de datos o reescribir su código cuando cambia de base de datos (al menos en teoría). También admite consultas parametrizadas.

Si sabe que va a utilizar MySQL exclusivamente, mysqli es una buena opción. Especialmente dado que puedes usarlo de forma procedimental, a lo que ya estás acostumbrado desde la extensión mysql. Si no está familiarizado con OOP, eso es útil. De lo contrario, PDO es un buen conector de base de datos flexible orientado a objetos.


* Tenga en cuenta que la extensión mysql is now deprecated and will be removed sometime in the future. Eso es porque es antiguo, está lleno de malas prácticas y carece de algunas características modernas. No lo use para escribir un nuevo código.

+1

Finalmente, alguien que podría responder a esto de una manera simple y directa. ¡Gracias! – Kebman

+1

-1 para llamar a mysqli una buena elección. –

+3

@YourCommonSense Creo que has perdido el tuyo. Especialmente dado que estás usando mysqli en tu biblioteca, estás publicitando en todas partes. – deceze

1

viene desde el mismo punto de vista que usted. Desde mi punto de vista, no creo que la diferencia sea realmente notable (dependiendo de para qué la uses). Parece que PDO es simplemente una API que combina TODAS las API de la base de datos en una sola. Por lo tanto, si necesita conectarse a un servidor MS Sql y un servidor MySQL, simplemente puede invocar la API PDO y especificar el controlador para la base de datos específica. También creo que las características y capacidades futuras de MySQL solo estarán disponibles en PDO. Básicamente, solo use PDO para asegurarse de tener acceso a todas las funciones más recientes.

16

PDO es el "Objeto de datos PHP."Yo sobre todo utilizar DOP, por lo que sólo puedo hablar por sus méritos:

  • funciona para muchas más bases de datos que acaba de MySQL (no puede importar a usted)
  • C compilado, por lo que es más rápido (supuestamente)
  • declaraciones preparadas (otros tienen estos, sin embargo)
  • SO parece que le gusta, lo que probablemente puede obtener una gran cantidad de ayuda aquí al menos
  • Varios modos de manejo FETCH/error puede establecer y cambiar sobre la marcha

le preguntas

Entonces, ¿cuál es la diferencia entre DOP, declaraciones preparadas y MySQLi ...

PDO y MySQLi son envoltorios de DB. "Declaraciones preparadas" es un concepto completamente diferente. Puede preparar una consulta que pueda ejecutarse varias veces, y las declaraciones parametrizadas correctamente son seguras para SQL-Injection (aunque quizás no sea una prueba). La última razón es la razón principal por la que debe usar PDO (o MySQLi), pero las declaraciones preparadas también aportan un nivel de claridad a las consultas.

/* mysql_* version */ 
mysql_connect("host"); 
$query = "SELECT column FROM db1.t1 WHERE id = "; 
foreach ($_GET['id'] as $id) { 
    $id = mysql_real_escape_string($id); 
    $result = mysql_query($query . "'$id'"; 
    while ($row = mysql_fetch_assoc($result)) { 
     echo "$row[column]\n"; 
    } 
} 
//NOTE: it would probably be better to store the resource returned by 
//mysql_connect and use that consistently (in query/escape) 

/* PDO version */ 
$pdo = new PDO('mysql:host=HOST', 'user', 'pass'); 
$query = $pdo->prepare("SELECT column FROM db1.t1 WHERE id = ?"; 
foreach ($_GET['id'] as $id) { 
    $query->execute($id); 
    echo $query->fetch(PDO::FETCH_COLUMN); 
} 
//Notice that you skip the escape step. 

Usted puede hacer básicamente lo mismo con MySQLi, pero yo prefiero la sintaxis PDO 's. Puede ser más rápido también, pero podría estar inventando eso. También está el PEAR MDB2 del que rara vez se habla, y estoy seguro de que muchos más. Como está integrado el PDO, me gustaría ir con él.

+2

Esta fuente indica que MySQL y MySQLi son un poco más rápidos: http://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059 – Daan

+0

Se perdió un soporte de cierre Explosión Pillis en su declaración de consulta de preparación de pdo. – mendez7

4

Si está acostumbrado a las funciones mysql_xxx, entonces comenzaría moviéndose a través de la extensión MySQLi en su lugar.

En su lugar, podría usar PDO, pero esto realmente solo valdría la pena en primera instancia si necesita comenzar a admitir múltiples bases de datos. Para su propósito, le sugiero que cambie a MySQLi, ya que será más fácil para usted, y de todos modos no recibirá los beneficios de PDO de inmediato.

Las funciones disponibles con MySQLi son más o menos análogas a las funciones mysql_xx a las que está acostumbrado; en general, es posible tomar el código existente, hacer un intercambio directo entre ellos, y el código debería seguir funcionando bien.

Así que ese es un buen lugar para comenzar: obtenga su código usando mysqli_xxx en lugar de mysql_xxx`.

Si es posible, recomiendo usar la sintaxis orientada a objetos en lugar de la sintaxis de procedimiento. MySQLi admite ambas cosas, y la sintaxis de procedimientos será más parecida a la que está acostumbrado, pero la sintaxis de OO es más flexible a largo plazo, y realmente no es tan diferente una vez que está acostumbrado.

Una vez que haya convertido su código convertido a la biblioteca MySQLi, y se sienta cómodo con lo básico, está listo para comenzar a utilizar las funciones más avanzadas, como las declaraciones preparadas. Pero póngase cómodo con lo básico primero.

1

Una gran ventaja de PDO es la independencia de la plataforma. Esto significa que puede migrar a un DBMS diferente en algún momento sin tener que volver a codificar todas sus llamadas a funciones. Así es como normalmente se hacen las cosas en Java (a través de JDBC), .Net (ADO) y en la mayoría de los demás entornos.La ventaja no es solo que puede cambiar DBMS per se, sino que también tiene solo una API para aprender.

En cuanto a su pregunta, la capa de PDO proporciona la posibilidad de hacer declaraciones preparadas. La idea detrás de las declaraciones preparadas es que cree marcadores de posición para las partes de su declaración SQL que no se conocerán hasta el momento de la ejecución. Muchos alumnos comienzan creando SQL como una cadena que se ejecuta llamando a mysqli :: query ($ someQuery). Esto es problemático por muchas razones, la más destacada es la vulnerabilidad a la inyección de SQL (consulte stackoverflow.com/questions/5315351 para obtener una pregunta y respuesta similar). Con PDO, puede evitar la inyección de SQL y todos los problemas de manejo de caracteres como comillas, barras diagonales inversas, etc. El resultado final es que su código es más seguro, legible y predecible.

Si ya ha descubierto cómo usar mysqli, el uso de PDO no es muy diferente. La pregunta y la respuesta vinculadas que figuran más arriba muestran un ejemplo de una consulta que se envía utilizando declaraciones preparadas con PDO que deberían actuar como una guía útil.

-1

¿Cuál es la diferencia entre PDO, declaraciones preparadas y MySQLi, son las diferentes características que realizan la misma tarea?

La diferencia es bastante simple.
DOP es utilizable condeclaraciones preparadas y mysqli es no.

Simplemente ejecute algunas consultas habituales con ambas API usando declaraciones nativas preparadas, y verá claramente la diferencia.

+0

Esto simplemente no es cierto mysqli tiene declaraciones preparadas, por ejemplo $ stmt = $ db-> prepare ($ query); –

+0

@ThomasWilliams debes prestar más atención a lo que lees. La palabra "utilizable" es la clave. https://phpdelusions.net/pdo/mysqli_comparison –

+0

Después de algunas investigaciones, me gusta mucho la forma en que funciona el pdo, pero las declaraciones preparadas de mysqli son utilizables, y las he estado usando durante algunos años. Sí, es un dolor cuando dejas fuera una coma y pasas un rato rastreando el error, pero sí es muy útil. El único inconveniente para mí con pdo es que es más lento que mysqli en bases de datos mysql. –