elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  Problema no-object.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema no-object.  (Leído 4,887 veces)
James_JPM

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Problema no-object.
« en: 8 Junio 2016, 21:54 pm »

Antes de nada, pido perdón por si este no es la sección donde debería ir la duda.

Al caso; después de mucho buscar, no consigo encontrar el motivo por el que me salta este error:
( ! ) Notice: Trying to get property of non-object in
en la línea
Código:
if($resultados->num_rows>0) {

El código es el siguiente:

- Primero tengo un index.html (No pongo código porque es irrelevante).
- Después un archivo php llamado "conexión_bd.php":
Código:
<?php

$conexion=new mysqli();

$db_conexion="localhost";
$db_usuario="root";
$db_pass="";
$db_nombre="usuarios";

$conexion->connect($db_conexion, $db_usuario, $db_pass, $db_nombre);

if($conexion->connect_error) {

die("Se ha detectado un problema en la conexión: " . $conexion->connect_error);
}
?>

- Otro archivo php llamado "login_validation.php":
Código:
<?php

session_start();
require_once("conexion_bd.php");

$usuario=$_POST["usuario"];
$password=$_POST["pass"];

$sentenciaSQL="SELECT * FROM usuario WHERE usuario='$usuario' AND contraseña='$password' ";

$resultados=$conexion->query($sentenciaSQL);

if($resultados->num_rows>0) {

while($registros=$resultados->fetch_array()) {

$nombre=$registros["nombre"];

$_SESSION["nombreUsuario"]=$nombre;
header("location:inicio.php");
}

}else {

echo("Usuario o contraseña incorrectos. Por favor, inténtelo de nuevo.");
}

?>

-Otro archivo php llamado "inicio.php" (En este también tengo código html):
Código:
<?php

session_start();
//error_reporting(0);

$varSesion=$_SESSION["nombreUsuario"];
        echo("Bienvenido, <strong>" . $_SESSION["nombreUsuario"] . "</strong>");

if($varSesion==null || $varSesion=="") {


echo("Error 404, por favor, hable con su administrador.");
die();
}
?>

- Y finalmente otro archivo php llamado "CerrarSesion.php" donde se cierra la sesión.


Gracias de antemano. :)


En línea

|Miguel|

Desconectado Desconectado

Mensajes: 217



Ver Perfil
Re: Problema no-object.
« Respuesta #1 en: 8 Junio 2016, 22:04 pm »

¿Seguro que es en esa línea dónde da el fallo? Revisa la documentación de php: http://php.net/manual/en/mysqli.query.php
Supongo que no podrás depurar... puedes utilizar var_dump y print_r sobre $conexion justo después de hacer el connect y sobre $resultados justo después de llamar a query() ?


En línea

James_JPM

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Re: Problema no-object.
« Respuesta #2 en: 9 Junio 2016, 02:16 am »

Vale, solucionado ya.

Resulta que buscando por el foro encontré a un usuario con un problema similiar diciendo que el error estaba en la BBDD que le aparecía como creada pero en realidad no existía. La borré, la volví a crear y el problema se solucionó.

Muchas gracias igualmente por la ayuda. ;)
En línea

|Miguel|

Desconectado Desconectado

Mensajes: 217



Ver Perfil
Re: Problema no-object.
« Respuesta #3 en: 9 Junio 2016, 08:50 am »

 :huh: :huh: :huh: y no dio error al conectarte? eso si que es raro!
En línea

James_JPM

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Re: Problema no-object.
« Respuesta #4 en: 9 Junio 2016, 19:29 pm »

No, el problema de loguearse ya está resuelto. Si el usuario está almacenado en la BBDD lo redirecciona a la página que quiero yo. :)

Ahora el problema es que tengo otro documento llamado "formulario_registro.php" en el que una vez que se cubran los campos correspondientes, se almacene los datos introducidos en la BBDD pero no lo hace, ni salta ningún error.

El código es el siguiente:
Código:
<doctype HTML>
<html lang='es'>
<head>
<meta charset='utf-8'>
<title></title>
</head>
<body>

<form action='' method='POST' class='registro' action=''>
<div>
<label>Nombre:</label>
<input type='text' name='nombre'></div><br />
<label>Apellido:</label>
<input type='text' name='apellido'></div><br /><br />
<label>Correo-e:</label>
<input type='email' name='email'></div><br /><br />
<label>Repetir Correo-e:</label>
<input type='email' name='reemail'></div><br /><br />
<label>Usuario:</label>
<input type='text' name='usuario'></div><br /><br />
<div><label>Contraseña:</label>
<input type='password' name='password'></div> <br /><br />
<div><label>Repetir Contraseña:</label>
<input type='password' name='repassword'></div> <br /><br />
<div>
<input type='submit' name='enviar' value='Registrar'></div>
</form>

