Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Utilizar datos de Consulta Parametrizada

Estas en el tema de Utilizar datos de Consulta Parametrizada en el foro de PHP en Foros del Web. Buenas queria ver si alguien podria ayudarme estoy parado hace horas con este codigo, para no decir dias. Estoy haciendo un login para usuarios, el ...
  #1 (permalink)  
Antiguo 28/11/2013, 15:07
 
Fecha de Ingreso: octubre-2011
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 1
Pregunta Utilizar datos de Consulta Parametrizada

Buenas queria ver si alguien podria ayudarme estoy parado hace horas con este codigo, para no decir dias.

Estoy haciendo un login para usuarios, el tema es que habia echo uno y me digieron que para que tenga seguridad tenia que parametrizar la consulta.

Lo hice o a caso creo a verlo echo, pero no me funciona. Me da error

El código es:

Código:
 
<?php
	
	if(isset($_POST['ingresar'])){		
	$usuario=$_POST['usuario'];
	$contrasena=$_POST['contrasena'];	
	
	
	$mysqli = new mysqli("localhost","user","password","database");
	if ($mysqli->connect_errno) {
		echo "Falló la conexión a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
	}
	
	/* Etapa 1: preparación */
	if (!($sentencia = $mysqli->prepare("SELECT * FROM tabla WHERE usuario = (?)"))) {
		echo "Falló la preparación: (" . $mysqli->errno . ") " . $mysqli->error;
	}
	
	
	/* Etapa 2: vincular*/ 
	if (!$sentencia->bind_param("s", $contrasena)) {
		echo "Falló la vinculación de parámetros: (" . $sentencia->errno . ") " . $sentencia->error;
	}
	
	/* Etapa 3 Ejecutar*/
	if (!$sentencia->execute()) {
		echo "Falló la ejecución: (" . $sentencia->errno . ") " . $sentencia->error;
	}
	

	$resultado = $mysqli->query($sentencia);
	
	$numeroregistro= $resultado->affected_rows;
	$registros = $resultado->fetch_assoc();

		if($numeroregistro>0){	
			$contrasenaDB=$registros['contrasena'];
			$salt_contrasenaDB=$registros['salt_contrasena'];
			
			
			// Encriptamos contraseña y comparamos
			
			if(crypt($contrasena, $salt_contrasenaDB) == $contrasenaDB){
				$estado_cuenta=$registros['estado'];
				if($estado_cuenta=="A"){
				 echo "Conexion Exitosa";
				$_SESSION['usuario']=$usuario;
				$_SESSION['login_ok']=1;	
				}
			}
			else{
				echo "Error de Conexion, compruebe su usuario y contraseña";
			}

		}else{
			echo "Error de Conexion, compruebe su usuario y contraseña";
		}
		
		
						
		}
	
	}
Desde ya gracias.

Última edición por Mati92_CPArg; 28/11/2013 a las 15:46
  #2 (permalink)  
Antiguo 28/11/2013, 16:08
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Utilizar datos de Consulta Parametrizada

No se te ocurra mostrar los errores de mysqli en la pantalla, o los intrusos podrán ver cómo está construida tu tabla si el servidor falla, por lo menos cuando pongas el código en producción (en funcionamiento real). Usa mensajes de error genéricos que no den pistas de nada.

La consulta no necesita () en los interrogantes, bórralos. Tampoco te recomiendo que uses el asterisco, por motivos que verás despues.
Código PHP:
Ver original
  1. $sentencia = $mysqli->prepare("SELECT contrasena, salt_contrasena FROM CP_usuarios WHERE usuario = ?");

Las consultas preparadas no se ejecutan con query. Se ejecutan con
Código PHP:
Ver original
  1. $sentencia->bind_result($contrasena, $salt);
Hay que poner una variable (no importa que no esté declarada) por cada campo que devuelva el select, en el mismo orden en el que los declaraste. Si usaras asterisco en la consulta, el asunto para recuperar los parámetros se complica mucho. No te digo cómo se hace porque te liarás. Mejor indicarlos como te he puesto.
Si la consulta devolviera muchas filas, se utiliza el bucle
while($sentencia->fetch()) { //blablabla }

Pero a tí te basta con ejecutarlo una vez, porque sólo se espera un resultado.
Código PHP:
Ver original
  1. $sentencia->fetch();

Y ya puedes empezar a utilizarlos:
Código PHP:
Ver original
  1. crypt($contrasena, $salt);

Aunque no estaría demás comprobar que la consulta te devolvió exactamente 1 resultado. Eso se hace con
Código PHP:
Ver original
  1. $sentencia->store_result();
Justo después del EXECUTE. Eso pasará los resultados de la consulta a un buffer, lo que permitirá consultar el número de filas devueltas con
Código PHP:
Ver original
  1. echo $sentencia->num_rows;
  #3 (permalink)  
Antiguo 28/11/2013, 17:42
 
Fecha de Ingreso: octubre-2011
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Utilizar datos de Consulta Parametrizada

Cita:
Iniciado por marlanga Ver Mensaje

Código PHP:
Ver original
  1. $sentencia = $mysqli->prepare("SELECT contrasena, salt_contrasena FROM CP_usuarios WHERE usuario = ?");

Pero a tí te basta con ejecutarlo una vez, porque sólo se espera un resultado.
Código PHP:
Ver original
  1. $sentencia->fetch();



No entiendo por que especifica contrasena y salt_contrasena, si necesito todos los datos del usuario

Código:
$sentencia = $mysqli->prepare("SELECT contrasena, salt_contrasena FROM CP_usuarios WHERE usuario = ?");
Y tampoco la linea, como llamaria los resultados :/

Código:
$sentencia->fetch()
  #4 (permalink)  
Antiguo 28/11/2013, 21:23
 
Fecha de Ingreso: octubre-2011
Mensajes: 20
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Utilizar datos de Consulta Parametrizada

Al fin logre que ande así quedo el código

Código:
	$usuario=$_POST['usuario'];
	$contrasena=$_POST['contrasena'];
	
	//conection:
	
	$mysqli = new mysqli("localhost","user","password","database");

	
	/* Etapa 1: preparación */
	$sentencia = $mysqli->prepare("SELECT contrasena, salt_contrasena FROM tabla WHERE usuario = ?");

	/* Etapa 2: vincular*/
	$sentencia->bind_param("s", $usuario);
	
	/* Etapa 3 Ejecutar*/
	$sentencia->execute();
	
	
	$sentencia->bind_result($contrasena_db, $salt_contrasena);
	$sentencia->store_result();
	$numero_filas = $sentencia->num_rows;

	
	while ($sentencia->fetch()) {
       $contrasenabase=$contrasena_db; 
	   $salt_contrasenabase=$salt_contrasena;
    }

Etiquetas: mysql, registro, select, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:21.