problemi calcolo prezzo

pinoshine

Utente Attivo
15 Set 2012
95
0
0
Ciao a tutti, sto cercando di modificare uno script che mi calcola il prezzo di un hotel in base alla ricerca effettuata tra differenti date, lo script funziona bene solo che mi restituisce il totale del prezzo solo sull'ultimo prezzo inserito vi faccio un'esempio: ho la tabella prezzi con id,id_hotel, from, to, room_type, price, ho queste date: dal 10-05-13 al 12-05-13 il prezzo 100 poi dal 12-0513 al 14-05-13 il prezzo 50, se effettuo una ricerca dal dal 11 al 13 maggio invece di calcolare 150 mi calcola 100 praticamente ricava solo il valore dell'ultimo prezzo:
questo e' il codice:
PHP:
<?php
	session_start();
	if(!isset($_GET['hid'])){
		header("Location:index.php");
	}
	if(!isset($_SESSION['to'])||!isset($_SESSION['from'])){
		header("Location:index.php");
	}
	if($_SESSION['to']<=$_SESSION['from']){
		header("Location:index.php");
	}
	include "includes/configuration.php";
	$con=mysql_connect($location,$username,$password);
	mysql_select_db($database_name);
	mysql_set_charset('utf8',$con);
	include "includes/database_add.php";
	include "includes/language.php";
	//Set language
	if(isset($_GET['lang'])){
		$_SESSION['lang']=$_GET['lang'];
		$lang=$_SESSION['lang'];
	}else if(isset($_SESSION['lang'])){
		$lang=$_SESSION['lang'];
	}else{
		$lang="English";
	}
	//end of set language
	$query="DELETE * FROM book WHERE expires<'".date("Y-m-d H:i:s")."'";
	mysql_query($query);
?>
<?php
	$query="SELECT * FROM roomtypes WHERE hotel_id=".$_GET['hid'];
	$roomsresult=mysql_query($query);
	$roomsnum=mysql_num_rows($roomsresult)-1;
	$query="SELECT * FROM hotel JOIN countries ON hotel.country_id=countries.id JOIN cities ON hotel.city_id=cities.id WHERE hotel_id='".$_GET['hid']."'";
	$result=mysql_query($query);
	$info=mysql_fetch_array($result);
?>
var roomnum=<?php echo $roomsnum;?>;
</script>

</head>

<body>
<div id="maincontent">
	<h1><?php echo $info['name'];?></h1>
	<div id="address">
		<?php echo $info['hotel_address'].",".$info['city'].",".$info['country'];?>
	</div>
	<div id="fields">
		<div id="roomsfields">
		<table width="100%">
			<tr style="font-weight:bold"><td><?php echo get_word($lang,"Room Type")."</td><td>".get_word($lang,"Available Rooms")."</td><td>".get_word($lang,"Price")."</td><td>".get_word($lang,"No of Rooms")."</td>";
			$i=0;
			$roomsbooked=array();
			$ratestable=array();
			$query="SELECT * FROM roomtypes WHERE hotel_id='".$_GET['hid']."'";
			$result=mysql_query($query);
			while($row=mysql_fetch_array($result)){
				$roomsbooked[$row['room_type']]=0;
				for($i=0;$i<8;$i++)
					$ratestable[$row['room_type']][$i]=0;
			}
			 $from = $_GET['from'];
			  $to = $_GET['to'];
           $hotel_id = $_GET['hid'];

$query = "SELECT id_hotel, room_type, price, (DATEDIFF($to, $from)  * price) as total FROM rooms";
		   
			$result=mysql_query($query);
			while($row=mysql_fetch_array($result)){
				$ratestable[$row['room_type']][0]=$row['price'];
				
			}
			$from=array();
			$tok=strtok($_SESSION['from'],"-");
			while($tok){
				$from[]=$tok;
				$tok=strtok("-");
			}
			$to=array();
			$tok=strtok($_SESSION['to'],"-");
			while($tok){
				$to[]=$tok;
				$tok=strtok("-");
			}
			$query="SELECT * FROM book WHERE hotel_id='".$_GET['hid']."' AND 
			((check_in<='".$from[2]."-".$from[1]."-".$from[0]."' AND check_out>='".$from[2]."-".$from[1]."-".$from[0]."') OR
			(check_in>='".$from[2]."-".$from[1]."-".$from[0]."' AND check_out<='".$to[2]."-".$to[1]."-".$to[0]."') OR
			(check_in<='".$from[2]."-".$from[1]."-".$from[0]."' AND check_out>='".$to[2]."-".$to[1]."-".$to[0]."') OR
			(check_in<'".$to[2]."-".$to[1]."-".$to[0]."' AND check_out>='".$to[2]."-".$to[1]."-".$to[0]."'))";
			$result=mysql_query($query);
			while($row=mysql_fetch_array($result)){
					$roomsbooked[$row['room_type']]++;
			}
			while(($row=mysql_fetch_array($roomsresult))!=NULL){
				$roomsleft=$row['rooms_number']-$roomsbooked[$row['room_type']];
				echo "<tr><td>".$row['room_type']."</td><td>".$roomsleft."</td>";
				
				$price=0;
				$_SESSION['totaldays']=0;
				$date=strtotime($from[2]."-".$from[1]."-".$from[0]);
				while($date<strtotime($to[2]."-".$to[1]."-".$to[0])){
					$_SESSION['totaldays']++;
					$dayofweek=date("N",$date);
					if($ratestable[$row['room_type']][$dayofweek]!=0)
						$price+=$ratestable[$row['room_type']][$dayofweek];
					else
						$price+=$ratestable[$row['room_type']][0];
					$date+=86400;
				}
				echo "<td><div id=\"price".$row['room_type']."\">".$price."</td></div>";
				?>
				<form name="roomsform" id="roomsform" method="POST" action="bookroom.php?roomtype=<?php echo $row['room_type']."&hid=".$_GET['hid']; ?>">
				<?php
				if($roomsleft<=0)
					$disabled="disabled";
				else
					$disabled="";
				echo "<td><select name=\"numberofrooms".$row['room_type']."\"  style=\"width:40px\" ".$disabled." id=\"numberofrooms".$row['room_type']."\" onchange=\"getPrice(this.value,".$price.",'".$row['room_type']."');\">";
				$_SESSION['price'.$row['room_type']]=$price;
				for($i=1;$i<=$roomsleft;$i++){
					echo "<option value=\"".$i."\">".$i."</option>";
				}
				echo "</select></td>";
				
				echo "<td><input type=\"submit\" ".$disabled." name=\"submit".$row['room_type']."\" id=\"submit".$row['room_type']."\" value=\"".get_word($lang,"Book!")."\"></td>";
				echo "</tr>";
				echo "</form>";
			}
			?>
				
		</table>
		</table>
		</div>
	</div>
	<div style="clear:both"></div>
</div>
<?php
	mysql_close($con);
?>
Non riesco prorpio a capire dove e' lo sbaglio
Grazie
 
ho cambiato la query in questo modo:
PHP:
$query = "SELECT room_type, 
                 SUM(price) total
            FROM rooms
           WHERE from >= '$from' 
             AND to <= '$to'
             AND id_hotel = $hotel_id
           GROUP BY room_type";

ma purtroppo non funziona mi da questo errore: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in \gethotel.php on line 162 la linea e' questa:
PHP:
while($row=mysql_fetch_array($result)){
proprio non riesco ad uscirne!!
 
Grazie per la risposta, ma non vuole funzionare mi da come risultato 0 e non mi moltiplica i prezzo per i giorni!! se scrivo questa query funziona ma mi calcola il prezzo in base alla quantità di giorni e non in base alla data sceta come vorrei fare io
PHP:
$query="SELECT * FROM rates WHERE hotel_id='".$_GET['hid']."'";
non riesco prorpio a capire forse è qui' il problema?
PHP:
$result=mysql_query($query);
			while($row=mysql_fetch_array($result)){
				$ratestable[$row['room_type']][0]=$row['default_price'];

Grazie

EDIT: Forse devo recuperare i valori 'from' e 'to' con un 'session' ?
 
Ultima modifica:
Mi sono accorto che ho fatto un errore ed Ho corretto
PHP:
$result=mysql_query($query);
            while($row=mysql_fetch_array($result)){
                $ratestable[$row['room_type']][0]=$row['price'];
ma la query continua a nn funzionare, non mi recupera i giorni dal from e to, ce' un modo per recuperarli?
Grazie
 
Sto impazzendo con questa query che non vuole proprio funzionare!! ho aggiunto all'apertura della pagina sotto
PHP:
session_start();
questo
PHP:
$_SESSION['from']=$_GET['from'];
	$from=$_SESSION['from'];
	$_SESSION['to']=$_GET['to'];
	$to=$_SESSION['to'];
ed ho cambiata la quesry cosi':
PHP:
$query = "SELECT hotel_id, room_type, default_price, ((DATEDIFF($to, $from) + 1) * default_price) as total FROM rates WHERE $from >='to' AND $to <= 'from'";
e mi da come risultato sempre 0 :mad: se tolgo questo:
PHP:
WHERE $from >='to' AND $to <= 'from'
mi da come risultato solo l'ultimo prezzo inserito invece di calcolarlo in base alla data richiesta
ragazzi un piccolo aiuto vi prego!!! :(
 
Ciao, prova a mettere le date tra apici
PHP:
DATEDIFF('$to', '$from')
senza la funzione restituisce NULL
puoi testarla su phpmyadmin in questo modo
cosi non va
Codice:
select DATEDIFF(2013-05-30, 2013-05-28)
cosi si
Codice:
select DATEDIFF('2013-05-30', '2013-05-28')
 
grazie per la risposta, ma continua a non andare, ho cambito come mi hai consigliato ma continua a trovare il risultato sbagliato ignorando la query ma che casino!!
nella barra dell'indirizzo mi da questo risultato
Codice:
www.miosito.com/gethotel.php?hid=1&from=30-05-2013&to=31-05-2013
mi sono accorto solo adesso che la formattazione della data e' sbagliata ho controllato il file java ma sta scritta benecioe' yyyy-mm-dd tu che dici?
 
Ultima modifica:
stampa la query per vedere come esce
PHP:
echo $query;
 
stampa la query per vedere come esce
PHP:
echo $query;

Ciao, scusa il ritardo ma stavo senza internet :p la query ma stampa questo:
Codice:
SELECT hotel_id, room_type, default_price, ((DATEDIFF(01-06-2013, 03-06-2013) + 1) * default_price) as total FROM rooms
praticamente mi da come risultato la query che ho scritto, pero' invece del $from, $to mi da le date che ho scelto nel form di ricerca, qualche idea?
Grazie
 
Ultima modifica:
Ho cambiato nuavamente la quesry:
PHP:
$query = "SELECT 
    hotel_id, room_type, SUM(total) as total_sum 
FROM 
(
    SELECT 
        hotel_id, 
        room_type,
        default_price, 
        (DATEDIFF('$from', '$to') * default_price) as total 
    FROM 
        rates
) as t 
GROUP BY 
    hotel_id, room_type";
la quesry non da errori pero' ho riscontrato uno su questo codice
PHP:
$ratestable[$row['room_type']] =$row['default_price'];
Praticamente non mi vuole stampare il prezzo calcolato nella quesry come lo posso recuperarlo?
Grazie

Edit: ho cambiato cosi' per stampare il risultato :
PHP:
$ratestable[$row['room_type']] = $result['total'];
non mi da errori ma nn mi stampa niente!!! mammamia che casino !!!
 
Ultima modifica:
riprendendo l'echo della query
SELECT hotel_id, room_type, default_price, ((DATEDIFF(01-06-2013, 03-06-2013) + 1) * default_price) as total FROM rooms
il primo errore è che non hai messo gli apici, cos che in teoria hai risolto con la query sucessiva

il secondo errore è nel formato delle date, mysql vuole una formattazione ben precisa : aaaa-mm-gg
 
L'avevo pensato gia' un po' di tempo fa la formattazione delle date poi me ne ero del tutto dimenticato, adesso aggiusto il calendario java per la formattazione e provo nuovamente la quesry, cmq la query sta scritta bene?
Grazie per l'aiuto!!!
 
Grazie per l'aiuto, adesso la quesry funziona in parte ti spiego: la quesry e' questa:
PHP:
$query = "SELECT hotel_id, room_type, default_price, ((DATEDIFF('$to', '$from') + 1 ) *  default_price) as total FROM rates ";
mi trova il risultato pero' e tutto sballato ti faccio un esempio, ho 2 date una va dal 01 al 03 giugno e il prezzo è 50,00 la seconda data val dal 03 al 06 giungo ed il prezzo è 100,00 se faccio una ricerca dal 02 al 04 mi esce questo come risultato della quesry che stampo a video per vedere se funziona questo:
Codice:
SELECT hotel_id, room_type, default_price, ((DATEDIFF('2013-06-04', '2013-06-02') + 1 ) * default_price) as total FROM rates 150
ed e' corretto perche ho un giorno con 50 e l'altro con 100 pero' come risultato che mi da dopo il ciclo while che e lo stampo con :
PHP:
$ratestable[$row['room_type']][0]=$record['total'];
è 300 mi fa 150 della query moltiplicato x 2 che casino!!
 
ciao
scusate se intervengo e se, non avendo seguito tutto il 3d, posso dire delle ca...te
prima una piccola osservazione, tu dici:
...ho 2 date una va dal 01 al 03 giugno e il prezzo è 50,00 la seconda data val dal 03 al 06 giungo ed il prezzo è 100,00...
non so se è un errore di scrittura, ma il 03 giugno la stanza costa 50 o 100?

detto questo dici che se fai la query tra il 02 e lo 03 il prezzo deve essere 50+100=150 ma dopo il while trovi 300 cioè 150*2 o 150+150.
prova a fare una prova su tre gg es da 02 al 04, in questo caso il prezzo dovvrebbe essere 50+100+100=250, se ti risulta dopo il while 250+3=250+250+250=750
vuol dire che dentro il while ti somma tale prezzo ad ogni ciclo, mettendo dei var_dump o degli echo dentro il while cerca di individuare dove ti capita tale somma iterata
 
Ciao e grazie per l'intervento, purtroppo rispondo tardi per lavoro di notte e di giorno purtroppo dormo!! :cool: cmq mi ero espresso male dal 01 al 03 (il 03 e'compreso) il prezzo è di 50,00 e dal 04 al 07 (07 e' compreso) il prezzo e di 100 facendo la quesry come mi hai consigliato il prezzo dovrebbe essere 02 e 03 di 50,00 e per il 04 100 quindi riassumendo 50+50+100= 200 la query mi riporta questo:
Codice:
SELECT hotel_id, room_type, default_price, ((DATEDIFF('2013-06-05', '2013-06-02') + 1 ) * default_price) as total FROM rates 200
la query come si vede e' corretta, invece nel ciclo while mi da 600 io non riesco a capire se me li moltiplica oppure me li addiziona e troppo strano!!! ma come posso fare per stampare il ciclo While?
Grazie

Edit: vi allego una foto: foto.gif
 
Ultima modifica:
ciao
secondo me, a lume di naso, il problema potrebbe stare qui
fai la query
SELECT hotel_id, room_type, default_price, ((DATEDIFF('2013-06-05', '2013-06-02') + 1 ) * default_price) as total FROM rates
dove estrai il prezzo della giornata moltiplicato per il numero dei gg
poi, almeno così mi sembra, nel while rifai la somma
$price+=$ratestable[$row['room_type']][$dayofweek]; (o l'altro dopo nell'else)

cioè comunque il qualche punto dello script stai facendo un errore di "logica" e spesso gli errori di logica sono molto più difficile da individuare di quelli di sintassi.
 
Cosa difficile allora da individuare!! quindi nn e' un problema di query, almeno cosi' posso gia' escludera!! grazie
 
Borgo ha ragione
però bisogna cambiare la query, prova questa
PHP:
$query = "SELECT hotel_id, room_type, SUM(default_price) as total 
                 FROM rates WHERE date BETWEEN '$from' AND '$to'";
 
Ultima modifica:
Grazie ma non funziona mi riporta questo errore:
Codice:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in gethotel.php on line 153
che la linea 153 e' questa:
PHP:
while($row=mysql_fetch_array($result)){
la vedo molto dura!!!
 

Discussioni simili