with tutorial modals fetch_assoc espaƱol ejemplo bootstrap and php mysql pdo mysqli

modals - php mysql ajax jquery crud tutorial



PHP PDO y MySQLi (6)

Esta pregunta ya tiene una respuesta aquí:

Acabo de terminar un curso introductorio en PHP, y en todo el foro de stackoverflow la gente me recomendó cambiar a PDO, declaraciones preparadas o MYSQLi, revisé brevemente el manual, pero la mayor parte se me pasó por la cabeza.

He estado usando las funciones mysql_ * hasta ahora, así 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 logran 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, buscaré más tutoriales de PDO.

Como referencia, también encontré las siguientes publicaciones útiles:

Cuál es rápido y ligero - mysqli o PDO

mysqli o PDO: ¿cuáles son los pros y los contras?


Entonces, ¿cuál es la diferencia entre PDO, declaraciones preparadas y MySQLi, son características diferentes que logran la misma tarea?

La diferencia es bastante simple.
PDO se puede usar con declaraciones preparadas y mysqli no .

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


En el nivel básico, las extensiones mysql, mysqli y PDO responden a la pregunta ¿cómo hablo con la base de datos? Todos ellos proporcionan funciones y funcionalidades 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 te permite conectarte a la base de datos, enviar consultas SQL y no mucho más.
mysqli mejora esto (como su nombre lo sugiere) 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 la 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 ahora está en desuso y se eliminará en el futuro . 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.


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

Podría usar PDO en su lugar si lo desea, 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 bastante análogas a las funciones mysql_xx 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 lugar de mysql_xxx`.

Si es posible, recomendaría 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 para usar la biblioteca MySQLi, y se sienta cómodo con los conceptos básicos, estará listo para comenzar a utilizar las funciones más avanzadas, como las declaraciones preparadas. Pero póngase cómodo con lo básico primero.


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 PDO proporciona la facilidad 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 .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 descubrió cómo usar mysqli, usar 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.


Viniendo desde el mismo punto de vista que tú. 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.


PDO es el "Objeto de datos PHP". Uso principalmente PDO, así que solo puedo hablar sobre sus méritos:

  • Funciona para muchas más bases de datos aparte de MySQL (puede que no le importe)
  • Compilado C, entonces es más rápido (supuestamente)
  • Declaraciones preparadas (otros tienen estos, sin embargo)
  • A SO parece gustarle, así que probablemente pueda obtener mucha ayuda aquí al menos
  • Varios modos de manejo de búsqueda / error que puede establecer y cambiar sobre la marcha

Usted pregunta

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

PDO y MySQLi son contenedores 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.

Puedes hacer básicamente lo mismo con MySQLi , pero prefiero la sintaxis de PDO . Puede ser más rápido también, pero podría estar inventando eso. También está la PEAR MDB2 que raramente se habla, y estoy seguro de que muchas más. Dado que PDO está integrado, me gustaría ir con eso.