Problema no-object.

Iniciado por James_JPM, 8 Junio 2016, 21:54 PM

0 Miembros y 1 Visitante están viendo este tema.

James_JPM

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 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": <?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": <?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): <?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. :)

|Miguel|

¿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() ?

James_JPM

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. ;)

|Miguel|

 :huh: :huh: :huh: y no dio error al conectarte? eso si que es raro!

James_JPM

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: <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.

|Miguel|

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'

gAb1

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 (php) [Seleccionar]
require('conexion_bd.php');

function isNotEmpty($array, $whiteList) {
   foreach ($whiteList as $val) {
       if (empty($array[$val])) {
           return false;
       }
   }

   return true;
}

function verificar_user($nombre) {
   if ($stmt = $conexion->prepare('SELECT usuario FROM usuarios WHERE usuario = ? LIMIT 1')) {
       $stmt->bind_param('s', $nombre);
       $stmt->store_result();

       if ($stmt->num_rows === 1) {
           // 'Este usuario ya ha sido registrado anteriormente.'
           $exit = 'Nombre de usuario ya en uso. Por favor, introduzca otro nombre válido.';
       } else $exit = FALSE;
   }

   return $exit;
}

function registrar_usuario($user_info) {
   if ($stmt = $conexion->prepare('INSERT INTO usuario (nombre, apellido, email, usuario, password)
                                   VALUES (?, ?, ?, ?, ?)')) {
       $stmt->bind_param('sssss', $user_info['nombre'], $user_info['apellido'], $user_info['email'], $user_info['usuario'], $user_info['password']);

       if ($stmt->execute()) {
           $exit = 'Usted se ha registrado correctamente.'
       } else $exit = FALSE;
   }

   return $exit;
}

function otra_funcion() {
   // code
}


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 (php) [Seleccionar]
<?php

session_start
();

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

    require(
'funciones.php');

    
$mensaje   NULL;
    
$whiteList = ['nombre''apellido''email''reemail''usuario''password''repassword'];

    if (
isNotEmpty($_POST$whiteList) === FALSE) {

        
$mensaje 'Error. Asegúrese de haber cubierto todos los campos.';

    } else {

        
$user_info = [];

        foreach (
$whiteList as $val) {
            
$user_info[$val] = $_POST[$val]; // aquí puedes hacer lo que prefieras (filter_input, preg_match, preg_replace, etc...)
        
}

        
$mensaje verificar_user($user_info['nombre']);

        if (
$mensaje === FALSE) {

            if (
$user_info['password'] == $user_info['repassword']) {

                
$mensaje registrar_usuario($user_info);
                
$mensaje $mensaje header('Location: /index.html?mensaje=' $mensaje) : 'Ha habido un problema al registrar el usuario, intentelo más tarde.';

            } else 
$mensaje 'Las claves no son iguales, intente nuevamente.';
        }
    }
}

if (
$mensaje) {
    echo 
$mensaje;
}
?>

<!DOCTYPE html>
<html>

   <head>

       <meta http-equiv="Content-Type" content="Text/HTML" charset="UTF-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1.0" />

       <title>Nombre página</title>

       <link type="text/css" rel="stylesheet" media="all" href="css/style.css" />

       <script type="text/javascript" src="js/scripts.js"></script>

   </head>

   <body>

       <header>
           
       </header>

       <main>
           <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>
       </main>

       <footer>
           
       </footer>

   </body>

</html>