studio programacion para móviles los libro lectura jovenes fomentar edición desarrollo curso como aplicaciones php login

php - para - manual de programacion android pdf



¿El inicio de sesión funciona en el escritorio pero no en el móvil? (2)

Así que estoy usando php-login-minimal para manejar los inicios de sesión en mi sitio web casi completo.

El sistema de inicio de sesión funciona perfectamente en el escritorio, pero en la tableta o en el móvil actúa como si funcionara y me registraba, pero finalmente termino en la misma página y me piden que inicie sesión.

No entiendo por qué funcionaría en computadoras de escritorio pero no en dispositivos móviles. La página web es la misma página que se carga para ambos, ya que estoy usando un diseño receptivo para escalar el contenido y adaptarme a la pantalla que se esté usando, pero el sistema de inicio de sesión no me devuelve ningún error ni nada que me ayude.

He notado en el script Login.php que hay una línea de código elseif (isset($_POST["login"])) { pero ninguno de los elementos del formulario tiene el nombre "login" que no sea el botón de enviar, do ustedes creen que eso podría ser un problema?

También estaba pensando en adaptar el código un poco para especificar el inicio de sesión en la URL (www.example.com/index?login) y ver si eso funciona, pero no quiero cambiar el código ya que no lo hago del todo. Comprende todo aún.

Gracias por cualquier ayuda, muchachos!

Mi formulario de acceso

<form method="post" action="index.php" name="loginForm" id="loginForm"> <label for="login_input_username">Username</label> <input id="login_input_username" class="login_input" type="text" name="user_name" required /><span class="linebreak"></span> <label for="login_input_password">Password</label> <input id="login_input_password" class="login_input" type="password" name="user_password" autocomplete="off" required /><span class="linebreak"></span> <span class="loginregister"><input type="submit" name="login" value="Log in" /></span></form>

El código de inicio de sesión
index.php

<?php if (version_compare(PHP_VERSION, ''5.3.7'', ''<'')) { exit("Sorry, Simple PHP Login does not run on a PHP version smaller than 5.3.7 !"); } else if (version_compare(PHP_VERSION, ''5.5.0'', ''<'')) { // if you are using PHP 5.3 or PHP 5.4 you have to include the password_api_compatibility_library.php // (this library adds the PHP 5.5 password hashing functions to older versions of PHP) require_once("libraries/password_compatibility_library.php"); } // include the configs / constants for the database connection require_once("config/db.php"); // load the login class require_once("classes/Login.php"); // create a login object. when this object is created, it will do all login/logout stuff automatically // so this single line handles the entire login process. in consequence, you can simply ... $login = new Login(); // ... ask if we are logged in here: if ($login->isUserLoggedIn() == true) { // the user is logged in. you can do whatever you want here. // for demonstration purposes, we simply show the "you are logged in" view. include("views/logged_in.php"); } else { // the user is not logged in. you can do whatever you want here. // for demonstration purposes, we simply show the "you are not logged in" view. include("views/not_logged_in.php"); }

clases / Login.php

<?php /** * Class login * handles the user''s login and logout process */ class Login { /** * @var object The database connection */ private $db_connection = null; /** * @var array Collection of error messages */ public $errors = array(); /** * @var array Collection of success / neutral messages */ public $messages = array(); /** * the function "__construct()" automatically starts whenever an object of this class is created, * you know, when you do "$login = new Login();" */ public function __construct() { // create/read session, absolutely necessary session_start(); // check the possible login actions: // if user tried to log out (happen when user clicks logout button) if (isset($_GET["logout"])) { $this->doLogout(); } // login via post data (if user just submitted a login form) elseif (isset($_POST["login"])) { $this->dologinWithPostData(); } } /** * log in with post data */ private function dologinWithPostData() { // check login form contents if (empty($_POST[''user_name''])) { $this->errors[] = "Username field was empty."; } elseif (empty($_POST[''user_password''])) { $this->errors[] = "Password field was empty."; } elseif (!empty($_POST[''user_name'']) && !empty($_POST[''user_password''])) { // create a database connection, using the constants from config/db.php (which we loaded in index.php) $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); // change character set to utf8 and check it if (!$this->db_connection->set_charset("utf8")) { $this->errors[] = $this->db_connection->error; } // if no connection errors (= working database connection) if (!$this->db_connection->connect_errno) { // escape the POST stuff $user_name = $this->db_connection->real_escape_string($_POST[''user_name'']); // database query, getting all the info of the selected user (allows login via email address in the // username field) $sql = "SELECT user_name, user_email, user_password_hash FROM users WHERE user_name = ''" . $user_name . "'' OR user_email = ''" . $user_name . "'';"; $result_of_login_check = $this->db_connection->query($sql); // if this user exists if ($result_of_login_check->num_rows == 1) { // get result row (as an object) $result_row = $result_of_login_check->fetch_object(); // using PHP 5.5''s password_verify() function to check if the provided password fits // the hash of that user''s password if (password_verify($_POST[''user_password''], $result_row->user_password_hash)) { // write user data into PHP SESSION (a file on your server) $_SESSION[''user_name''] = $result_row->user_name; $_SESSION[''user_email''] = $result_row->user_email; $_SESSION[''user_login_status''] = 1; print "<script type=/"text/javascript/">"; print "window.top.location.href=''index.php''"; print "</script>"; exit; } else { $this->errors[] = "Wrong password. Try again."; } } else { $this->errors[] = "This user does not exist."; } } else { $this->errors[] = "Database connection problem."; } } } /** * perform the logout */ public function doLogout() { // delete the session of the user $_SESSION = array(); session_destroy(); // return a little feeedback message $this->messages[] = "You have been logged out."; } /** * simply return the current state of the user''s login * @return boolean user''s login status */ public function isUserLoggedIn() { if (isset($_SESSION[''user_login_status'']) AND $_SESSION[''user_login_status''] == 1) { return true; } // default return return false; } }

El archivo not_logged_in.php (logged_in.php) es similar, solo el formulario no se puede cambiar desde la display:none como el enlace utilizado para hacer eso cambia a un enlace de cierre de sesión:

<?php // show potential errors / feedback (from login object) if (isset($login)) { if ($login->errors) { foreach ($login->errors as $error) { echo $error; } } if ($login->messages) { foreach ($login->messages as $message) { echo $message; } } } ?> <html> <head> <meta charset="utf-8"> <title>Untitled Document</title> <link href="styles/main.css" rel="stylesheet" type="text/css"> <meta name="viewport" content="device-width, initial-scale=1, maximum-scale=1"> <script type="text/javascript"> function showForm(){ document.getElementById(''login'').style.display = "block"; } function hideForm(){ document.getElementById(''login'').style.display = "none"; } </script> </head> <body> <header> <div class="logo" id="logo"> <a href="#">Website Title</a> </div> <?php include("navigation.php"); ?> </header> <div id="login" class="login" style="display:none"> <div id="forms" class="forms"> <form method="post" action="index.php" name="loginForm" id="loginForm"> <label for="login_input_username">Username</label> <input id="login_input_username" class="login_input" type="text" name="user_name" required /><span class="linebreak"></span> <label for="login_input_password">Password</label> <input id="login_input_password" class="login_input" type="password" name="user_password" autocomplete="off" required /><span class="linebreak"></span> <span class="loginregister"><input type="submit" name="login" value="Log in" /></span></form><form action="#"><span class="loginregister"><input type="submit" value="Register"></span></form> </div> </div>


He notado en el script Login.php que hay una línea de código elseif (isset ($ _ POST ["login"])) {pero ninguno de los elementos del formulario tiene el nombre "login" que no sea el botón de enviar, do ustedes creen que eso podría ser un problema?

Este no es el problema. Si el botón de enviar tiene el nombre ''iniciar sesión'', se publica como ''inicio de sesión'', por lo que se establece.

Los cambios de PHP que recomienda Fred en sus comentarios seguiría, aunque no tendría sentido que estos tuvieran un impacto solo en los usuarios de dispositivos móviles. Lo más probable es que esto tenga que ver con la forma en que se guarda la sesión.

¿El redireccionamiento a index.php funciona para dispositivos móviles? Si es así, puede var_dump ($ _ SESSION); en la parte superior de index.php y ver lo que dice en el móvil después de intentar iniciar sesión?


Después de que OP usó informes de errores , como sugerí en los comentarios:

"Inmediatamente, después de agregarlo a la página index.php y cargar recibí: Advertencia: session_start (): No puedo enviar el limitador de la memoria caché de la sesión - los encabezados ya enviados, también recibo uno similar en el móvil que dice que los encabezados de las cookies de sesión están en su lugar del limitador de caché de sesión. - radiocaf "

Su archivo index.php (y posiblemente otros archivos) le lanza esa advertencia porque puede tener su formulario HTML encima de PHP, o un espacio, o cookie, o incluso una BOM (marca de orden de bytes).

La codificación de sus archivos puede contener una marca de orden de bytes, que a menudo es la causa principal de una advertencia de encabezado enviado. La codificación UTF-8 le permite guardar archivos como "con" o "sin" la marca de orden de bytes; debe guardarlos como "sin BOM".

Eso se considera como salida, como lo son los espacios antes de una etiqueta <?php apertura, o una cookie, etc.

Para verificar cuál es la codificación del archivo, puede verificar dentro de las opciones del editor de código bajo la opción de codificación.

Uno de los cuales es Notepad ++ https://notepad-plus-plus.org/ y hay otros también.

Coloque su PHP primero, luego su formulario si ese es el caso.

Consulte lo siguiente en Stack sobre esa advertencia:

Además, una solución rápida sería usar ob_start(); en la parte superior de tus archivos PHP

Es decir:

<?php ob_start(); // rest of your PHP ?>

entonces tu HTML

o

<?php ob_start(); ?>

  • entonces tu HTML

  • luego el resto de tu PHP / SQL.

Además, como se dijo originalmente en los comentarios:

"estos ''" . $user_name . "'' ''" . $user_name . "'' ''" . $user_name . "'' contienen espacios y pueden interpretarse como espacios adicionales que se agregan. Intenta eliminarlos ''" .$user_name. "'' ''" .$user_name. "'' o ''".$user_name."'' "