<?php

//session_start();
//require_once("registro.php");
session_start();

require_once "conexion_bd.php";

if(isset($_POST["enviar"])) {

     if($_POST["nombre"]=="" or $_POST["apellido"]=='' or $_POST["email"]=='' or $_POST["reemail"]=='' or $_POST["usuario"]=='' or $_POST["password"]=='' or $_POST["repassword"]=='') {

       echo("<script type='text/javascript'>alert('Error. Asegúrese de haber cubierto todos los campos.')</script>");

     }else {

         $query="SELECT * FROM usuarios";
         $resultados=$conexion->query($query);

         $verificar_user=0;

         /*while($result=$resultados->fetch_object($resultados)) {

             if($result->usuario==$_POST["usuario"]) {

                 $verificar_usuario=1;
       //echo("<script type='text/javascript'>alert('Nombre de usuario ya en uso. Por favor, introduzca otro nombre válido.')</script>");
             }
         }**/
  
         if($verificar_user==0) {

             if($_POST["password"]==$_POST["repassword"]) {

                 $nombre=$_POST["nombre"];
                 $apellido=$_POST["apellido"];
                 $email=$_POST["email"];
                 $usuario=$_POST["usuario"];
                 $password=$_POST["password"];  

                 $query2="INSERT INTO usuario (codigo, nombre, apellido, email, usuario, password) VALUES ('', $nombre, $apellido, $email, $usuario, $password)";

                 $conexion->query($query2);
  
                 echo("Usted se ha registrado correctamente.");
header("location:index.html");                

             }else {

                 echo("Las claves no son iguales, intente nuevamente.");
             }

         }else {

             echo("Este usuario ya ha sido registrado anteriormente.");
         }
     }
}
?>
</body>
</html>

PD: El código no está terminado, tengo que correguir los echos por scripts y cosas así. Pero lo principal que quiero que haga, no funciona.
En línea

|Miguel|

Desconectado Desconectado

Mensajes: 217



Ver Perfil
Re: Problema no-object.
« Respuesta #5 en: 9 Junio 2016, 20:43 pm »

Hola,
tienes que separar el código del formulario por un lado y el del registro por el otro.

Lo más fácil es que saques el bloque php que has puesto ahí al archivo proceso_registro.php (por ejemplo) y en el formulario tienes que especificarlo en el atributo action='proceso_registro.php'
En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Problema no-object.
« Respuesta #6 en: 9 Junio 2016, 23:10 pm »

Si mejoraras la estructura de tu aplicación, te resultaria más facil encontrar fallos, modificar cosas, agregar nuevas...

Lo ideal seria que crearas clases, pero si no sabes entonces puedes crear simples funciones en un archivo funciones.php (todas juntas).

Primero comprueba que no haya ningún problem con el user input:

- Comprobar si hay campos vacios (comprobado).
- Comprobar que no haya input malicioso (no comprobado).
- Comprobar que las contraseñas coincidan (comprobado).
- Etc...

Y una vez todas las comprobaciones "pre-insert" se hayan validado, se llama a la función, y esta devuelve el resultado (mensaje para el usuario informandole de que se registró correctamente o false indicando que algo salió mal)
.
Otra cosa muy importante, es usar sentencias preparadas para añadir una importante capa de seguridad.

Te dejo un ejemplo de como usarlas con varias funciónes creadas a partir de tú código y otra función que vas a necesitar en tus formularios:

