Foros del Web » Programando para Internet » PHP »

PHP OO consulta a base de datos con if

Estas en el tema de consulta a base de datos con if en el foro de PHP en Foros del Web. Os agradezco de antemano si me echais un cable porque llevo días bloqueado y sin avanzar. Tengo un calendario con una hora de inicio y ...
  #1 (permalink)  
Antiguo 10/03/2012, 06:26
 
Fecha de Ingreso: abril-2010
Mensajes: 52
Antigüedad: 14 años, 7 meses
Puntos: 0
consulta a base de datos con if

Os agradezco de antemano si me echais un cable porque llevo días bloqueado y sin avanzar.

Tengo un calendario con una hora de inicio y una hora de final de reserva.
Me interesa que si ya hay una reserva previa no se pueda duplicar.

Por ejemplo si hay una reserva de 10h a 12h no se pueda hacer una reserva ni de 11h a 14h ni de 9h a 11 h., ni de 9 a 13h…etc.

Para ello hago un formulario y recojo la hora inicioPropuesta y la hora finalPropuesta
Consulta a la base de datos recojo los datos de las reservas hechas para esa fecha horaInicio y horaFinal y creo un if ton todos los condicionales:
Si la hora de inicioPropuesta es mayor que la horaInicio y la hora de inicioPropuesta es menor que la horaFinal…. Ya hay una reserva previa- por ejemplo.
Si no se cumplen todos los condicionales pasa a registrar la reserva a la base de datos

Hasta aquí todo es perfecto.

El problema es cuando tengo para el mismo día dos reservas en dos horarios.
Por ejemplo, el 7 de marzo tengo una reserva de:
10h a 14h
y otra
16h a 20h

Entonces si quiero entrar una reserva que no cumple la segunda condición, por ejemplo de 17h a 21h , como si cumple la primera ya salta a registrar a la base de datos.

Es decir que necesito que el condicional compruebe todas las reservas de ese día no solamente la primera. Que la condición sirva para todos los arrays pues puede no cumplir con una o con la otra y quiero que compruebe que no cumple con ninguna de las dos.


Aquí el código:


$iniciProposta = $_POST['horaInici'];
$finalProposta = $_POST['horaFinal'];
$carai = $_POST['data'];

mysql_select_db($database_cnxHotels, $cnxHotels);
$result=mysql_query("select * FROM reservaCataAgencies WHERE codi = '$carai' and tipoReserva = 'reserva'");
//Mostramos los registros
while ($row=mysql_fetch_array($result))
{
$horaInici=$row['horarioInicio'];
$horaFinal=$row['horarioFinal'];

if (($iniciProposta > $horaInici and $iniciProposta < $horaFinal) or ($finalProposta > $horaInici and $finalProposta < $horaFinal) or ($iniciProposta < $horaInici and $finalProposta > $horaFinal)) {
echo "ya hay una reserva";

} else {


if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf("INSERT INTO reservaCataAgencies (codi, horarioInicio, horarioFinal, tipoReserva, pax, agencia, lugarEmbarque, lugarDesembarque, reserva) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)",
GetSQLValueString($_POST['data'], "text"),
GetSQLValueString($_POST['horaInici'], "text"),
GetSQLValueString($_POST['horaFinal'], "text"),
GetSQLValueString($_POST['tipoReserva'], "text"),
GetSQLValueString($_POST['pax'], "text"),
GetSQLValueString($_POST['agencia'], "text"),
GetSQLValueString($_POST['embarc'], "text"),
GetSQLValueString($_POST['desembarc'], "text"),
GetSQLValueString($_POST['reserva'], "text"));

mysql_select_db($database_cnxHotels, $cnxHotels);
$Result1 = mysql_query($insertSQL, $cnxHotels) or die(mysql_error());

$insertGoTo = "index.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
  #2 (permalink)  
Antiguo 10/03/2012, 14:03
Avatar de xxxivanxxx  
Fecha de Ingreso: julio-2010
Ubicación: /home
Mensajes: 114
Antigüedad: 14 años, 3 meses
Puntos: 21
Respuesta: consulta a base de datos con if

si entiendo un poco:

Cita:
Entonces si quiero entrar una reserva que no cumple la segunda condición, por ejemplo de 17h a 21h , como si cumple la primera ya salta a registrar a la base de datos.
utiliza una bandera iniciada en "true" asumiendo que no hay ninguna recerva en ese horario, luego recorriendo todas las recervas de ese día, si no se cruza la dejas en true de lo contrario le pones false, y ya fuera del bucle WHILE comparas la bander y haces la insercion :)
  #3 (permalink)  
Antiguo 10/03/2012, 15:24
 
Fecha de Ingreso: abril-2010
Mensajes: 52
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: consulta a base de datos con if

Muchísimas gracias Ivan.

No acabo de comprender....cuando dices poner una bandera y que se cruce y luego comparar.....

Te agradezco si puedes explicarme un poco mas.
  #4 (permalink)  
Antiguo 11/03/2012, 10:58
Avatar de xxxivanxxx  
Fecha de Ingreso: julio-2010
Ubicación: /home
Mensajes: 114
Antigüedad: 14 años, 3 meses
Puntos: 21
Respuesta: consulta a base de datos con if

bueno aver aqui un poco de codigo:

Código PHP:
Ver original
  1. <?php
  2. $flag=true; //mi bandera :)
  3.  
  4. $result=mysql_query("select * FROM reservaCataAgencies WHERE codi = '$carai' and tipoReserva = 'reserva'");
  5. //Mostramos los registros
  6. while ($row=mysql_fetch_array($result))
  7. {
  8. $horaInici=$row['horarioInicio'];
  9. $horaFinal=$row['horarioFinal'];
  10.  
  11. if (($iniciProposta > $horaInici and $iniciProposta < $horaFinal) or ($finalProposta > $horaInici and $finalProposta < $horaFinal) or ($iniciProposta < $horaInici and $finalProposta > $horaFinal)) {
  12. $flag=false; //ya hay una recerva
  13.  
  14. } else {
  15. $falg=true;
  16. }
  17. } //fin while
  18.  
  19. if($flag){
  20.    mysql_query("INSERT INTO....");
  21. }
  22.  
  23.  
  24.  
  25. ?>
  #5 (permalink)  
Antiguo 11/03/2012, 11:23
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 1 mes
Puntos: 80
Respuesta: consulta a base de datos con if

Lo que quizas puedas hacer es consultar a la Base de datos primero para ver si ya existe una reserva en ese horario y dependiendo de eso insertar o no.

Código SQL:
Ver original
  1. SELECT COUNT(codi) AS cantidad FROM reservaCataAgencies
  2. WHERE (horarioInicio BETWEEN '2012-04-11 00:12:12' AND '2012-04-11 19:12:12') &&
  3.         (horarioFinal BETWEEN '2012-04-11 00:12:12' AND '2012-04-11 19:12:12')

Esa consulta tendria que dar 0 o 1, si da 0 no existe reserva entonces inserto, si da 1 existe reserva entonces no reservo.

Espero que te sirva de ejemplo.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #6 (permalink)  
Antiguo 16/03/2012, 14:05
 
Fecha de Ingreso: abril-2010
Mensajes: 52
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: consulta a base de datos con if

Muchas gracias por vuestra ayuda,
pero sigo en el mismo punto.

Ivan:

Usando las banderas sigue sin solucionarse el problema. El problema es el mismo.

Cuado voy a entrar una reserva nueva y quiero que filtre si ya hay una reserva en el mismo horario anterior solo funciona si hay solo una reserva si hay dos no las identifica. Supongo que es el uso del while el problema.

Por ejemplo:
Hay una reserva para ese dia de 10 a 14 h y otra de 16 a 20h
si voy a entrar una reserva nueva de 12 a 13h
me deja pasar, solo compara con una de las dos reserves previas.



Portalmana:

El uso de los between no veo que pueda funcionar, porque no tengo porque saber previamente entre que hora y fechas hay una reserva hecha con anterioridad.
Se trata de que consulte en la BD todas las reservas hechas y compare con la fecha y horario enviado en el formulario para que devuelva true or false.
  #7 (permalink)  
Antiguo 16/03/2012, 16:19
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 17 años, 1 mes
Puntos: 80
Respuesta: consulta a base de datos con if

y es eso justamente en el between pones la fecha y hora de inicio y fin de la reserva que se quiere hacer si te entrega uno ya existe reserva para el periodo, si da 0 puedes reservar....

La fecha y hora de la consulta es la nueva reserva.
Si ya me di cuenta de un HORROR jejje pero se podría arreglar la consulta con un or y un par de mayores e iguales
Código SQL:
Ver original
  1. SELECT COUNT(id_materia) AS cantidad FROM materias
  2. WHERE (fecha_inicial BETWEEN '2012-03-16 21:00:00' AND '2012-03-16 22:00:00') ||
  3.       (fecha_final BETWEEN '2012-03-16 21:00:00' AND '2012-03-16 22:00:00') ||
  4.       (fecha_inicial < '2012-03-16 21:00:00' AND fecha_final > '2012-03-16 22:00:00')
Creo que por ahí va la cosa

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 16/03/2012 a las 16:38
  #8 (permalink)  
Antiguo 17/03/2012, 17:15
 
Fecha de Ingreso: abril-2010
Mensajes: 52
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: consulta a base de datos con if

Solucionado. He usado las banderas y ha salido bien.

Muchísimas gracias Portalmana, Muchísimas gracias Ivan.

Etiquetas: formulario, mysql, registro, sql
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 14:15.