Ver Mensaje Individual
  #4 (permalink)  
Antiguo 16/02/2014, 12:16
helenp
 
Fecha de Ingreso: mayo-2009
Mensajes: 382
Antigüedad: 15 años
Puntos: 6
Respuesta: header o form en un include con ajax

El script es tan largo que no cabe.
He leido en este post y varios otros que no se puede usar header con Ajax,
Debe de hacerse la redirección desde el script ajax, pero no sé como:
http://www.daniweb.com/web-developme...cation-problem
Lo de meter un formulario no es lo mejor, lo correcto es un header, hace falta por si javascript esta desactivado, pero no me gusta usar ob_start etc.
Pego parte del codigo quitando HTML etc.

Primera pagina que tiene el incluye al php y al Ajax
Código PHP:
<?php
ini_set
("session.cookie_lifetime","3600");
ini_set("session.gc_maxlifetime","3600");
session_start();
header('Content-type: text/html; charset=utf-8'); 
if  ( !
$_SERVER['HTTPS'] )
        {
                
$host $_SERVER['HTTP_HOST'];
                
$request_uri $_SERVER['REQUEST_URI'];
                
$good_url "https://" $host $request_uri;

                
header"HTTP/1.1 301 Moved Permanently" );
                
header"Location: $good_url" );
                exit;
        }
$propiedad 'Bambo _1FE'
if(!isset(
$_SESSION['reservas'])){
$_SESSION['reservas'] = array();
}
include 
'../conexpdo.php';
    
?>
<?php
//anulamos reserva si reservado pero no pagado
if(isset($_SESSION['reservas']['paso4']['id'])){
 
$ids=$_SESSION['reservas']['paso4']['id'];
$query $dbh->prepare("SELECT id, statement from orders WHERE statement = 'unpaid' AND booked='booked' AND id = :ids");
$query->execute(array(
    
'ids' => $ids
)); 
  while (
$row $query->fetch()){           
$sql $dbh->prepare("DELETE FROM bookings WHERE id= :ids");
$sql->bindParam(':ids'$ids);
$sql->execute();
$sql $dbh->prepare("UPDATE orders SET booked='deleted' WHERE id = '$ids'");
$sql->bindParam(':ids'$ids);
$sql->execute();
unset(
$_SESSION['reservas']['paso4']['id']);
  }
//end while
  
}//end if isset id 

if(isset($_SESSION['reservas']['paso4']['nodisponible'])){
echo 
"<p class='red'>We are sorry, $propiedad has just been rented out and is not available for those dates anymore, please try some other dates. </p>";
unset(
$_SESSION['reservas']['paso4']);
    }
//end  no disponible
if(isset($_SESSION['reservas']['paso1'])){
unset(
$_SESSION['reservas']['paso1']);
}
if(isset(
$_SESSION['reservas']['paso2'])){
unset(
$_SESSION['reservas']['paso2']);
}
if(isset(
$_SESSION['reservas']['paso3'])){
unset(
$_SESSION['reservas']['paso3']);
}
?>
<form name="solicitud" class="formenquirer" id="solicitud" action="elecciones.php?propiedad=<?php echo $propiedad?>" method="post">
<input type="text" id="propiedad" name="propiedad" value="<?php print($propiedad); ?>">
        <p>Arrival: <?php include '../includes/day.php'?> php include '../includes/month.php'; ?>Departure: <?php include '../includes/day2.php'?> php include '../includes/month2.php'; ?> 
<p>Texto <br>
 <input name="percentage" class="required" type="radio" value="25"><br>
<input name="percentage" class="required" type="radio" value="50"> </p>    
 <p><input name="terms" class="required" type="checkbox" title="Please accept terms" value="terms">
</p>
<p><br><input class="boton roundedcorner border" size="10" type="submit" onClick="enviarDatosSolicitud();" name="enviar" id="enviar" value="Calculate/Check">
</p><br>
<?php
include 'calculadora.php';
    <
script type="text/javascript">
    
//Going to hide the formbutton and text since the above will work.
    
document.getElementById('enviar').type 'button';
    
document.getElementById('calc').style.display 'none';
</script>
<div id="resultado"> <!--calculadora ajax--> </div> 
</form>
<script type="text/javascript" src=" /ajaxcalculadora.js"></script>
Pagina php calculadora.php
Código PHP:
include '../conexpdo.php';
 if (isset(
$_POST['enviar'])){
if (!empty(
$percentage) && !empty($terms)) {    
if (
$salida $llegada){
$query $dbh->prepare("SELECT DATE_FORMAT(llegada, '%e %b %Y') as lleg, DATE_FORMAT(salida, '%e %b %Y') as sal,tiporeserva, propiedad, TO_DAYS(:salida) - TO_DAYS(:llegada) as dias from bookings where ( propiedad = :propiedad )
AND ((:llegada2 BETWEEN llegada AND date_sub(salida, interval +1 day)) 
or (:salida2 BETWEEN date_sub(llegada, interval -1 day) AND salida) or (llegada <= :llegada3 AND salida >= :salida3) or (llegada >= :llegada4 AND salida <= :salida4))"
);
$query->execute(array(
 
'salida' => $salida
     
'llegada' => $llegada
   
'propiedad' => $propiedad
    
'llegada2' => $llegada
    
'salida2' => $salida
    
'llegada3' => $llegada
        
'salida3' => $salida
    
'llegada4' => $llegada
    
'salida4' => $salida
    
)); 
$query->setFetchMode(PDO::FETCH_OBJ);
     if (
$row $query->fetch()) {
       if (
$row->tiporeserva=="larga"){ echo "<p>This property is available only for long term rentals, consult us for a price.</p>
"
; } 
else { 
$propiedad str_replace("_"" "$propiedad); 
echo 
"<p>$propiedad is not available from $arrival_display to $departure_display.</p>"
echo 
"<p>$propiedad is occupied from "$row->lleg ." until "$row->sal ."</p>"
}
 
}
//fin mirar si disponible query fetch
else{
header('Location: https://www.sitios.com/reservainstantanea.php');
}
//end else if available
  
}//end if salida mayor
 
else {echo "<span class=\"red\"><p>There is an error with the dates please try again, arrival: $arrival_display  and departure: $departure_display</p> </span>";} 
 }
//end if !empty form

 
else { echo "<p>Please fill in bookingoptions choosen (25% or 50%) and accept booking terms and conditions to proceed with the booking.</p>"; }
        }    
 
?> 
El archivo Ajax
Código Javascript:
Ver original
  1. // Función para recoger los datos de PHP según el navegador, se usa siempre.
  2. function objetoAjax(){
  3.     var xmlhttp=false;
  4.     try {
  5.         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  6.     } catch (e) {
  7.  
  8.     try {
  9.         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  10.     } catch (E) {
  11.         xmlhttp = false;
  12.     }
  13. }
  14.  
  15. if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  16.       xmlhttp = new XMLHttpRequest();
  17.     }
  18.     return xmlhttp;
  19. }
  20.  //Función para esconder el resultado al cambiar
  21.  function dataChanged() {
  22. document.getElementById("resultado").style.display = "none";
  23. }
  24. //Función para recoger los datos del formulario y enviarlos por post  
  25. function enviarDatosSolicitud(){
  26.   //div donde se mostrará lo resultados
  27. var divResultado = document.getElementById('resultado');
  28. divResultado.style.display = "block";
  29.   //recogemos los valores de los inputs
  30.   propiedad = document.solicitud.propiedad.value;
  31.   terms = document.solicitud.propiedad.value;
  32.   percentage = document.solicitud.propiedad.value;
  33.   day = document.solicitud.day.options[document.solicitud.day.selectedIndex].value;
  34.   day2 = document.solicitud.day2.options[document.solicitud.day2.selectedIndex].value;
  35.   month = document.solicitud.month.options[document.solicitud.month.selectedIndex].value;
  36.   month2 = document.solicitud.month2.options[document.solicitud.month2.selectedIndex].value;
  37.  
  38.   //instanciamos el objetoAjax
  39.   ajax=objetoAjax();
  40.  
  41.   ajax.open("POST", " calculadora.php ",true);
  42.   //cuando el objeto XMLHttpRequest cambia de estado, la función se inicia
  43.   ajax.onreadystatechange=function() {
  44.       //la función responseText tiene todos los datos pedidos al servidor
  45.     if (ajax.readyState==4) {
  46.         //mostrar resultados en esta capa
  47.         divResultado.innerHTML = ajax.responseText
  48.         //llamar a funcion para limpiar los inputs, en este caso no se hace
  49.         LimpiarCampos();
  50.     }
  51.  }
  52.     ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  53.     //enviando los valores a registro.php para que inserte los datos
  54.     ajax.send("propiedad="+propiedad+"&enviar="+enviar+"&day="+day+"&day2="+day2+"&month="+month+"&month2="+month2+"&percentage="+percentage+"&terms="+terms+"")
  55. }