{"id":10643,"date":"2025-05-20T11:35:13","date_gmt":"2025-05-20T09:35:13","guid":{"rendered":"https:\/\/www.loading.es\/blog\/?p=10643"},"modified":"2025-05-20T11:35:13","modified_gmt":"2025-05-20T09:35:13","slug":"conectar-base-datos-mysql-php","status":"publish","type":"post","link":"https:\/\/www.loading.es\/blog\/conectar-base-datos-mysql-php\/","title":{"rendered":"C\u00f3mo conectar tu p\u00e1gina web con una base de datos MySQL usando PHP"},"content":{"rendered":"\n<p>Si est\u00e1s aprendiendo a crear p\u00e1ginas din\u00e1micas con <strong>PHP<\/strong>, seguramente has o\u00eddo hablar de <strong>MySQL<\/strong>. Pero \u00bfsabes c\u00f3mo conectar ambos? En este post vamos a ver, paso a paso, c\u00f3mo hacer que <strong>tu web hecha en PHP<\/strong> pueda comunicarse con una <strong>base de datos MySQL<\/strong>. Es decir, c\u00f3mo hacer que tu sitio no solo muestre cosas, sino que tambi\u00e9n pueda <strong>guardar, buscar o modificar datos<\/strong> reales.<\/p>\n\n\n\n<p>Vamos a explicarlo de forma clara, sin complicaciones, y con ejemplos pr\u00e1cticos para que puedas probarlo t\u00fa mismo.<\/p>\n\n\n\n<p><strong><em>Tabla de Contenidos<\/em><\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a href=\"#aioseo-por-que-usar-php-y-mysql-juntos\">Por qu\u00e9 usar PHP y MySQL juntos<\/a><\/li><li><a href=\"#aioseo-que-necesitas-antes-de-empezar\">Qu\u00e9 necesitas antes de empezar<\/a><\/li><li><a href=\"#aioseo-datos-necesarios-para-conectarte\">Datos necesarios para conectarte<\/a><\/li><li><a href=\"#aioseo-que-metodos-existen-para-conectar-php-con-mysql\">Qu\u00e9 m\u00e9todos existen para conectar PHP con MySQL<\/a><ul><li><a href=\"#aioseo-1-mysqli\">1. MySQLi<\/a><\/li><li><a href=\"#aioseo-2-pdo\">2. PDO<\/a><\/li><li><a href=\"#aioseo-entonces-cual-elijo\">Entonces\u2026 \u00bfcu\u00e1l elijo?<\/a><\/li><\/ul><\/li><li><a href=\"#aioseo-ejemplo-de-conexion-con-mysqli-estilo-orientado-a-objetos\">\u200bEjemplo de conexi\u00f3n con MySQLi (estilo orientado a objetos)<\/a><\/li><li><a href=\"#aioseo-ejemplo-de-conexion-con-pdo\">Ejemplo de conexi\u00f3n con PDO<\/a><\/li><li><a href=\"#aioseo-conclusion\">Conclusi\u00f3n<\/a><\/li><\/ul><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.loading.es\/hosting\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"1000\" height=\"100\" src=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png\" alt=\"oferta para contratar hosting web\" class=\"wp-image-8039\" srcset=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png 1000w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-300x30.png 300w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-768x77.png 768w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-850x85.png 850w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-por-que-usar-php-y-mysql-juntos\">Por qu\u00e9 usar PHP y MySQL juntos<\/h2>\n\n\n\n<p>PHP y MySQL son como una pareja bien avenida. Se entienden a la perfecci\u00f3n y por eso se usan tanto en proyectos web. Muchas webs famosas, como <strong><a href=\"https:\/\/www.loading.es\/blog\/que-es-wordpress\/\" target=\"_blank\" rel=\"noopener\" title=\"qu\u00e9 es WordPress\">WordPress<\/a><\/strong> o <strong><a href=\"https:\/\/es.wikipedia.org\/wiki\/Wikipedia:Portada\" target=\"_blank\" rel=\"noopener\" title=\"Wikipedia\">Wikipedia<\/a><\/strong>, usan esta combinaci\u00f3n porque es <strong>r\u00e1pida, gratuita y confiable<\/strong>.<\/p>\n\n\n\n<ul>\n<li><strong>Compatibilidad total<\/strong>: PHP incluye funciones espec\u00edficas para trabajar con MySQL.<\/li>\n\n\n\n<li><strong>Curva de aprendizaje suave<\/strong>: no necesitas ser un experto para empezar.<\/li>\n\n\n\n<li><strong>Buen rendimiento<\/strong>: soporta muchos usuarios y grandes vol\u00famenes de datos.<\/li>\n\n\n\n<li><strong>Comunidad activa<\/strong>: encontrar\u00e1s foros, tutoriales y ayuda f\u00e1cilmente si te atascas.<\/li>\n<\/ul>\n\n\n\n<p>Si est\u00e1s empezando en desarrollo web, esta combinaci\u00f3n es <strong>una de las mejores opciones<\/strong> para aprender y construir proyectos reales, que puedas subir a tu <strong><a href=\"https:\/\/www.loading.es\/hosting\/index.html\" target=\"_blank\" rel=\"noopener\" title=\"Hosting web en Loading\">hosting web<\/a><\/strong> y usarlos en la vida real.<\/p>\n\n\n\n<p><strong>Importante<\/strong>: si al trabajar en tu servidor ves que aparece \u201c<strong>MariaDB<\/strong>\u201d en lugar de \u201cMySQL\u201d, no te preocupes. <strong>MariaDB es una versi\u00f3n compatible<\/strong> con MySQL, creada por los propios desarrolladores originales y funciona igual en casi todos los casos. Puedes usar PHP con MariaDB de la misma forma que lo har\u00edas con MySQL, sin cambiar nada en tu c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-que-necesitas-antes-de-empezar\">Qu\u00e9 necesitas antes de empezar<\/h2>\n\n\n\n<p>Antes de escribir tu primer archivo <code>.php<\/code> con conexi\u00f3n a MySQL, necesitas <strong>preparar tu entorno de trabajo<\/strong>. Esto significa tener en tu ordenador todo lo necesario para crear y probar tu web.<\/p>\n\n\n\n<ol>\n<li><strong>Un entorno local de servidor web<\/strong>, como <strong><a href=\"https:\/\/www.loading.es\/blog\/servidor-web-local-xampp\/\" target=\"_blank\" rel=\"noopener\" title=\"C\u00f3mo usar XAMPP\">XAMPP<\/a><\/strong> o <strong>WAMP<\/strong>, que incluyen Apache (servidor web) y MySQL (base de datos).<\/li>\n\n\n\n<li><strong>phpMyAdmin<\/strong>, una herramienta para crear y gestionar tus bases de datos desde el navegador. Suele venir incluido en XAMPP o WAMP.<\/li>\n\n\n\n<li><strong>Un editor de c\u00f3digo<\/strong> como Visual Studio Code, Sublime Text o incluso Notepad++.<\/li>\n\n\n\n<li><strong>Una base de datos creada<\/strong> para hacer las pruebas. Puedes crearla en phpMyAdmin en pocos clics.<\/li>\n<\/ol>\n\n\n\n<p>Con esto, ya estar\u00e1s listo para empezar a programar la conexi\u00f3n en PHP.<\/p>\n\n\n\n<p>Tambi\u00e9n puedes contratar un <strong><a href=\"https:\/\/www.loading.es\/hosting\/index.html\" target=\"_blank\" rel=\"noopener\" title=\"Hosting barato en Loading\">hosting barato<\/a><\/strong> y empezar a hacer tus pruebas en un entorno real. En <strong>Loading<\/strong> tenemos ofertas muy econ\u00f3micas de alojamiento web que puedes utilizar en tus proyectos <strong>PHP\/MySQL<\/strong> son problemas y sin tener que realizar una gran inversi\u00f3n.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"600\" height=\"846\" src=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/pasos-conectar-php-mysql.jpg\" alt=\"pasos conectar php mysql\" class=\"wp-image-10645\" srcset=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/pasos-conectar-php-mysql.jpg 600w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/pasos-conectar-php-mysql-213x300.jpg 213w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/pasos-conectar-php-mysql-300x423.jpg 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-datos-necesarios-para-conectarte\">Datos necesarios para conectarte<\/h2>\n\n\n\n<p>Para que <strong>PHP pueda conectarse a tu base de datos<\/strong>, necesita unos <strong>datos b\u00e1sicos<\/strong>, como si le dieras una direcci\u00f3n, un usuario y una contrase\u00f1a para acceder al \u201calmac\u00e9n\u201d de informaci\u00f3n.<\/p>\n\n\n\n<ul>\n<li><strong>Servidor<\/strong>: normalmente es <code>localhost<\/code> si est\u00e1s trabajando en tu propio ordenador.<\/li>\n\n\n\n<li><strong>Usuario<\/strong>: el nombre del usuario con permisos para acceder a MySQL. En XAMPP suele ser <code>root<\/code>.<\/li>\n\n\n\n<li><strong>Contrase\u00f1a<\/strong>: puede estar vac\u00eda por defecto, pero <strong>en producci\u00f3n siempre debe ser segura<\/strong>.<\/li>\n\n\n\n<li><strong>Nombre de la base de datos<\/strong>: debe coincidir exactamente con el que pusiste al crearla.<\/li>\n<\/ul>\n\n\n\n<p>Lo m\u00e1s recomendable es <strong>guardar estos datos en variables al principio del script<\/strong>, as\u00ed podr\u00e1s modificarlos f\u00e1cilmente si cambian.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-que-metodos-existen-para-conectar-php-con-mysql\">Qu\u00e9 m\u00e9todos existen para conectar PHP con MySQL<\/h2>\n\n\n\n<p>En PHP existen <strong>dos formas principales<\/strong> de conectar con bases de datos. Ambas funcionan bien, pero tienen <strong>diferencias importantes<\/strong> que conviene entender desde el principio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-1-mysqli\">1. MySQLi<\/h3>\n\n\n\n<p>La palabra <strong>MySQLi<\/strong> viene de \u201cMySQL Improved\u201d, que significa <strong>\u201cMySQL mejorado\u201d<\/strong>. Es una herramienta que ofrece PHP para conectar con bases de datos <strong>MySQL (y solo MySQL)<\/strong>.<\/p>\n\n\n\n<p>Tiene dos formas de escribir el c\u00f3digo:<\/p>\n\n\n\n<ul>\n<li><strong>Procedimental<\/strong>: es una forma m\u00e1s directa, muy parecida a la de los primeros tiempos de PHP.<\/li>\n\n\n\n<li><strong>Orientado a objetos<\/strong>: es m\u00e1s moderna y organizada, y la que se recomienda usar hoy en d\u00eda.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Si solo vas a trabajar con bases de datos MySQL y est\u00e1s empezando, <strong>MySQLi es una buena opci\u00f3n para aprender<\/strong>. Adem\u00e1s, muchos proyectos reales lo usan, como por ejemplo <strong>phpMyAdmin<\/strong>, la herramienta para gestionar bases de datos que suele venir con XAMPP o WAMP.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-2-pdo\">2. PDO<\/h3>\n\n\n\n<p><strong>PDO<\/strong> significa <em>PHP Data Objects<\/em>. Es otra forma de conectar con bases de datos, pero <strong>m\u00e1s flexible y profesional<\/strong>. \u00bfPor qu\u00e9? Porque <strong>no solo sirve para MySQL<\/strong>, sino tambi\u00e9n para otros sistemas como <strong>PostgreSQL, SQLite, SQL Server<\/strong>, entre otros.<\/p>\n\n\n\n<p>PDO <strong>siempre se usa con estilo orientado a objetos<\/strong>, y ofrece ventajas como:<\/p>\n\n\n\n<ul>\n<li>La posibilidad de <strong>preparar consultas<\/strong> para evitar errores o ataques (como las inyecciones SQL).<\/li>\n\n\n\n<li>Poder <strong>cambiar de base de datos<\/strong> en el futuro sin tener que reescribir todo el c\u00f3digo.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Muchos frameworks y CMS modernos, como <strong>Laravel<\/strong> o <strong>Drupal<\/strong>, usan PDO porque permite desarrollar proyectos m\u00e1s complejos con mejor seguridad y escalabilidad.<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<style>\n    .php-mysql-comparison {\n      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n      max-width: 800px;\n      margin: 0 auto;\n      padding: 20px;\n      box-sizing: border-box;\n    }\n    \n    .title {\n      text-align: center;\n      color: #0E76BE;\n      margin-bottom: 30px;\n      font-size: 24px;\n      font-weight: bold;\n    }\n    \n    .comparison-container {\n      display: flex;\n      flex-wrap: wrap;\n      justify-content: space-between;\n      gap: 20px;\n    }\n    \n    .comparison-card {\n      flex: 1;\n      min-width: 280px;\n      border-radius: 10px;\n      overflow: hidden;\n      box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);\n      transition: all 0.3s ease;\n      position: relative;\n    }\n    \n    .comparison-card:hover {\n      transform: translateY(-10px);\n      box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);\n    }\n    \n    .card-header {\n      padding: 15px;\n      color: white;\n      font-weight: bold;\n      font-size: 20px;\n      text-align: center;\n    }\n    \n    .mysqli-header {\n      background-color: #0E76BE;\n    }\n    \n    .pdo-header {\n      background-color: #19A15F;\n    }\n    \n    .card-content {\n      padding: 20px;\n      background-color: white;\n    }\n    \n    .feature-list {\n      padding: 0;\n      margin: 0;\n      list-style-type: none;\n    }\n    \n    .feature-item {\n      padding: 12px 5px;\n      border-bottom: 1px solid #f0f0f0;\n      display: flex;\n      align-items: center;\n      position: relative;\n      transition: background-color 0.2s ease;\n    }\n    \n    .feature-item:last-child {\n      border-bottom: none;\n    }\n    \n    .feature-item:hover {\n      background-color: #f9f9f9;\n    }\n    \n    .feature-icon {\n      margin-right: 10px;\n      flex-shrink: 0;\n      width: 24px;\n      text-align: center;\n    }\n    \n    .feature-text {\n      font-size: 15px;\n      color: #333;\n    }\n    \n    .mysqli-advantage {\n      color: #0E76BE;\n    }\n    \n    .pdo-advantage {\n      color: #19A15F;\n    }\n    \n    .code-example {\n      margin-top: 15px;\n      background-color: #f5f5f5;\n      border-radius: 5px;\n      padding: 15px;\n      font-family: 'Courier New', Courier, monospace;\n      font-size: 14px;\n      overflow-x: auto;\n      position: relative;\n      color: #333;\n      border-left: 4px solid;\n    }\n    \n    .mysqli-code {\n      border-left-color: #0E76BE;\n    }\n    \n    .pdo-code {\n      border-left-color: #19A15F;\n    }\n    \n    .code-title {\n      position: absolute;\n      top: -10px;\n      right: 10px;\n      background-color: #333;\n      color: white;\n      border-radius: 3px;\n      padding: 3px 8px;\n      font-size: 12px;\n      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n    }\n    \n    .tooltip {\n      position: absolute;\n      left: 0;\n      top: 0;\n      background-color: rgba(0, 0, 0, 0.8);\n      color: white;\n      padding: 8px 12px;\n      border-radius: 4px;\n      font-size: 14px;\n      z-index: 100;\n      opacity: 0;\n      transition: opacity 0.3s ease;\n      pointer-events: none;\n      max-width: 250px;\n    }\n\n    .bar-chart-container {\n      margin-top: 30px;\n      height: 300px;\n      position: relative;\n    }\n\n    .interactive-legend {\n      display: flex;\n      justify-content: center;\n      margin-top: 20px;\n      gap: 20px;\n    }\n\n    .legend-item {\n      display: flex;\n      align-items: center;\n      cursor: pointer;\n      padding: 5px 10px;\n      border-radius: 5px;\n      transition: background-color 0.2s ease;\n    }\n\n    .legend-item:hover {\n      background-color: #f0f0f0;\n    }\n\n    .legend-color {\n      width: 15px;\n      height: 15px;\n      border-radius: 50%;\n      margin-right: 5px;\n      display: inline-block;\n    }\n\n    .mysqli-color {\n      background-color: #0E76BE;\n    }\n\n    .pdo-color {\n      background-color: #19A15F;\n    }\n\n    .btn-toggle-code {\n      display: inline-block;\n      margin-top: 10px;\n      padding: 5px 10px;\n      background-color: #f0f0f0;\n      border: none;\n      border-radius: 4px;\n      cursor: pointer;\n      font-size: 14px;\n      color: #333;\n      transition: background-color 0.2s ease;\n    }\n\n    .btn-toggle-code:hover {\n      background-color: #e0e0e0;\n    }\n\n    \/* Responsive adjustments *\/\n    @media (max-width: 768px) {\n      .comparison-container {\n        flex-direction: column;\n      }\n      \n      .comparison-card {\n        width: 100%;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"php-mysql-comparison\">\n    <div class=\"title\">MySQLi vs PDO: Comparativa Visual<\/div>\n    \n    <div class=\"comparison-container\">\n      <!-- MySQLi Card -->\n      <div class=\"comparison-card\">\n        <div class=\"card-header mysqli-header\">MySQLi<\/div>\n        <div class=\"card-content\">\n          <ul class=\"feature-list\">\n            <li class=\"feature-item\" data-tooltip=\"Solo funciona con bases de datos MySQL o MariaDB.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text\">Compatible con MySQL y MariaDB<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Permite usar un estilo de programaci\u00f3n m\u00e1s tradicional.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text\">Estilo procedimental y OOP<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Buena elecci\u00f3n para proyectos peque\u00f1os con MySQL.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text mysqli-advantage\">Ideal para proyectos sencillos<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Si quieres cambiar de MySQL a otro sistema, tendr\u00e1s que reescribir el c\u00f3digo.\">\n              <div class=\"feature-icon\">\u2717<\/div>\n              <div class=\"feature-text\">Portabilidad limitada<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Es lo que usa WordPress por defecto.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text mysqli-advantage\">Utilizado en WordPress<\/div>\n            <\/li>\n          <\/ul>\n          \n          <div class=\"code-example mysqli-code\">\n            <div class=\"code-title\">PHP<\/div>\n            $conexion = new mysqli($servidor, $usuario, $contrase\u00f1a, $db);\n            <br>\n            if ($conexion->connect_error) {\n            <br>\n            &nbsp;&nbsp;die(\u00abError: \u00bb . $conexion->connect_error);\n            <br>\n            }\n          <\/div>\n          \n          <button class=\"btn-toggle-code\" data-target=\"mysqli-detail\">Ver\/Ocultar c\u00f3digo completo<\/button>\n          \n          <div id=\"mysqli-detail\" style=\"display: none; margin-top: 10px;\">\n            <div class=\"code-example mysqli-code\">\n              &lt;?php\n              <br>\n              $servidor = \u00ablocalhost\u00bb;\n              <br>\n              $usuario = \u00abroot\u00bb;\n              <br>\n              $contrase\u00f1a = \u00ab\u00bb;\n              <br>\n              $base_de_datos = \u00abmi_db\u00bb;\n              <br><br>\n              $conexion = new mysqli($servidor, $usuario, $contrase\u00f1a, $base_de_datos);\n              <br><br>\n              if ($conexion->connect_error) {\n              <br>\n              &nbsp;&nbsp;die(\u00abError: \u00bb . $conexion->connect_error);\n              <br>\n              }\n              <br><br>\n              echo \u00ab\u00a1Conexi\u00f3n exitosa!\u00bb;\n              <br>\n              $conexion->close();\n              <br>\n              ?&gt;\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n      \n      <!-- PDO Card -->\n      <div class=\"comparison-card\">\n        <div class=\"card-header pdo-header\">PDO<\/div>\n        <div class=\"card-content\">\n          <ul class=\"feature-list\">\n            <li class=\"feature-item\" data-tooltip=\"Funciona con MySQL, PostgreSQL, SQLite, SQL Server y m\u00e1s.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text pdo-advantage\">M\u00faltiples tipos de bases de datos<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Solo admite programaci\u00f3n orientada a objetos.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text\">Solo estilo OOP<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Mejor para proyectos que podr\u00edan crecer o cambiar con el tiempo.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text pdo-advantage\">Ideal para proyectos escalables<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Cambiar de una base de datos a otra es sencillo.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text pdo-advantage\">F\u00e1cil portabilidad<\/div>\n            <\/li>\n            <li class=\"feature-item\" data-tooltip=\"Utilizado en frameworks modernos como Laravel o Symfony.\">\n              <div class=\"feature-icon\">\u2713<\/div>\n              <div class=\"feature-text pdo-advantage\">Presente en frameworks modernos<\/div>\n            <\/li>\n          <\/ul>\n          \n          <div class=\"code-example pdo-code\">\n            <div class=\"code-title\">PHP<\/div>\n            try {\n            <br>\n            &nbsp;&nbsp;$conexion = new PDO(\u00abmysql:host=$servidor;dbname=$db\u00bb, $usuario, $pass);\n            <br>\n            } catch (PDOException $e) {\n            <br>\n            &nbsp;&nbsp;echo \u00abError: \u00bb . $e->getMessage();\n            <br>\n            }\n          <\/div>\n          \n          <button class=\"btn-toggle-code\" data-target=\"pdo-detail\">Ver\/Ocultar c\u00f3digo completo<\/button>\n          \n          <div id=\"pdo-detail\" style=\"display: none; margin-top: 10px;\">\n            <div class=\"code-example pdo-code\">\n              &lt;?php\n              <br>\n              $servidor = \u00ablocalhost\u00bb;\n              <br>\n              $usuario = \u00abroot\u00bb;\n              <br>\n              $contrase\u00f1a = \u00ab\u00bb;\n              <br>\n              $base_de_datos = \u00abmi_db\u00bb;\n              <br><br>\n              try {\n              <br>\n              &nbsp;&nbsp;$conexion = new PDO(\u00abmysql:host=$servidor;dbname=$base_de_datos;charset=utf8\u00bb, $usuario, $contrase\u00f1a);\n              <br>\n              &nbsp;&nbsp;$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n              <br>\n              &nbsp;&nbsp;echo \u00ab\u00a1Conexi\u00f3n exitosa con PDO!\u00bb;\n              <br>\n              } catch (PDOException $e) {\n              <br>\n              &nbsp;&nbsp;echo \u00abError de conexi\u00f3n: \u00bb . $e->getMessage();\n              <br>\n              }\n              <br>\n              ?&gt;\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n    \n    <!-- Gr\u00e1fica comparativa con Chart.js -->\n    <div class=\"bar-chart-container\">\n      <canvas id=\"comparisonChart\"><\/canvas>\n    <\/div>\n    \n    <div class=\"interactive-legend\">\n      <div class=\"legend-item\" data-dataset=\"0\">\n        <span class=\"legend-color mysqli-color\"><\/span>\n        <span>MySQLi<\/span>\n      <\/div>\n      <div class=\"legend-item\" data-dataset=\"1\">\n        <span class=\"legend-color pdo-color\"><\/span>\n        <span>PDO<\/span>\n      <\/div>\n    <\/div>\n    \n    <!-- Tooltip element -->\n    <div class=\"tooltip\" id=\"tooltip\"><\/div>\n  <\/div>\n\n  <!-- Script para Chart.js desde CDN -->\n  <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/3.9.1\/chart.min.js\"><\/script>\n  \n  <script>\n    document.addEventListener('DOMContentLoaded', function() {\n      \/\/ Funcionalidad de tooltip\n      const tooltip = document.getElementById('tooltip');\n      const featureItems = document.querySelectorAll('.feature-item');\n      \n      featureItems.forEach(item => {\n        item.addEventListener('mouseenter', function(e) {\n          const tooltipText = this.getAttribute('data-tooltip');\n          tooltip.textContent = tooltipText;\n          \n          \/\/ Calcular posici\u00f3n\n          const rect = this.getBoundingClientRect();\n          const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n          \n          tooltip.style.left = (rect.right + 10) + 'px';\n          tooltip.style.top = (rect.top + scrollTop - 5) + 'px';\n          tooltip.style.opacity = '1';\n        });\n        \n        item.addEventListener('mouseleave', function() {\n          tooltip.style.opacity = '0';\n        });\n      });\n      \n      \/\/ Botones toggle para c\u00f3digo\n      const toggleButtons = document.querySelectorAll('.btn-toggle-code');\n      toggleButtons.forEach(button => {\n        button.addEventListener('click', function() {\n          const target = this.getAttribute('data-target');\n          const element = document.getElementById(target);\n          \n          if (element.style.display === 'none') {\n            element.style.display = 'block';\n            this.textContent = 'Ocultar c\u00f3digo completo';\n          } else {\n            element.style.display = 'none';\n            this.textContent = 'Ver c\u00f3digo completo';\n          }\n        });\n      });\n      \n      \/\/ Configuraci\u00f3n de Chart.js\n      const ctx = document.getElementById('comparisonChart').getContext('2d');\n      \n      const comparisonData = {\n        labels: ['Facilidad de uso', 'Rendimiento', 'Flexibilidad', 'Portabilidad', 'Seguridad'],\n        datasets: [\n          {\n            label: 'MySQLi',\n            data: [8, 7, 6, 4, 7],\n            backgroundColor: 'rgba(14, 118, 190, 0.7)',\n            borderColor: 'rgba(14, 118, 190, 1)',\n            borderWidth: 1\n          },\n          {\n            label: 'PDO',\n            data: [7, 7, 9, 9, 9],\n            backgroundColor: 'rgba(25, 161, 95, 0.7)',\n            borderColor: 'rgba(25, 161, 95, 1)',\n            borderWidth: 1\n          }\n        ]\n      };\n      \n      const myChart = new Chart(ctx, {\n        type: 'radar',\n        data: comparisonData,\n        options: {\n          responsive: true,\n          maintainAspectRatio: false,\n          scales: {\n            r: {\n              angleLines: {\n                display: true\n              },\n              suggestedMin: 0,\n              suggestedMax: 10\n            }\n          },\n          plugins: {\n            legend: {\n              display: false\n            },\n            tooltip: {\n              callbacks: {\n                title: function(context) {\n                  return context[0].label;\n                },\n                label: function(context) {\n                  return context.dataset.label + ': ' + context.formattedValue + '\/10';\n                }\n              }\n            }\n          },\n          elements: {\n            line: {\n              tension: 0.2\n            }\n          }\n        }\n      });\n      \n      \/\/ Interactividad con la leyenda\n      const legendItems = document.querySelectorAll('.legend-item');\n      legendItems.forEach(item => {\n        item.addEventListener('click', function() {\n          const datasetIndex = parseInt(this.getAttribute('data-dataset'));\n          const isDatasetVisible = myChart.isDatasetVisible(datasetIndex);\n          \n          if (isDatasetVisible) {\n            myChart.hide(datasetIndex);\n            this.style.opacity = 0.5;\n          } else {\n            myChart.show(datasetIndex);\n            this.style.opacity = 1;\n          }\n        });\n      });\n    });\n  <\/script>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-entonces-cual-elijo\">Entonces\u2026 \u00bfcu\u00e1l elijo?<\/h3>\n\n\n\n<ul>\n<li>Usa <strong>MySQLi<\/strong> si est\u00e1s empezando desde cero, si tu proyecto es peque\u00f1o o si vas a trabajar solo con MySQL. Por ejemplo, si est\u00e1s creando tu primer sitio web desde local con XAMPP.<\/li>\n\n\n\n<li>Usa PDO si quieres que tu c\u00f3digo sea m\u00e1s seguro y flexible, o si est\u00e1s pensando en un proyecto grande que pueda crecer con el tiempo.<\/li>\n<\/ul>\n\n\n\n<p>Por ejemplo, <strong>WordPress usa MySQLi por defecto<\/strong> para conectar con la base de datos, pero PDO es una buena opci\u00f3n si desarrollas proyectos personalizados que necesiten soportar otras bases de datos o mayor seguridad.<\/p>\n\n\n\n<p>Ambas formas te permiten guardar, leer y modificar datos. <strong>La elecci\u00f3n depende del tipo de proyecto<\/strong> y de lo que quieras aprender o hacer en el futuro.<\/p>\n\n\n\n<p>\u200b<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Caracter\u00edstica<\/th><th>MySQLi<\/th><th>PDO<\/th><\/tr><\/thead><tbody><tr><td>Compatibilidad<\/td><td>Solo funciona con bases de datos MySQL<\/td><td>Funciona con m\u00faltiples tipos de bases de datos<\/td><\/tr><tr><td>Estilos disponibles<\/td><td>Procedimental y orientado a objetos<\/td><td>Solo orientado a objetos<\/td><\/tr><tr><td>Preparaci\u00f3n de consultas<\/td><td>Disponible<\/td><td>Disponible y m\u00e1s flexible<\/td><\/tr><tr><td>Facilidad para cambiar de motor de base de datos<\/td><td>Dif\u00edcil, hay que reescribir el c\u00f3digo<\/td><td>F\u00e1cil, solo hay que cambiar el DSN<\/td><\/tr><tr><td>Ideal para<\/td><td>Proyectos peque\u00f1os y espec\u00edficos de MySQL<\/td><td>Proyectos grandes o con posibilidad de crecer<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-ejemplo-de-conexion-con-mysqli-estilo-orientado-a-objetos\">\u200bEjemplo de conexi\u00f3n con MySQLi (estilo orientado a objetos)<\/h2>\n\n\n\n<p>Aqu\u00ed tienes un ejemplo de c\u00f3mo ser\u00eda el c\u00f3digo para conectar usando MySQLi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$servidor = \"localhost\";\n$usuario = \"root\";\n$contrase\u00f1a = \"\";\n$base_de_datos = \"nombre_de_tu_base_de_datos\";\n\u200b\n$conexion = new mysqli($servidor, $usuario, $contrase\u00f1a, $base_de_datos);\n\u200b\nif ($conexion->connect_error) {\n\u00a0 \u00a0die(\"Error al conectar con la base de datos: \" . $conexion->connect_error);\n}\n\u200b\necho \"\u00a1Conexi\u00f3n exitosa!\";\n$conexion->close();\n?><\/code><\/pre>\n\n\n\n<p><strong>\u00bfQu\u00e9 hace este c\u00f3digo?<\/strong><\/p>\n\n\n\n<ul>\n<li>Declara las variables con los datos necesarios.<\/li>\n\n\n\n<li>Usa <code>new mysqli(...)<\/code> para intentar conectar.<\/li>\n\n\n\n<li>Comprueba si hay errores con <code>connect_error<\/code>.<\/li>\n\n\n\n<li>Muestra un mensaje si todo fue bien.<\/li>\n\n\n\n<li>Cierra la conexi\u00f3n con <code>$conexion-&gt;close()<\/code>.<\/li>\n<\/ul>\n\n\n\n<p>Es simple, pero muy \u00fatil para empezar a hacer tus primeras pruebas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-ejemplo-de-conexion-con-pdo\">Ejemplo de conexi\u00f3n con PDO<\/h2>\n\n\n\n<p>Ahora veamos c\u00f3mo hacerlo usando <strong>PDO<\/strong>, que es m\u00e1s vers\u00e1til y seguro en entornos reales.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$servidor = \"localhost\";\n$usuario = \"root\";\n$contrase\u00f1a = \"\";\n$base_de_datos = \"nombre_de_tu_base_de_datos\";\n\u200b\ntry {\n\u00a0 \u00a0$conexion = new PDO(\"mysql:host=$servidor;dbname=$base_de_datos;charset=utf8\", $usuario, $contrase\u00f1a);\n\u00a0 \u00a0$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n\u00a0 \u00a0echo \"\u00a1Conexi\u00f3n exitosa con PDO!\";\n} catch (PDOException $e) {\n\u00a0 \u00a0echo \"Error de conexi\u00f3n: \" . $e->getMessage();\n}\n?><\/code><\/pre>\n\n\n\n<p><strong>Ventajas del uso de PDO:<\/strong><\/p>\n\n\n\n<ul>\n<li>Puedes manejar los errores con <code>try\/catch<\/code>.<\/li>\n\n\n\n<li>Es m\u00e1s f\u00e1cil de proteger contra ataques como <strong>inyecciones SQL<\/strong>.<\/li>\n\n\n\n<li>Puedes usar <strong>preparaci\u00f3n de consultas<\/strong>, lo que hace tu c\u00f3digo m\u00e1s seguro y organizado.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion\">Conclusi\u00f3n<\/h2>\n\n\n\n<p><strong>Conectar PHP<\/strong> con una base de datos MySQL (o MariaDB) es un paso fundamental para crear p\u00e1ginas web din\u00e1micas y \u00fatiles. Ya sea que elijas usar <strong>MySQLi<\/strong> o <strong>PDO<\/strong>, lo importante es entender c\u00f3mo funciona la conexi\u00f3n y aprender a manejar los datos de forma segura.<\/p>\n\n\n\n<p>Si est\u00e1s empezando, prueba los ejemplos, experimenta con tu base de datos local y ver\u00e1s que no es tan complicado como parece. <strong>Con pr\u00e1ctica y una buena base<\/strong>, pronto podr\u00e1s crear proyectos web profesionales que realmente interact\u00faen con los usuarios.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.loading.es\/hosting\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"1000\" height=\"100\" src=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png\" alt=\"oferta para contratar hosting web\" class=\"wp-image-8039\" srcset=\"https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb.png 1000w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-300x30.png 300w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-768x77.png 768w, https:\/\/www.loading.es\/blog\/wp-content\/uploads\/oferta_hostingweb-850x85.png 850w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-4 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-el-blog-de-loading wp-block-embed-el-blog-de-loading\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"AYaEwblUJf\"><a href=\"https:\/\/www.loading.es\/blog\/frameworks-php-2025\/\">Lista de los Frameworks PHP m\u00e1s Utilizados en 2025<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abLista de los Frameworks PHP m\u00e1s Utilizados en 2025\u00bb \u2014 El blog de Loading\" src=\"https:\/\/www.loading.es\/blog\/frameworks-php-2025\/embed\/#?secret=pFP6f5iqia#?secret=AYaEwblUJf\" data-secret=\"AYaEwblUJf\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-el-blog-de-loading wp-block-embed-el-blog-de-loading\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"jDP7M0uXs9\"><a href=\"https:\/\/www.loading.es\/blog\/que-es-mysql\/\">Qu\u00e9 es MySQL: Para qu\u00e9 se usa en mi sitio web<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abQu\u00e9 es MySQL: Para qu\u00e9 se usa en mi sitio web\u00bb \u2014 El blog de Loading\" src=\"https:\/\/www.loading.es\/blog\/que-es-mysql\/embed\/#?secret=RwWctjpGaS#?secret=jDP7M0uXs9\" data-secret=\"jDP7M0uXs9\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-el-blog-de-loading wp-block-embed-el-blog-de-loading\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"sOCpj9E3G1\"><a href=\"https:\/\/www.loading.es\/blog\/servidor-web-local-xampp\/\">C\u00f3mo crear un servidor web local con XAMPP<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abC\u00f3mo crear un servidor web local con XAMPP\u00bb \u2014 El blog de Loading\" src=\"https:\/\/www.loading.es\/blog\/servidor-web-local-xampp\/embed\/#?secret=J2msmDnz18#?secret=sOCpj9E3G1\" data-secret=\"sOCpj9E3G1\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Si est\u00e1s aprendiendo a crear p\u00e1ginas din\u00e1micas con PHP, seguramente has o\u00eddo hablar de MySQL. Pero \u00bfsabes c\u00f3mo conectar ambos? En este post vamos a ver, paso a paso, c\u00f3mo hacer que tu web hecha en PHP pueda comunicarse con una base de datos MySQL. Es decir, c\u00f3mo hacer que tu sitio no solo muestre cosas, sino que tambi\u00e9n pueda guardar, buscar o modificar datos reales.<\/p>\n<p>Vamos a explicarlo de forma clara, sin complicaciones, y con ejemplos pr\u00e1cticos para que puedas probarlo t\u00fa mismo.<\/p>\n","protected":false},"author":2,"featured_media":10647,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[67],"tags":[229,64,83],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts\/10643"}],"collection":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/comments?post=10643"}],"version-history":[{"count":6,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts\/10643\/revisions"}],"predecessor-version":[{"id":10651,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/posts\/10643\/revisions\/10651"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/media\/10647"}],"wp:attachment":[{"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/media?parent=10643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/categories?post=10643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loading.es\/blog\/wp-json\/wp\/v2\/tags?post=10643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}