¿Cuál es la diferencia entre MySQL, MySQLi y PDO?

Para comprender la diferencia entre MySQL, MySQLi y PDO, debemos conocer cada uno de ellos individualmente.
Estas no son más que las API de PHP que se utilizan para acceder a las bases de datos y tablas de MySQL. Los desarrolladores pueden elegir cualquiera de ellos para su proyecto, sin embargo, se debe saber que MySQLi no se puede usar con PHP 7 y sus versiones más recientes. Sin embargo, los desarrolladores pueden usar MySQLi con PHP 5, que ahora está obsoleto.

Vamos a tener más información sobre cada uno de ellos:

  • MySQL: esta fue la extensión principal que fue diseñada para ayudar a las aplicaciones PHP a enviar y recibir datos de la base de datos MySQL. Sin embargo, el uso de MySQL ha quedado obsoleto y eliminado a partir de PHP 7 y sus versiones más recientes. Es por eso que no se recomienda para nuevos proyectos, y es por eso que las extensiones MySQLi y PDO se usan más hoy en día.
  • MySQLi: La ‘i’ en MySQLi significa Mejorado. Por lo tanto, esta también se conoce como la versión mejorada de MySQL. Tiene muchas características nuevas que se tratarán más adelante en el artículo.
  • PDO: objetos de datos de PHP: la principal ventaja de usar PDO es que admite y proporciona un método uniforme de acceso a 11 bases de datos diferentes.

Las bases de datos compatibles con PDO son:

  • CUBRIDO
  • Servidor MS SQL
  • pájaro de fuego/interbase
  • IBM
  • Informix
  • mysql
  • Oráculo
  • ODBC y DB2
  • postgresql
  • SQLite
  • 4D

   
Sin embargo, PDO no permite el uso de todas las funciones disponibles en la versión actual del servidor MySQL. Por ejemplo, PDO no permite el soporte de declaraciones múltiples de MySQL.

Comparando MySQL, MySQLi y PDO:

  • Conexión a la base de datos
  • Manejo de errores
  • Obtención de datos
  • Soporte de API
  • Seguridad

Conexión a la base de datos:

  • MySQL: El código MySQL para conectarse a la base de datos es:

    <?php
      
    // Add the hostname, username and password of the database
    $connection_link = mysql_connect("host", "username", "password");
      
    // Select query for the database
    mysql_select_db("database_name", $connection_link);
      
    // Set the charset, UTF-8 to be used for projects
    mysql_set_charset('UTF-8', $connection_link);
      
    ?>
  • MySQLi: en el caso de MySQLi, solo hay un código de una línea. El usuario crea una instancia de MySQLi utilizando el nombre de usuario, la contraseña y el nombre de la base de datos.

    <?php
      
    // Database credentials
    $mysqli_db = new mysqli('host', 'username', 'password', 'database_name');
      
    ?>
  • PDO: en el caso de PDO, se debe crear un nuevo objeto PDO.

    <?php
      
    // Credentials required for connection
    $pdo = new PDO('mysql:host=host; dbname=database_name; charset=utf8',
                'username', 'password'); 
      
    ?>

    Una gran ventaja de usar PDO es que hace que cambiar el proyecto a otra base de datos sea más simple. Por lo tanto, lo único que debe hacer es cambiar la string de conexión y aquellas consultas que no serán compatibles con la nueva base de datos.

Manejo de errores: el manejo de errores es la detección y resolución de errores de aplicación, programación o comunicación. El manejo de errores ayuda a mantener el flujo normal de ejecución del programa, ya que los errores en el programa se tratan con gracia, lo que hace que el programa funcione bien.

  • mysql:

    <?php
      
    $my_result = mysql_query("SELECT * FROM table", $connection_link)
            or die(mysql_error($connection_link));
    ?>

    El método ‘die’ se usa para el manejo de errores en MySQL, pero no se considera un buen enfoque para el manejo de errores. Esto se debe a que die finaliza abruptamente el guión y luego muestra el error en la pantalla. Esto puede hacer que la base de datos sea propensa a los piratas informáticos.

  • MySQLi: el manejo de errores en MySQLi es un poco más fácil. mysqli::$error (mysqli_error) devuelve una string de descripción del último error.

    <?php
      
    if (!$mysqli->query("SET a=1")) {
        printf("Errormessage: %s\n", $mysqli->error);
    }
      
    ?>
  • PDO: PDO tiene el mejor método de manejo de errores de estos tres. Esto se debe a la disponibilidad del bloque try-catch. Además, hay algunos modos de error que se pueden usar para el manejo de errores.
    • PDO::ERRMODE_SILENT: se usa para verificar cada resultado y luego verificar $db->errorInfo() para obtener detalles del error.
    • PDO::ERRMODE_WARNING: Advertencia no detiene el script. Esto proporciona advertencias en tiempo de ejecución y no errores fatales.
    • PDO::ERRMODE_EXCEPTION: Lanza excepciones que muestran un error generado por PDO. No debería lanzar una excepción PDOException con su código. Actúa como o muere (mysql_error()) cuando no se detecta. Pero puede atrapar estas PDOException y manejarlas como queramos.

    Podemos configurar estos modos de error de la siguiente manera:

    <?php
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    ?>

    Ahora, el método try/catch se puede agregar de la siguiente manera:

    <?php
      
    try {
          
        // Incorrect query
        $db->query('hello');
    }
      
    catch (PDOException $ex) {
          
        // $ex->getMessage();
          
         // Message to be displayed in
         // case of such an error
        echo "An Error has occurred";
    }
      
    ?>

    Una ventaja de usar el método try/catch es que podemos configurar un mensaje de error normal para que se muestre al usuario, en lugar de un mensaje de excepción, ya que podría ser difícil de comprender para los usuarios generales.

Obtención de datos:

  • MySQL: los bucles de programación general, como for o while, se pueden usar para tal propósito. Supongamos que hay una tabla llamada ‘datos’ en la base de datos y queremos generar el nombre de usuario de cada fila de la tabla. Mientras que el bucle se puede utilizar de la siguiente manera para hacer el trabajo.

    <?php
      
    $my_result = mysql_query('SELECT * from data')
            or die(mysql_error());
      
    $num_rows = mysql_num_rows($my_result);
      
    while($row = mysql_fetch_assoc($my_result)) {
        echo $row['field1'];
    }
      
    ?>
  • MySQLi: MySQLi también usa un bucle para este propósito. El código, sin embargo, será un poco diferente.

    <?php
      
    while($row = $my_result->fetch_assoc()) {
        echo $row['username'] . '\n';
    }
      
    ?>
  • PDO: PDO tiene muchas declaraciones integradas que ayudan en tales casos.
    • PDOStatement::fetchAll(): Devuelve el resultado en forma de array, que contiene todas las filas de resultados.
    • PDOStatement::fetchColumn(): Obtiene una sola columna de la siguiente fila de un conjunto de resultados.
    • PDOStatement::fetchObject(): Primero obtiene las siguientes filas y luego las devuelve como un objeto.
    • PDOStatement::setFetchMode(): Establece el modo de búsqueda predeterminado para la declaración.

    La consulta también se usa para obtener datos, ya que devuelve un objeto PDOStatement que se puede usar para obtener los datos directamente mediante foreach y for loop.

    <?php
      
    // Select query
    $stmt = $db->query('SELECT * FROM `data_table`');
      
    // fetchAll is used
    $my_results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    ?>

Soporte de API: cuando se trata del soporte de API, PDO proporciona un enfoque orientado a objetos. MySQLi proporciona una forma de procedimiento, muy similar a MySQL. Esta es la razón por la que los desarrolladores que provienen de MySQL prefieren usar MySQLi. Sin embargo, los programadores orientados a objetos prefieren PDO debido a su compatibilidad con una gran cantidad de bases de datos.
Por lo tanto, los programadores orientados a objetos prefieren PDO, mientras que los programadores procedimentales prefieren MySQL y MySQLi.

Seguridad: la seguridad de la base de datos se utiliza para proteger las bases de datos y la información que contienen de los piratas informáticos y sus ataques. Los piratas informáticos generalmente usan inyecciones de SQL para interrumpir la base de datos. Por lo tanto, debe garantizarse la seguridad de las inyecciones.

Tanto PDO como MySQLi brindan seguridad de inyección SQL.

Supongamos que un pirata informático está tratando de inyectar una inyección SQL a través del parámetro de consulta HTTP ‘firstname’ usando el método POST:

$_POST['firstname'] = "'; DELETE FROM users; /*"

Si se escapa la inyección, se añadirá en la consulta “tal cual”. Por lo tanto, eliminará todas las filas de la tabla de usuarios.

En PDO, el escape manual está ahí para agregar seguridad.

$name = PDO::quote($_POST['name']);
$pdo->query("SELECT * FROM users WHERE name = $name");

La diferencia entre PDO::quote() y mysqli_real_escape_string() es que el primero escapa de la string y la comilla, mientras que el segundo solo escapará de la string y las comillas deberán agregarse manualmente.

Publicación traducida automáticamente

Artículo escrito por sanchit496 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *