entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

problema al tratar de actualizar perfil de usuario en pdo

saludos amigo de la comunidad tengo un gram problema y no lo he podido solucionar resulta que quiero actualizar los datos de perfil del usurio en una session ya iniciada pero los campos se me muestran en blanco osea no me muestra nada en la actualidad me encuentro migrandome a PDO

archivo para validar y crear la session de usuario.

<?php

include("conexion/conexion.php");

$user = $_POST['user'];   
$password = $_POST['password'];

$user_check = $DB_con->prepare('SELECT user FROM usuarios WHERE user = :user LIMIT 1');
$user_check->bindParam(':user', $_POST['user']);
$user_check->execute();
if($user_check->rowCount() == 0)

    { 

    header("refresh:5;ingresar.php");
    exit;

    $mensaje = "<div class='col s12 card-panel blue lighten-2 center'>
    <h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Usuario Incorrecto !
    </h5></div>";

        }

   ?>

<?php 
// Preparamos la consulta y la ejecutamos 
$sql = $DB_con->prepare('SELECT * FROM usuarios WHERE user = :user AND 
password = :password AND idnivel = \'Administrador\'  LIMIT 1');
$sql->bindParam(':user', $_POST['user']);
$sql->bindParam(':password', hash('sha256', $_POST['password']));
$sql->execute();
$sql->closeCursor();
// Comprobamos si ha devuelto algun registro
if($sql->rowCount()){

    // Iniciamos sesion
    session_start();
    // Recuperamos los datos de la consulta 
    $row = $sql->fetch(PDO::FETCH_ASSOC);
    //definimos las variables necesarias para la sesion
    $_SESSION['id'] = $id;
    $_SESSION['user'] = $user;
    $_SESSION['password'] = $password;
    $_SESSION['idnivel'] = 'Administrador';
    $_SESSION['cedula'] = $cedula;
    $_SESSION['nombres'] = $row['nombres'].' ' .$row['apellidos'];
    $_SESSION['email'] = $email;
    $_SESSION['telefono'] = $telefono;
    $_SESSION['direccion'] = $direccion;

    // Redirigimos la pagina 
    header("Location: admin/home.php");
    exit; 

    } 

    else 

    {

header("refresh:5;ingresar.php");
exit;

$mensaje = "<div class='col s12 card-panel blue lighten-2 center'>
<h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Contraseña incorrecta !
</h5></div> ";

  }

?>

<?php

$sql = $DB_con->prepare('SELECT * FROM usuarios WHERE user = :user AND 
password = :password AND idnivel = \'Usuarios\'  LIMIT 1');
$sql->bindParam(':user', $_POST['user']);
$sql->bindParam(':password', hash('sha256', $_POST['password']));
$sql->execute();
$sql->closeCursor();
// Comprobamos si ha devuelto algun registro
if($sql->rowCount()){

  // Iniciamos sesion
  session_start();
  // Recuperamos los datos de la consulta 
  $row = $sql->fetch(PDO::FETCH_ASSOC);
  //definimos las variables necesarias para la sesion
  $_SESSION['id'] = $id;
  $_SESSION['user'] = $user;
  $_SESSION['password'] = $password;
  $_SESSION['idnivel'] = 'Usuarios';
  $_SESSION['cedula'] = $cedula;
  $_SESSION['nombres'] = $row['nombres'].' ' .$row['apellidos'];
  $_SESSION['email'] = $email;
  $_SESSION['telefono'] = $telefono;
  $_SESSION['direccion'] = $direccion;

    header("Location: user/home.php"); 
    exit;

    } 

    else 

    {

header("refresh:5;ingresar.php");
exit;

$mensaje = "<div class='col s12 card-panel blue lighten-2 center'>
<h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Contraseña incorrecta !
</h5></div> ";

  }

?>

<?php

$sql = $DB_con->prepare('SELECT * FROM usuarios WHERE user = :user AND 
password = :password AND idnivel = \'Secretarias\'  LIMIT 1');
$sql->bindParam(':user', $_POST['user']);
$sql->bindParam(':password', hash('sha256', $_POST['password']));
$sql->execute();
$sql->closeCursor();
// Comprobamos si ha devuelto algun registro
if($sql->rowCount()){

  // Iniciamos sesion
  session_start();
  // Recuperamos los datos de la consulta 
  $row = $sql->fetch(PDO::FETCH_ASSOC);
  //definimos las variables necesarias para la sesion
  $_SESSION['id'] = $id;
  $_SESSION['user'] = $user;
  $_SESSION['password'] = $password;
  $_SESSION['idnivel'] = 'Secretarias';
  $_SESSION['cedula'] = $cedula;
  $_SESSION['nombres'] = $row['nombres'].' ' .$row['apellidos'];
  $_SESSION['email'] = $email;
  $_SESSION['telefono'] = $telefono;
  $_SESSION['direccion'] = $direccion;

 header("Location: secretarias/home.php"); 
 exit;

    } 

    else 

    {

header("refresh:5;ingresar.php");
exit;

$mensaje = "<div class='col s12 card-panel blue lighten-2 center'>
<h5 class='black-text text-darken-2 center CONDENSED LIGHT5'>¡ Ups Aviso: Contraseña incorrecta !
</h5></div> ";

  }

  $sql = null;
  $DB_con = null;

?>

archivo de perfil de usuario

<!-- la session start-->

<?php

    session_start();
    if(!isset($_SESSION['user']))
      {

        header('Location: ../index.php?Error=Acceso denegado');
echo "<script>alert('Disculpe Acceso registringido, Usuario no Autorizado')</script>";

        exit(); 
      }
  ?>

<!-- fin de la session start-->

<!-- proceso para consultar-->

<?php
//var_dump($_SESSION);
$user=$_SESSION['user'];
$password=$_SESSION['password'];
$sql = "SELECT * FROM usuarios WHERE user = :user AND password = :password"; //Creamos la select
$perfil = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
$perfil->bindParam(':user',$_POST['user']);//Substituimos las variables de la SELECT
$perfil->bindParam(':password',$_POST['password']);//Substituimos las variables de la SELECT
$perfil->execute();//Ejecutamos la consulta
$editar_linea = $perfil->fetch(PDO::FETCH_ASSOC);{

?>
<!--fin proceso para consultar-->

<!--mostrar datos de la consulta-->
<?php echo $editar_linea['cedula']; ?>

<!--fin mostrar datos de la consulta-->

<?php

}

?>

gracias de ante mano y ojala me puedan ayudar ya que no encuentro que hacer

3 Respuestas

1voto

yoclens Puntos1770

ya lo pude resolver anexo como me quedo

<?php
//var_dump($_SESSION);
$user=$_SESSION['user'];
$password=hash('sha256', $_SESSION['password']);
$sql = "SELECT * FROM usuarios WHERE user = :user AND password = :password"; //Creamos la select
$perfil = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
$perfil->bindParam(':user',$user);//Substituimos las variables de la SELECT
$perfil->bindParam(':password',$password);//Substituimos las variables de la SELECT
$perfil->execute();//Ejecutamos la consulta
$_editar_linea = $perfil->fetch(PDO::FETCH_ASSOC);{
//print_r($DB_con->errorInfo());

?>

0voto

Peter comentado

Gracias por compartir la solución, por favor selecciona la respuesta como correcta.

Saludos.

2votos

carlossevi Puntos63580

Juraría que al menos tienes un problema en esta parte del código:

$sql = $DB_con->prepare('SELECT * FROM usuarios WHERE user = :user AND password = :password AND idnivel = \'Usuarios\'  LIMIT 1');
$sql->bindParam(':user', $_POST['user']);
$sql->bindParam(':password', hash('sha256', $_POST['password']));
$sql->execute();
$sql->closeCursor();
// Comprobamos si ha devuelto algun registro
if($sql->rowCount()) {
    ...

Si cierras el cursor con $sql->closeCursor(); ya no puedes hacer uso de él, con lo que creo que tu ejecución ya no entra en la bifurcación ni puedes hacer $sql->fetch();.

Deberías cerrarlo cuando hayas terminado de usarlo.

0voto

yoclens comentado

gracias amigo por responder, llevo ya dos días trancado con esa parte ya no se que hacer como debería quedar esa parte podrías darme un ejemplo cuando trato de hacer la consulta se muestra vacia. gracias

0voto

carlossevi comentado

Prueba a comentar la línea de $sql->closeCursor(); y comprueba si sigue sin funcionar. Si eso soluciona el problema, deberás mover esa línea al punto en que ya no necesites utilizar el resultado de la consulta.

0voto

yoclens comentado

ok gracias amigo he comentado la lineas que me dijiste y realice un var_dump y se me muestran los datos ahora para mostrar los datos en el input deberia ser asi:

<input id="icon_prefix" type="text" name="nombres" value='<?php echo $_SESSION['nombres']; ?>' autocomplete="off" title="Se Necesita sus Nombres, Este Campo solo Acepta Letras!" pattern="[a-zA-Z ]+" required/>

2votos

Leonardo-Tadei Puntos227320

Hola @yoclens,

si no veo mal, el problema está en que en el script que hace la consulta de los datos para mostrárselos al usuario, en vez de usar los datos del mismo de las variables de la sesión, estás usando los datos de un formulario que no es dirigido a esta página.

Tenés:

<!-- proceso para consultar-->
<?php
//var_dump($_SESSION);
$user=$_SESSION['user'];
$password=$_SESSION['password'];
$sql = "SELECT * FROM usuarios WHERE user = :user AND password = :password"; //Creamos la select
$perfil = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
$perfil->bindParam(':user',$_POST['user']);// <-- ACA!
$perfil->bindParam(':password',$_POST['password']);// <-- ACA!
$perfil->execute();//Ejecutamos la consulta
...

y debería ser:

<!-- proceso para consultar-->
<?php
//var_dump($_SESSION);
$user=$_SESSION['user'];
$password=$_SESSION['password'];
$sql = "SELECT * FROM usuarios WHERE user = :user AND password = :password"; //Creamos la select
$perfil = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
$perfil->bindParam(':user',$user);//Substituimos las variables de la SELECT
$perfil->bindParam(':password',$password);//Substituimos las variables de la SELECT
$perfil->execute();//Ejecutamos la consulta
...

Esto asumiendo que las variables de la sesión existan y tengan el valor correcto.

Seguramente esto te estaba dando unos Warning por usar variables no definidas... tendrías que modificar el php.ini para ponerle los valores de desarrollo, así estos errores y advertencias te aparecen en pantalla. Ayuda mucho además a adquirir buenas prácticas de programación.

Saludos cordiales!

0voto

yoclens comentado

gracias por responder pero fijate como me quedo la consulta

<?php
//var_dump($_SESSION);
$user=$_SESSION['user'];
$password=$_SESSION['password'];
$sql = "SELECT * FROM usuarios WHERE user = :user AND password = :password"; //Creamos la select
$perfil = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
$perfil->bindParam(':user',$user);//Substituimos las variables de la SELECT
$perfil->bindParam(':password',$password);//Substituimos las variables de la SELECT
$perfil->execute();//Ejecutamos la consulta
$editar_linea = $perfil->fetch(PDO::FETCH_ASSOC);{
?>
<!--fin proceso para consultar-->

las variables de session están bien definidas le realice un var_dump y todas me llegan perfectamente

array(11) { ["id"]=> string(1) "1" ["user"]=> string(7) "yoclens" ["password"]=> string(12) "Yoclens2016-" ["idnivel"]=> string(13) "Administrador" ["Administrador"]=> string(12) "Yoclens2016-" ["cedula"]=> string(8) "14222789" ["nombres"]=> string(4) "jose" ["apellidos"]=> string(6) "camilo" ["email"]=> string(16) "[email protected]" ["telefono"]=> string(9) "416101180" ["direccion"]=> string(25) "las colinas de belo monte" }

el problema es que no me toma el valor en el input, lo estoy declarando de esta forma y me da error

<div class="input-field col s12 m3">
<input id="icon_prefix" type="text" name="nombres" value='<?php echo $_editar_linea['nombres']; ?>' autocomplete="off" title="Se Necesita sus Nombres, Este Campo solo Acepta Letras!" pattern="[a-zA-Z ]+" required/>
<label for="nombres" class="black-text ">Nombres:</label>
</div>

0voto

Leonardo-Tadei comentado

Hacé un var_dump($editar_linea); y copiá el resultado por acá, para ver qué devuelve la query... sin la tabla, no podemos saber si los nombres de los elementos del array están bien.

0voto

yoclens comentado

ok

<!-- proceso para consultar-->

<?php
//var_dump($_SESSION);
$user=$_SESSION['user'];
$password=$_SESSION['password'];
$sql = "SELECT * FROM usuarios WHERE user = :user AND password = :password"; //Creamos la select
$perfil = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
$perfil->bindParam(':user',$user);//Substituimos las variables de la SELECT
$perfil->bindParam(':password',$password);//Substituimos las variables de la SELECT
$perfil->execute();//Ejecutamos la consulta
$editar_linea = $perfil->fetch(PDO::FETCH_ASSOC);{

var_dump($editar_linea);
?>
<!--fin proceso para consultar-->

el resultado es : bool(false)

0voto

Leonardo-Tadei comentado

Entonces la query no devuelve ningún valor!

Estás seguro de que $_SESSION['user']; y $_SESSION['password']; tienen los valores correctos?

Si ejecutás a mano (por ej en PHPMyAdmin) la query SELECT * FROM usuarios WHERE user = :user AND password = :password" reemplazando los parámetros por los valores en la sesión, te devuelve un registro?

0voto

yoclens comentado

en el archivo validar la session lo tengo asi:

<?php 
// Preparamos la consulta y la ejecutamos 
$sql = $DB_con->prepare('SELECT * FROM usuarios WHERE user = :user AND 
password = :password AND idnivel = \'Administrador\'  LIMIT 1');
$sql->bindParam(':user', $_POST['user']);
$sql->bindParam(':password', hash('sha256', $_POST['password']));
$sql->execute();
//$sql->closeCursor();
// Comprobamos si ha devuelto algun registro
if($sql->rowCount()){

    // Iniciamos sesion
    session_start();
    // Recuperamos los datos de la consulta 
    $row = $sql->fetch(PDO::FETCH_ASSOC);

    //definimos las variables necesarias para la sesion
    $_SESSION['id'] = $id;
  $_SESSION['id'] = $row['id'];
    $_SESSION['user'] = $user;
    $_SESSION['password'] = $password;
    $_SESSION['idnivel'] = 'Administrador';
  $_SESSION['Administrador'] = $password;

  //datos personales
    $_SESSION['cedula'] = $row['cedula'];
    $_SESSION['nombres'] = $row['nombres'];
  $_SESSION['apellidos'] = $row['apellidos'];
    $_SESSION['email'] = $row['email'];
    $_SESSION['telefono'] = $row['telefono'];
    $_SESSION['direccion'] = $row['direccion'];

    // Redirigimos la pagina 
    header("Location: admin/home.php");
    exit; 

0voto

yoclens comentado

perdona la molestia pero añado el link para ver en si cual es mi error, esta validar y mi perfil[(https://mega.nz/#!ckYTCLRJ!71Cg5TsSCNSEHVspEQDt2LWikORI9_npLjdRmE_-q7Y)]

0voto

Leonardo-Tadei comentado

Nos es imposible ejecutar tu código sin el resto de la aplicación, las tablas, etc, y lleva mucho tiempo ponerlo en marcha si nos enviaras todo el proyecto para poder debuguearlo :-(

Estás seguro de que $_SESSION['user']; y $_SESSION['password']; tienen los valores correctos?
Copianos y peganos un var_dump($_SESSION) ejecutado en el archivo que muestra el perfil para verlo.

Si ejecutás a mano (por ej en PHPMyAdmin) la query SELECT * FROM usuarios WHERE user = :user AND password = :password" reemplazando los parámetros por los valores en la sesión, te devuelve un registro?

0voto

yoclens comentado

resultado del var_dump

array(11) { ["id"]=> string(1) "1" ["user"]=> string(7) "yoclens" ["password"]=> string(12) "Yoclens2016-" ["idnivel"]=> string(13) "Administrador" ["Administrador"]=> string(12) "Yoclens2016-" ["cedula"]=> string(8) "14222789" ["nombres"]=> string(4) "jose" ["apellidos"]=> string(6) "camilo" ["email"]=> string(16) "[email protected]" ["telefono"]=> string(10) "2147483647" ["direccion"]=> string(11) "las colinas" } 

0voto

Leonardo-Tadei comentado

y el resultado de ejecutar a mano la query:

SELECT * FROM usuarios WHERE user = "yoclens" AND password = "Yoclens2016-"

que te devuelve???

0voto

yoclens comentado

MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas). (La consulta tardó 0.0023 segundos.)

0voto

Leonardo-Tadei comentado

Y existe un registro con esos datos en tu tabla???

0voto

yoclens comentado

ya lo pude resolver anexo como me quedo

<?php
//var_dump($_SESSION);
$user=$_SESSION['user'];
$password=hash('sha256', $_SESSION['password']);
$sql = "SELECT * FROM usuarios WHERE user = :user AND password = :password"; //Creamos la select
$perfil = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
$perfil->bindParam(':user',$user);//Substituimos las variables de la SELECT
$perfil->bindParam(':password',$password);//Substituimos las variables de la SELECT
$perfil->execute();//Ejecutamos la consulta
$_editar_linea = $perfil->fetch(PDO::FETCH_ASSOC);{
//print_r($DB_con->errorInfo());

?>
<!--fin proceso para consultar-->

1voto

Leonardo-Tadei comentado

Gracias por compartir la respuesta y cerrar el hilo!

Era entonces que no usabas las variables de sesión para esta query, y que además tenías que hacer la comparación contra el hash del sha256 de la clave.

Saludos cordiales

0voto

Peter comentado

Si esta es la solución por favor selecciona la respuesta como correcta.

Saludos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta