Foros del Web » Programando para Internet » PHP »

Problemas con consulta SQL

Estas en el tema de Problemas con consulta SQL en el foro de PHP en Foros del Web. Hola a todos, tengo un pequeño problema En mi DB tengo una tabla llamada tarifas, y dentro hay 5 campos que son - id_tarifa - ...
  #1 (permalink)  
Antiguo 22/06/2012, 11:38
 
Fecha de Ingreso: abril-2011
Mensajes: 67
Antigüedad: 13 años
Puntos: 6
Problemas con consulta SQL

Hola a todos, tengo un pequeño problema

En mi DB tengo una tabla llamada tarifas, y dentro hay 5 campos que son
- id_tarifa
- coche
- fecha_inicio
- fecha_fin
- p_1
- p_2, p_3, p_4, p_5, p_6, p_7, p_14

quiero hacer un sistema que calcula el precio del alquiler de un coche para las fechas escogidas por el cliente. si el periodo está en una unica tarifa no hay problema el sistema funciona correctamente, el problema es cuando pertenece a diferentes tarifa, que tambien funciona pero me coge la tarifa equibocada. le paso el código para que le puedan echar un vistazo

Código:
<?php
//Funcion para calcular precio del alquiler de coches.
function calcular_precio($recogida,$entrega,$coche){
	//declara $total como variable global	
	global $total;	
	$SacarTarifa = mysql_query("SELECT * FROM tarifas where coche='$coche' AND inicio<='$recogida' AND fin>='$entrega'", conectar()) or die(mysql_error());
	//Si el periodo de la reserva está comprendido entre el inicio y el fin de la tarifa aplicada
	if(mysql_num_rows($SacarTarifa)>=1){		
		$dataTarifa = mysql_fetch_array($SacarTarifa);
		//contar dias de la reserva
		$dias = abs((strtotime($entrega) - strtotime($recogida))/86400);
		//Aplicar los precios de la tarifa segun los dias elegidos
		switch ($dias){
			case "1": $total=$dataTarifa['p_1']; break;
			case "2": $total=$dataTarifa['p_2']; break;
			case "3": $total=$dataTarifa['p_3']; break;
			case "4": $total=$dataTarifa['p_4']; break;
			case "5": $total=$dataTarifa['p_5']; break;
			case "6": $total=$dataTarifa['p_6']; break;							
			case "7": $total=$dataTarifa['p_7']; break;						
			case "14": $total=$dataTarifa['p_14']; break;	
		}
		//si los dias son 8,9,10,11,12,13
		if(($dias>7)&&($dias<14)){
			$total=($dataTarifa['p_7']/7)*$dias;
		}
		//Si los dias son más de 14 dias
		if($dias>14){
			$total=($dataTarifa['p_14']/14)*$dias;
		}
	}
	//Si el periodo de la reserva tiene diferentes tarifas, saco el precio desde la tarifa donde se encuentra $recogida.
	else{
		$SacarTarifaM = mysql_query("SELECT * FROM tarifas where coche='$coche' AND inicio <= '$recogida'", conectar()) or die(mysql_error());
		$dataTarifaM = mysql_fetch_array($SacarTarifaM);
		$diasM = abs((strtotime($entrega) - strtotime($recogida))/86400);
                //aplico los precios
		switch ($dias1){
			case "1": $total=$dataTarifaM['p_1']; break;
			case "2": $total=$dataTarifaM['p_2']; break;
			case "3": $total=$dataTarifaM['p_3']; break;
			case "4": $total=$dataTarifaM['p_4']; break;
			case "5": $total=$dataTarifaM['p_5']; break;
			case "6": $total=$dataTarifaM['p_6']; break;							
			case "7": $total=$dataTarifaM['p_7']; break;						
			case "14": $total=$dataTarifaM['p_14']; break;	
		}
		if(($diasM>7)&&($diasM<14)){
			$total=($dataTarifaM['p_7']/7)*$diasM;
		}if($diasM>14){
			$total=($dataTarifaM['p_14']/14)*$diasM;
		}
	}
	//Devolver el total de la reserva
	return $total;
}
?>
cuando ejecuto el script con un periodo de varias tarifas siempre me saca la del primer campo de la tabla, aunque la tarifa correcta sea la última.

alguna recomendacion o sugerencia??
  #2 (permalink)  
Antiguo 22/06/2012, 12:05
 
Fecha de Ingreso: abril-2011
Mensajes: 67
Antigüedad: 13 años
Puntos: 6
Respuesta: Problemas con consulta SQL

gente problema recuelto, es verdad eso que en el baño lo ves todo claro... jajajaja

el código anterior era muy largo, lo he semplificado sólo con un if(){}

y es el siguiente:

Código PHP:
<?php
//Funcion para calcular precio del alquiler de coches.
function calcular_precio($recogida,$entrega,$coche){
    
//declara $total como variable global    
    
global $total;    
    
//contar dias de la reserva
    
$dias abs((strtotime($entrega) - strtotime($recogida))/86400);
    
$SacarTarifa mysql_query("SELECT * FROM tarifas where coche='$coche' AND inicio<='$recogida' AND fin>='$entrega'"conectar()) or die(mysql_error());
    if(
mysql_num_rows($SacarTarifa)<=0){        
        
//Si el periodo de la reserva tiene diferentes tarifas
        
$SacarTarifa mysql_query("SELECT * FROM tarifas where coche='$coche' AND fin>='$recogida'"conectar()) or die(mysql_error());
    }
    
$dataTarifa mysql_fetch_array($SacarTarifa);
    
//Aplicar los precios de la tarifa segun los dias elegidos
    
switch ($dias){
        case 
"1"$total=$dataTarifa['p_1']; break;
        case 
"2"$total=$dataTarifa['p_2']; break;
        case 
"3"$total=$dataTarifa['p_3']; break;
        case 
"4"$total=$dataTarifa['p_4']; break;
        case 
"5"$total=$dataTarifa['p_5']; break;
        case 
"6"$total=$dataTarifa['p_6']; break;                            
        case 
"7"$total=$dataTarifa['p_7']; break;                        
        case 
"14"$total=$dataTarifa['p_14']; break;    
    }
    
//si los dias son 8,9,10,11,12,13
    
if(($dias>7)&&($dias<14)){
        
$total=($dataTarifa['p_7']/7)*$dias;
    }
    
//Si los dias son más de 14 dias
    
if($dias>14){
        
$total=($dataTarifa['p_14']/14)*$dias;
    }
    
//Devolver el total de la reserva
    
return $total;
}
?>
el problema era que siempre me seleccionaba la primera tarifa, porque es la que tiene fecha inicio menor de todas y por eso siempre la coge, lo que he hecho fue cambiar inicio por fin en la consulta con if() y puuum problema resuelto...

gracias por su interes
  #3 (permalink)  
Antiguo 22/06/2012, 12:11
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Problemas con consulta SQL

Algunas anotaciones: usa números en el caso, no cadenas
case "1": -> case 1:

No necesitas duplicar el código de tu case

Código PHP:
Ver original
  1. <?php
  2. //Funcion para calcular precio del alquiler de coches.
  3. function calcular_precio($recogida,$entrega,$coche){
  4.     //declara $total como variable global  
  5.     global $total; 
  6.     $SacarTarifa = mysql_query("SELECT * FROM tarifas where coche='$coche' AND inicio<='$recogida' AND fin>='$entrega'", conectar()) or die(mysql_error());
  7.     //Si el periodo de la reserva está comprendido entre el inicio y el fin de la tarifa aplicada
  8.     if(mysql_num_rows($SacarTarifa)){      
  9.         $dataTarifa = mysql_fetch_array($SacarTarifa);
  10.         //contar dias de la reserva
  11.         $dias = abs((strtotime($entrega) - strtotime($recogida))/86400);
  12.     }
  13.     //Si el periodo de la reserva tiene diferentes tarifas, saco el precio desde la tarifa donde se encuentra $recogida.
  14.     else{
  15.         $SacarTarifa = mysql_query("SELECT * FROM tarifas where coche='$coche' AND inicio <= '$recogida'", conectar()) or die(mysql_error());
  16.         $dataTarifa = mysql_fetch_array($SacarTarifaM);
  17.         $dias = abs((strtotime($entrega) - strtotime($recogida))/86400);
  18.     }
  19.                 //aplico los precios
  20.     switch ($dias1){
  21.         case 1: $total=$dataTarifa['p_1']; break;
  22.         case 2: $total=$dataTarifa['p_2']; break;
  23.         case 3: $total=$dataTarifa['p_3']; break;
  24.         case 4: $total=$dataTarifa['p_4']; break;
  25.         case 5: $total=$dataTarifa['p_5']; break;
  26.         case 6: $total=$dataTarifa['p_6']; break;                          
  27.         case 7: $total=$dataTarifa['p_7']; break;                      
  28.         case 14: $total=$dataTarifa['p_14']; break;
  29.     }
  30.     if(($diasM>7)&&($diasM<14)){
  31.         $total=($dataTarifaM['p_7']/7)*$diasM;
  32.     }if($diasM>14){
  33.         $total=($dataTarifaM['p_14']/14)*$diasM;
  34.     }
  35.     //Devolver el total de la reserva
  36.     return $total;
  37. }
  38. ?>

Etiquetas: mysql, sql, tabla, variables
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 09:35.