funciones.php
Código
  1. require('conexion_bd.php');
  2.  
  3. function isNotEmpty($array, $whiteList) {
  4.    foreach ($whiteList as $val) {
  5.        if (empty($array[$val])) {
  6.            return false;
  7.        }
  8.    }
  9.  
  10.    return true;
  11. }
  12.  
  13. function verificar_user($nombre) {
  14.    if ($stmt = $conexion->prepare('SELECT usuario FROM usuarios WHERE usuario = ? LIMIT 1')) {
  15.        $stmt->bind_param('s', $nombre);
  16.        $stmt->store_result();
  17.  
  18.        if ($stmt->num_rows === 1) {
  19.            // 'Este usuario ya ha sido registrado anteriormente.'
  20.            $exit = 'Nombre de usuario ya en uso. Por favor, introduzca otro nombre válido.';
  21.        } else $exit = FALSE;
  22.    }
  23.  
  24.    return $exit;
  25. }
  26.  
  27. function registrar_usuario($user_info) {
  28.    if ($stmt = $conexion->prepare('INSERT INTO usuario (nombre, apellido, email, usuario, password)
  29.                                    VALUES (?, ?, ?, ?, ?)')) {
  30.        $stmt->bind_param('sssss', $user_info['nombre'], $user_info['apellido'], $user_info['email'], $user_info['usuario'], $user_info['password']);
  31.  
  32.        if ($stmt->execute()) {
  33.            $exit = 'Usted se ha registrado correctamente.'
  34.        } else $exit = FALSE;
  35.    }
  36.  
  37.    return $exit;
  38. }
  39.  
  40. function otra_funcion() {
  41.    // code
  42. }

La función isNotEmpty() devolverá false cuando encuentre una variable vacia y se mostrará el error en el formulario.

Por preferencia, primero deberías poner el php y luego el html:

Código
  1. <?php
  2.  
  3.  
  4. if (isset($_POST['enviar'])) {
  5.  
  6.    require('funciones.php');
  7.  
  8.    $mensaje   = NULL;
  9.    $whiteList = ['nombre', 'apellido', 'email', 'reemail', 'usuario', 'password', 'repassword'];
  10.  
  11.    if (isNotEmpty($_POST, $whiteList) === FALSE) {
  12.  
  13.        $mensaje = 'Error. Asegúrese de haber cubierto todos los campos.';
  14.  
  15.    } else {
  16.  
  17.        $user_info = [];
  18.  
  19.        foreach ($whiteList as $val) {
  20.            $user_info[$val] = $_POST[$val]; // aquí puedes hacer lo que prefieras (filter_input, preg_match, preg_replace, etc...)
  21.        }
  22.  
  23.        $mensaje = verificar_user($user_info['nombre']);
  24.  
  25.        if ($mensaje === FALSE) {
  26.  
  27.            if ($user_info['password'] == $user_info['repassword']) {
  28.  
  29.                $mensaje = registrar_usuario($user_info);
  30.                $mensaje = $mensaje ? header('Location: /index.html?mensaje=' . $mensaje) : 'Ha habido un problema al registrar el usuario, intentelo más tarde.';
  31.  
  32.            } else $mensaje = 'Las claves no son iguales, intente nuevamente.';
  33.        }
  34.    }
  35. }
  36.  
  37. if ($mensaje) {
  38.    echo $mensaje;
  39. }
  40. ?>
  41. <!DOCTYPE html>
  42. <html>
  43.  
  44.    <head>
  45.  
  46.        <meta http-equiv="Content-Type" content="Text/HTML" charset="UTF-8" />
  47.        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  48.  
  49.        <title>Nombre página</title>
  50.  
  51.        <link type="text/css" rel="stylesheet" media="all" href="css/style.css" />
  52.  
  53.        <script type="text/javascript" src="js/scripts.js"></script>
  54.  
  55.    </head>
  56.  
  57.    <body>
  58.  
  59.        <header>
  60.  
  61.        </header>
  62.  
  63.        <main>
  64.            <form action="" method="POST" class="registro" action="">
  65.                <div>
  66.                    <label>Nombre:</label>
  67.                    <input type="text" name="nombre"></div><br />
  68.                    <label>Apellido:</label>
  69.                    <input type="text" name="apellido"></div><br /><br />
  70.                    <label>Correo-e:</label>
  71.                    <input type="email" name="email"></div><br /><br />
  72.                    <label>Repetir Correo-e:</label>
  73.                    <input type="email" name="reemail"></div><br /><br />
  74.                    <label>Usuario:</label>
  75.                    <input type="text" name="usuario"></div><br /><br />
  76.                    <div><label>Contraseña:</label>
  77.                    <input type="password" name="password"></div> <br /><br />
  78.                    <div><label>Repetir Contraseña:</label>
  79.                    <input type="password" name="repassword"></div> <br /><br />
  80.                <div>
  81.                <input type="submit" name="enviar" value="Registrar"></div>
  82.            </form>
  83.        </main>
  84.  
  85.        <footer>
  86.  
  87.        </footer>
  88.  
  89.    </body>
  90.  
  91. </html>
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines