{"id":28600,"date":"2021-05-29T13:33:00","date_gmt":"2021-05-29T10:33:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28600"},"modified":"2021-10-17T16:37:55","modified_gmt":"2021-10-17T13:37:55","slug":"como-crear-un-sistema-de-inicio-de-sesion-php-para-su-sitio-web","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/es\/como-crear-un-sistema-de-inicio-de-sesion-php-para-su-sitio-web\/","title":{"rendered":"C\u00f3mo crear un sistema de inicio de sesi\u00f3n PHP para su sitio web"},"content":{"rendered":"<p>\u00bfEst\u00e1 buscando integrar un sistema de inicio de sesi\u00f3n en PHP? En este art\u00edculo, le muestro c\u00f3mo hacer un flujo de inicio de sesi\u00f3n b\u00e1sico en PHP. Crearemos un formulario de inicio de sesi\u00f3n, validaremos las credenciales y redirigiremos al usuario en la p\u00e1gina de la cuenta. Tambi\u00e9n agregar\u00eda un c\u00f3digo para cerrar la sesi\u00f3n del usuario. Adem\u00e1s, mostraremos los mensajes de error si se ingresan las credenciales incorrectas.<\/p>\n<p>Por el bien del tutorial, supongo que est\u00e1 utilizando el hash &#8216;md5&#8217; para almacenar la contrase\u00f1a. Escribir\u00eda el c\u00f3digo considerando el hash md5 de una cadena. Puede que est\u00e9 utilizando otro algoritmo. En ese caso, debe cambiar la consulta seg\u00fan su algoritmo.<\/p>\n<p>Para integrar el flujo de inicio de sesi\u00f3n, necesitamos una tabla de base de datos que almacene los detalles del usuario. Contra esta tabla, validamos si el usuario ingres\u00f3 las credenciales correctas o no. Si las credenciales de usuario son correctas, solo ellos deber\u00edan tener acceso a las p\u00e1ginas seguras.<\/p>\n<p>En mi caso, cre\u00e9 una tabla de &#8216;usuarios&#8217; y agregu\u00e9 algunas entradas ficticias. Tambi\u00e9n agregu\u00e9 una columna de &#8216;estado&#8217; que se utilizar\u00e1 para averiguar si una cuenta est\u00e1 activa o no. Esta columna tiene el tipo de datos ENUM con valores 0 y 1.<\/p>\n<ul>\n<li>1: la cuenta est\u00e1 activa<\/li>\n<li>0: la cuenta no est\u00e1 activa<\/li>\n<\/ul>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20431-6081f068055fd.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20431-6081f068055fd.png\" alt=\"C\u00f3mo crear un sistema de inicio de sesi\u00f3n PHP para su sitio web\" ><\/a><\/p>\n<h3>Crear un formulario de inicio de sesi\u00f3n<\/h3>\n<p>Para comenzar, creemos un formulario de inicio de sesi\u00f3n donde los usuarios pueden ingresar sus credenciales. Estoy usando un marco Bootstrap para crear un formulario de inicio de sesi\u00f3n. Mi <code>index.php<\/code>archivo contiene el siguiente c\u00f3digo.<\/p>\n<pre><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;head&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;title&gt;Login Form&lt;\/title&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;link rel=\"stylesheet\" href=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.3.1\/css\/bootstrap.min.css\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/head&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;body&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"container\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"row\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"col-md-6\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h3&gt;Login Form&lt;\/h3&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;?php if(!empty($error_message)) { ?&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"alert alert-danger\"&gt;&lt;?php echo $error_message; ?&gt;&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;?php } ?&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;form method=\"post\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-group\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label for=\"exampleInputEmail1\"&gt;Email address&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"email\" class=\"form-control\" id=\"exampleInputEmail1\" name=\"email\" placeholder=\"Email\" required \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-group\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label for=\"exampleInputPassword1\"&gt;Password&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"password\" class=\"form-control\" id=\"exampleInputPassword1\" name=\"password\" placeholder=\"Password\" required \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;button type=\"submit\" name=\"submit\" class=\"btn btn-primary\"&gt;Submit&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/form&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>El c\u00f3digo anterior mostrar\u00e1 el formulario de inicio de sesi\u00f3n como se muestra en la siguiente captura de pantalla.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20431-6081f06877449.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20431-6081f06877449.png\" alt=\"C\u00f3mo crear un sistema de inicio de sesi\u00f3n PHP para su sitio web\" ><\/a><\/p>\n<p>He agregado la variable <code>$error_message<\/code>en el c\u00f3digo que imprimir\u00e1 los errores de inicio de sesi\u00f3n.<\/p>\n<h3>C\u00f3digo PHP para validar las credenciales de los usuarios<\/h3>\n<p>Ya est\u00e1 listo con el formulario de inicio de sesi\u00f3n y la tabla de la base de datos. Luego, al enviar un formulario, tenemos que escribir c\u00f3digo PHP que verifica las credenciales del usuario con los registros de la base de datos. Si los detalles son correctos, registre al usuario en el sistema y lo redireccione a la <code>myaccount.php<\/code>p\u00e1gina.<\/p>\n<p>Cree un <code>config.php<\/code>archivo y agregue un c\u00f3digo para la conexi\u00f3n a la base de datos.<\/p>\n<pre><code>&lt;?php\n$conn = new mysqli('DB_HOST', 'DB_USER', 'DB_PASSWORD', 'DB_NAME');\n\u00a0\nif ($conn-&gt;connect_errno) {\n\u00a0\u00a0\u00a0\u00a0echo \"Error: \". $conn-&gt;connect_error;\n}\n?&gt;<\/code><\/pre>\n<p>Reemplace los marcadores de posici\u00f3n con los valores reales.<\/p>\n<p>Ahora, en el <code>index.php<\/code>archivo antes del inicio de la etiqueta html, agregue el siguiente c\u00f3digo.<\/p>\n<pre><code>&lt;?php\nsession_start();\n\u00a0\u00a0\nrequire_once('config.php');\n\u00a0\u00a0\n\/\/if user is logged in redirect to myaccount page\nif (isset($_SESSION['id'])) {\n\u00a0\u00a0\u00a0\u00a0header('Location: myaccount.php');\n}\n\u00a0\u00a0\n$error_message = '';\nif (isset($_POST['submit'])) {\n\u00a0\n\u00a0\u00a0\u00a0\u00a0extract($_POST);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0if (!empty($email) &amp;&amp; !empty($password)) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$sql = \"SELECT id, status FROM users WHERE email = '\".$conn-&gt;real_escape_string($email).\"' AND password = '\".md5($conn-&gt;real_escape_string($password)).\"'\";\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$result = $conn-&gt;query($sql);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if ($result-&gt;num_rows &gt; 0) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$row = $result-&gt;fetch_assoc();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if($row['status']) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$_SESSION['id'] = $row['id'];\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0header('Location: myaccount.php');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$error_message = 'Your account is not active yet.';\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$error_message = 'Incorrect email or password.';\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$error_message = 'Please enter email and password.';\n\u00a0\u00a0\u00a0\u00a0}\n}\n?&gt;<\/code><\/pre>\n<p>Aqu\u00ed en el c\u00f3digo, mientras verificaba la contrase\u00f1a, us\u00e9 el m\u00e9todo PHP md5 asumiendo que almacen\u00f3 la contrase\u00f1a usando este algoritmo.<\/p>\n<h3>C\u00f3digo de cierre de sesi\u00f3n<\/h3>\n<p>La siguiente parte es agregar c\u00f3digo para cerrar la sesi\u00f3n del usuario. Para ello, cree un <code>myaccount.php<\/code>archivo. Una cosa m\u00e1s que se necesita para manejar que solo los usuarios registrados deben acceder a esta p\u00e1gina.<\/p>\n<p><strong>myaccount.php<\/strong><\/p>\n<pre><code>&lt;?php\nsession_start();\n\u00a0\nif (isset($_GET['action']) &amp;&amp; ('logout' == $_GET['action'])) {\n\u00a0\u00a0\u00a0\u00a0unset($_SESSION['id']);\n}\n\u00a0\nif (isset($_SESSION['id'])) {\n\u00a0\u00a0\u00a0\u00a0?&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;h3&gt;Welcome User! &lt;a href=\"?action=logout\"&gt;Logout&lt;\/a&gt;&lt;\/h3&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;?php\n} else { \/\/redirect to login page\n\u00a0\u00a0\u00a0\u00a0header('Location: index.php');\n}\n?&gt;<\/code><\/pre>\n<p>Usando la sesi\u00f3n de PHP estamos averiguando si damos acceso a esta p\u00e1gina o no. Si la sesi\u00f3n no est\u00e1 configurada, redirija al usuario a la p\u00e1gina de inicio de sesi\u00f3n.<\/p>\n<p>Espero que comprenda los conceptos b\u00e1sicos de la creaci\u00f3n de un sistema de inicio de sesi\u00f3n en PHP. Comparta sus pensamientos y sugerencias en la secci\u00f3n de comentarios a continuaci\u00f3n.<\/p>\n<h4>Art\u00edculos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/sistema-de-registro-e-inicio-de-sesion-de-usuario-en-laravel\/\" title=\"Sistema de registro e inicio de sesi\u00f3n de usuario en Laravel\" >Sistema de registro e inicio de sesi\u00f3n de usuario en Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/inicio-de-sesion-de-google-en-laravel-usando-laravel-socialite\/\" title=\"Inicio de sesi\u00f3n de Google en Laravel usando Laravel Socialite\" >Inicio de sesi\u00f3n de Google en Laravel usando Laravel Socialite<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/como-crear-un-sistema-de-registro-php-para-su-sitio-web\/\" title=\"C\u00f3mo crear un sistema de registro PHP\" >C\u00f3mo crear un sistema de registro PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo, creo un sistema de inicio de sesi\u00f3n PHP que es \u00fatil para principiantes. Aqu\u00ed escribimos un c\u00f3digo para HTML, PHP y manejamos todo lo posible<\/p>\n","protected":false},"author":1,"featured_media":21659,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[271],"tags":[849],"class_list":["post-28600","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/comments?post=28600"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/28600\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media\/21659"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media?parent=28600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/categories?post=28600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/tags?post=28600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}