PHP - Error Notice offset

   
Vista:

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 07:27:41
Buenas, me aparece el error:
Notice: Undefined offset:

esto sucede al hacer un registro en base de datos, el formulario es un registro de usuario , al finalizar el registro se supone que la barra de menu debe mostrar los botones de "Mi cuenta" , "Salir" y otro mas con el nombre del usuario, es ahi donde me sale este error:

Notice: Undefined offset:(seguido del numero id de usaurio que se acaba de registrar), el error me lo apunta donde tengo el boton que es el siguiente codigo

1
echo '<a class="mbr-buttons__link btn text-white" href="?view=perfil&id=' .$_SESSION['app_id']. '">'  .strtoupper($_users[$_SESSION['app_id']]['user']). '</a></li><li class="mbr-navbar__item">';

En lugar del boton con el nombre de usuario me pone el error y me mueve los demas botones, solo me eh dado cuenta de que despues de terminar el registro no me logea el usuario, antes lo hacia correctamente pero no veo a que le haya movido para que me de este error

El codigo de registro es el siguiente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$db = new Conexion();
$pass = Encrypt($_POST['pass']);
$user = $db->real_escape_string($_POST['user']);
$sql = $db->query("SELECT user FROM users WHERE user='$user' LIMIT 1;");
if($db->rows($sql) == 0) {
    $db->query("INSERT INTO users (user,pass) VALUES ('$user','$pass');");
    $sql_2 = $db->query("SELECT MAX(id) AS id FROM users;");
    $_SESSION['app_id'] = $db->recorrer($sql_2)[0];
    $db->liberar($sql_2);
    $HTML = 1;
} else {
  $usuario = $db->recorrer($sql)[0];
  if(strtolower($user) == strtolower($usuario)){
    $HTML = '<div class="alert alert-dismissible alert-danger">
    <button type="button" class="close" data-dismiss="alert">x</button>
    <strong>ERROR:</strong> El usuario ingresado ya existe.
  </div>';
  }
}
$db->liberar($sql);
$db->close();
echo $HTML;
?>

Alguien puede ver donde esta el error? eh leido que es referente a que la variable que uso para mostrar el nombre del usuario en le boton del menu no recibe ningun dato, pero eso no podría ser ya que uso la misma variable para otras operaciones, creo que esto sucede solo al registrar el usuario pues la solucion de momento es desloguear el usuario y volver a entrar para que esta vez los botones aparezcan correctamente....
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Miguel

Error Notice offset

Publicado por Miguel (15 intervenciones) el 04/06/2016 14:27:12
Verifica que tu variable de session $_SESSION['app_id'], este definida y contenga el valor del id del usuario
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 19:00:55
La variable si se define en el proceso de registrar un usuario, en el comentario de abajo lo compruebo, la variable tiene el valor del id del usuario que se registra, alguna otra idea?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Error Notice offset

Publicado por kip (571 intervenciones) el 04/06/2016 14:41:17
Hola, podrias colocar el contenido de la funcion recorrer() que usas en esta linea:

1
$_SESSION['app_id'] = $db->recorrer($sql_2)[0];

Creo que alli radica el problema.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 18:58:47
Yo tambien creo que podría ser eso, pero mira, ese codigo me da el id del usuario que se registra, acabo de confirmarlo solo para que no haya ninguna duda.
Hago el registro y me aparece bien en base de datos

id-5

Modifico la respuesta de la interfaz y tambien me da el id correcto del usuario:

5

No se si lo alcances a percibir, es el 5 que esta en la esquina marcado con el circulo rojo.

Corrijo denuevo el codigo a como estaba antes, refresco la pagina y el problema es el mismo, el boton con el nombre del usuario no parece, te dejo la imagen para que veas como sucede


manu

hago un reinicio de sesion y haroa sale bien


manu-correcto

Alguna otra idea de que pueda ser?

PD* Si las imagenes no aparecen dejo el archivo adjunto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Error Notice offset

Publicado por kip (571 intervenciones) el 04/06/2016 19:17:18
Entiendo, sabes seria mucho mejor si colocases el código también, muchas veces se suele pasar despercibido algun error, que en este caso parece ser no tan grave, quizas es cuestion de inicializar correctamente algun procedimiento, por favor adjunta el codigo de topnav.php y tambien de la funcion que te mencione, como ya te dije, para poder indentificar algun mal procedimiento que esta provocando el error.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 19:22:56
Claro, aqui te paso el codigo de esa pagina que pides:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<section class="mbr-navbar mbr-navbar--freeze mbr-navbar--absolute mbr-navbar--sticky mbr-navbar--auto-collapse" id="ext_menu-0">
    <div class="mbr-navbar__section mbr-section">
        <div class="mbr-section__container container">
            <div class="mbr-navbar__container">
                <div class="mbr-navbar__column mbr-navbar__column--s mbr-navbar__brand">
                    <span class="mbr-navbar__brand-link mbr-brand mbr-brand--inline">
                        <span class="mbr-brand__logo"><a href="?view=index"><img class="mbr-navbar__brand-img mbr-brand__img" src="views/images/logo.png" alt="Mobirise"></a></span>
                    </span>
                </div>
                <div class="mbr-navbar__hamburger mbr-hamburger text-white"><span class="mbr-hamburger__line"></span></div>
                <div class="mbr-navbar__column mbr-navbar__menu">
                    <nav class="mbr-navbar__menu-box mbr-navbar__menu-box--inline-right">
                        <div class="mbr-navbar__column"><ul class="mbr-navbar__items mbr-navbar__items--right mbr-buttons mbr-buttons--freeze mbr-buttons--right btn-decorator mbr-buttons--active"><li class="mbr-navbar__item">
                          <a class="mbr-buttons__link btn text-white" href="?view=index">INICIO</a></li><li class="mbr-navbar__item">
 
                        <?php
                        if(!isset($_SESSION['app_id'])) {
                          echo '<a class="mbr-buttons__link btn text-white" data-toggle="modal" data-target="#Login">INICIAR SESIÓN</a></li><li class="mbr-navbar__item">
                          <div class="mbr-navbar__column"><ul class="mbr-navbar__items mbr-navbar__items--right mbr-buttons mbr-buttons--freeze mbr-buttons--right btn-inverse mbr-buttons--active"><li class="mbr-navbar__item"><a class="mbr-buttons__btn btn btn-default" data-toggle="modal" data-target="#Registro">REGISTRARSE</a></li></ul></div>';
                        } else {
                          echo '<a class="mbr-buttons__link btn text-white" href="?view=perfil&id=' .$_SESSION['app_id']. '">'  .strtoupper($_users[$_SESSION['app_id']]['user']). '</a></li><li class="mbr-navbar__item">
                            <div class="mbr-navbar__column"><ul class="mbr-navbar__items mbr-navbar__items--right mbr-buttons mbr-buttons--freeze mbr-buttons--right btn-inverse mbr-buttons--active"><li class="mbr-navbar__item"><a class="mbr-buttons__btn btn btn-default" href="?view=cuenta&id='.$_SESSION['app_id'].'">MI CUENTA</a></li></ul></div>
                            <div class="mbr-navbar__column"><ul class="mbr-navbar__items mbr-navbar__items--right mbr-buttons mbr-buttons--freeze mbr-buttons--right btn-inverse mbr-buttons--active"><li class="mbr-navbar__item"><a class="mbr-buttons__btn btn btn-default" href="?view=logout">SALIR</a></li></ul></div>
                          ';  }
                        ?>
                    </nav>
                </div>
            </div>
        </div>
    </div>
  </div>
</section>


<?php
if(!isset($_SESSION['app_id'])) {
  include(HTML_DIR . '/public/login.html');
  include(HTML_DIR . '/public/reg.html');
}
?>

el de la funcion es un fetch array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
class Conexion extends mysqli {
 
  public function __construct() {
    parent::__construct(DB_HOST,DB_USER,DB_PASS,DB_NAME);
    $this->connect_errno ? die('Error en la conexión a la base de datos') : null;
    $this->set_charset("utf8");
  }
 
  public function rows($query) {
    return mysqli_num_rows($query);
  }
 
  public function liberar($query) {
    return mysqli_free_result($query);
  }
 
  public function recorrer($query) {
    return mysqli_fetch_array($query);
  }
 
}
 
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 19:20:34
Mas bien creo que es cosa de la siguiente variable :
strtoupper($_users[$_SESSION['app_id']]['user'])

hago lo mismo que antes y ahi si me da el error offset, parece que no se define al memento del registro ....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Error Notice offset

Publicado por kip (571 intervenciones) el 04/06/2016 19:54:33
Parece que las funciones que colocaste estan bien, sabes iba a mencionarte sobre aquella variable, solo veo que aparece alli, no entiendo bien la estrucutra de aquel array bidimensional que estas creando o llamando, y si lo estas llamando no veo donde exista ['user'], tal vez es la variable $_POST['user'], pero no lo se, ahora bien lo que entiendo de la estructura es que estas creando un array cuyos indices tendrán en valor de la variable $_SESSION['app_id'] y con ['user'] intentas obtener el valor de aquel indice.

Te recomiendo hacer un var_dump() de aquella variable y ver la estructura de aquel array, asi mismo colocar aqui lo que te muestra para ayudarte.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 20:43:09
Ah disculpa, no te mostre esa parte del programa, sucede que 'user' lo que trata de hacer es recibir el nonbre del usuario que esta asignado al id del registro, uso una fincion que simula el funcionamiento de la base de datos para poder usarlo en todo el programa, es el siguiente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Users() {
  $db = new Conexion();
  $sql = $db->query("SELECT * FROM users;");
 
    if(!isset($_SESSION['users'])) {
      while($d = $db->recorrer($sql)) {
        $users[$d['id']] = $d;
      }
    } else {
      $users = $_SESSION['users'];
    }
 
  $_SESSION['users'] = $users;
  $db->liberar($sql);
  $db->close();
  return $_SESSION['users'];

lo del var_dump() tendré que investigarlo porque apenas voy aprendiendo de este lenguaje y no conosco esa funcion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Error Notice offset

Publicado por kip (571 intervenciones) el 04/06/2016 21:10:48
Si tienes construida de esa forma $_SESSION['users'], porque tienes de esta forma el codigo:
1
strtoupper($_users[$_SESSION['app_id']]['user'])

$_users de donde sale?
Sigo sin entender si ['user'] viene del $_POST['user'] o es un indice del array $_SESSION['app_id'].

Que te parece si la llamas de esta forma:
1
strtoupper($_SESSION[$_SESSION['app_id']]['users'])

Ahora bien, el var_dump() es como un echo pero en este caso te muestra el contenido de un array:
1
var_dump($_users[$_SESSION['app_id']]['user']);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 22:19:52
Eh logrado corregirlo, muchas gracias por tu ayuda amigo, tus comentarios me han orientado , el problema efectivamente era 'user' en la variable del botón, no estaba recibiendo nada, pór lo que preguntabas, este no recibe su valor de la variable _POST, el código que puse antes lo que hace es asignar los valores de los campos de cada id de usuario que se registra, entonces el valor lo recibe de una variable global que apunta a la funcion Users, que es donde obtengo los nombres, contraseñas y demas campos de cada id,

La solución que comentabas daba el mismo resultado, y lo del var domp lo tendre en cuenta para futuras referencias, muchas gracias de verdad !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Error Notice offset

Publicado por kip (571 intervenciones) el 04/06/2016 22:39:50
Me alegra, me gustaria que colocases el codigo ya corregido, si es posible, asi cualquier persona que llegue a este tema podra visualizar la solucion.

Por cierto, en realidad divagaba mucho sobre las variables que mencione porque no comprendia del todo el origen de las mismas, al ser tu el creador del sistema entonces para ti es mucho mas claro.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Error Notice offset

Publicado por Humberto (8 intervenciones) el 04/06/2016 22:57:00
Si tienes razon, lo que pasa es que no veia por donde podia estar el problema en un principio, el error offset lo desconocia, lo que necesitaba era saber donde buscar mas que nada, y estas en lo cierto, aqui publico el codigo de la funcion Users que corregi, que era la que no me estaba mandando el valor del campo user del id registrado, aproveche para hacer unas modificaciones pero la funcion hace lo mismo, solo que resgtrijo las veces en las que el while debe estar funcionando para que no recaiga tanto en el procesador del usuario

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
function Users() {
  $db = new Conexion();
  $sql = $db->query("SELECT * FROM users;");
  $usuarios_actuales = $db->rows($sql);
 
  if(!isset($_SESSION['cantidad_usuarios'])) {
    $_SESSION['cantidad_usuarios'] = $usuarios_actuales;
  }
  if($_SESSION['cantidad_usuarios'] != $usuarios_actuales) {
    while($d = $db->recorrer($sql)) {
      $users[$d['id']] = $d;
    }
  } else {
    if(!isset($_SESSION['users'])) {
      while($d = $db->recorrer($sql)) {
        $users[$d['id']] = $d;
      }
    } else {
      $users = $_SESSION['users'];
    }
  }
  $_SESSION['users'] = $users;
  $db->liberar($sql);
  $db->close();
  return $_SESSION['users'];
}
?>

Nuevamente te doy las gracias, saludos y que tengas buen dia!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar