PHP script di prenotazione automezzi

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
Buongiorno, ho la necessità di creare un applicativo php, che mi permetta di noleggiare ad una certa data, degli automezzi aziendali. Ho un piccolo problema con la prenotazione degli orari, mi spiego meglio con un esempio:

Mario rossi prenota l'auto alle 10.24 del 10/11/2015 e la riporta alle 12.10 dello stesso giorno, come posso impostare lo script in modo che Paolo Bianchi, non possa prenotare l'auto fino alle 12.20 (calcolando un margine di ritardo nella consegna di 10 minuti dovuto a contrattempi), dello stesso giorno?

Esiste un un metodo sicuro?

Io avevo ipotizzato semplicemente di inserire i dati in un database, e di fare una select che impedisse la prenotazione se gli orari passati tramite form di prenotazione erano già presenti nel database.

é corretto c'é un metodo migliore?

Grazie.
 

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
Vi posto il codice utilizzato - premetto che non funziona -

la tabella mysql
PHP:
CREATE TABLE IF NOT EXISTS `lista_automezzi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cod` varchar(255) NOT NULL DEFAULT '',
  `automezzo` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
l'inserimento dei dati la tabella viene presa da un calendario di cui non sto a postarvi il codice:

PHP:
<?php

include 'config.php';

if (isset($_POST['submit']) && $_POST['submit']=="invia")
{


  // imposto variabili

   $codice = $_GET['cod'];
   
   $giorno= $_GET['day'];
   
   $dataok = addslashes($_POST['dataok']);
   
   $codicem = addslashes($_POST['codicem']);
   
    $sedelav= addslashes($_POST['sedelav']);
	
	$nomeut= addslashes($_POST['nomeut']);
  

   $data = addslashes($_POST['g']);

    $dataprenota_fine = addslashes($_POST['dataprenota_fine']);

    $ora_inizio = addslashes($_POST['orario_inizio']);

    $ora_fine = addslashes($_POST['orario_fine']);

    $minuto_inizio = addslashes($_POST['minuto_inizio']);

    $minuto_fine = addslashes($_POST['minuto_fine']);

    $nome = addslashes($_POST['nome']);

    $sede = addslashes($_POST['sede']);

    $str_data = strtotime($_POST['dataok']);


    // lavoro sull'ora
  
  // hh_inizio é l'ora in cui la macchina viene prelevata
  
  // hh_fine é l'ora in cui la macchina viene consegnata

  $hh_inizio = $ora_inizio.":".$minuto_inizio.":"."00."."000000";

  $hh_fine = $ora_fine.":".$minuto_fine.":"."00."."000000";


  // preparo per l'insert
  
  echo "<table width=\"100%\"  border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
  <tr>
    <td width=\"33%\">Orario ritiro</td>
    <td width=\"1%\">&nbsp;</td>
    <td width=\"66%\"> Orario consegna </td>
  </tr>
  ";

  
  // controllo se le date e gli orari passati dal form esistono già
  
  $query = 
  "SELECT * FROM prenotazioni WHERE `data_r` BETWEEN '$dataok' AND '$dataprenota_fine' 
  AND `orario_ritiro` = '$hh_inizio' AND `orario_consegna` = '$hh_fine' ORDER BY id";




$result = mysql_query($query);








if (mysql_num_rows($result)==0) 


// se nn ce nulla inserisco la prenotazione

{ 


$sql = "INSERT INTO prenotazioni (cod, str_data, nominativo, sede, orario_ritiro, orario_consegna, data_r, data_c  )
  VALUES ('$codice','$str_data', '$nome', '$sede', '$hh_inizio', '$hh_fine', '$dataok', '$dataprenota_fine')";
  if($result = mysql_query($sql) or die (mysql_error()))
  {
    echo "Inserimento avvenuto con successo.<br>
    Vai al <a href=\"index.php\">Calendario</a>";

	echo $giornata1; echo "<br>";

  }



 }



else {

while($row = mysql_fetch_array($result))

// altrimenti comunico all'utente che la macchina é già impegnata.
     {
echo "<tr>
<td>$row[orario_ritiro]</td>
    <td>&nbsp;</td>
    <td>$row[orario_consegna]</td>
  </tr>";
	 
	 
	 } }
	 
echo"</table>";
 

}else{
  ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">



Data ritiro:<br>
<?php


$codice = $_GET['cod'];

$giorno = $_GET['day'];

$giorn = $_POST['giorno'];

echo "<input name=\"giorno\" type=\"text\" value=\"$giorno\" id=\"giorno\">"; echo "<br><hr>";

echo "<input name=\"codice\" type=\"text\" value=\"$codice\" id=\"codice\">"; echo "<br><hr>";

 ?><br><hr>
Data di riconsegna:<br>
<input name="dataprenota_fine" type="text" id="dataprenota_fine"><br><hr>
Orario di ritiro<br>
<input name="orario_inizio" type="text" id="orario_inizio" value="00" size="5">
  (ore - hh)  :
    <input name="minuto_inizio" type="text" id="minuto_inizio" value="00" size="5"> (minuti - mm)<br><hr>
	Orario di riconsegna<br>
<input name="orario_fine" type="text" id="orario_fine" value="00" size="5">
(ore - hh) :
    <input name="minuto_fine" type="text" id="minuto_fine" value="00" size="5"> (minuti - mm)<br><hr>
Nominativo:<br>
<input name="nome" type="text" id="nome"><br><hr>
Sede:<br>
<input name="sede" type="text" id="sede"><br><hr>
<br>
<input name="submit" type="submit" value="invia">
</form>
  <?php
}
?>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto farei un'altra tabella se non l'hai già fatta
tabella prenotazioni
id int (9) primarykey autonincrement
id_auto int(11) notnull //lega alla tabella elenco_automezzi
inizio
fine

non ti do il tipo di campo perche dipende da come formatti le date, io generalmente per le date uso int(13) perche nel db salvo le date in timestamp
comunque questo potrebbe essere uno schema che dovrebbe funzionare così
rossi prenota dalle 09 alle 13 la 500
bianchi non puo prenotare la 500 dalle 09 alle 13, o prenota la ferrari o cambia orario, sceglie es. dalle 18 alle 24
verdi può prenotare la 500 dalle 00 alle 09 o dalle 13 alle 18

ho diviso il problema in due parti:
prima l'utente fornisce l'orario
se ci sono si visualizzano le auto disponibili e l'utente sceglie l'auto aggiornando quindi la tabella prenotazioni
PHP:
<?php
if(isset($_POST['orario'])){
	$inizio_richiesta=$_POST['inizio'];
	$fine_richiesta=$_POST['fine'];
	$auto_libera=array();
	$auto_occupata=array();
	$disponibili=array();
	$ris=mysql_query("SELECT * FROM prenotazioni");
	if(mysql_num_rows(%ris)==0){
		//non ci sono prenotazioni tutte le auto disponibili
		$select="SELECT * FROM lista_automezzi";
	}else{
		//cerco le disponibili in modo che non ci siano interferenze
		while($riga=mysql_fetch_array($ris)){
			$id_auto=$riga['id_auto'];
			$i=$riga['inizio'];
			$f=$riga['fine'];
			if(($inizio_richiesta < $i && $fine_richiesta > $i) || ($inizio_richiesta > $f && $fine_richiesta > $f)){
				$auto_libera[]=$id_auto;
			}else{
				$auto_occupata[]=$id_auto;
			}
		}
		//le auto disponibili sono quelle che non interferiscono
		$disponibili=array_diff($auto_libera, $auto_occupata);
		$select="SELECT * FROM lista_automezzi WHERE id IN '".implode("','",$disponibili)."'";
	}
	$ris=mysql_query($select);
?>
	scegli auto<br>
	<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="scegli_auto">
	<input name="ini" type="hidden" value="<?php echo $inizio_richiesta; ?>">
	<input name="fin" type="hidden" value="<?php echo $fine_richiesta; ?>">
<?php
	while($riga=mysql_fetch_array($ris)){
		$id=$riga['id'];
		$cod=$riga['cod'];
		$automezzo=$riga['automezzo'];
		echo "$cod: $automezzo <input name='id_auto' type='radio' value='$id'><br>";
	}
?>
	<input name="scegli" type="submit" id="scegli" value="scegli">
	</form>
<?php
	if(isset($_POST['scegli'])){
		//leggi i post e fai l'insert in tabella prenotazioni
		//qui metterie anche una pulizia in automatico della tabella prenotazioni
		//cancellando i record con data fine minore dell'odierna
		//rimandi dove vuoi
	}
}else{
?>
<form name="orario" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
	data inizio <input type="text" name="inizio"><br>
	data fine <input type="text" name="fine"><br>
	<input name="orario" type="submit" id="orario" value="prenota">
</form>
<?php
}
?>
guarda che ho messo il form orario senza considerare a come sono formattate le date, ma solo per indicazione
non l'ho provato avendolo buttato giù di getto e quindi non so se funziona e se ci possano essere altre soluzioni
 

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
solo una cosa borgo italia cosa intendi quando dici
PHP:
//qui metterie anche una pulizia in automatico della tabella prenotazioni
        //cancellando i record con data fine minore dell'odierna
postresti postare il codice? grazie1000
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
PHP:
<?php
//.....
$oggi=time();//o $oggi=date(formattazione) con la formattazione che usi
$query=mysql_query("DELETE prenotazioni WHERE fine < '$oggi'");
//....
?>
con quella cancelli tutte le prenotazioni in cui le macchine devono essere gia state riconsegnate
cioe se la fine di una prenotazione è es. 18/11/2015 11:35:00 e oggi è il 19 è inutile tenere un record che non serve più
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao dimenticavo
guarda che è importante a come formatti e salvi le date.
ti faccio un esempio, tralasciando le ore e minuti
formato italiano gg mm aa
data_1 = 13/11/2015
data_2 = 22/10/2015
a naso è evidente che data_1 > data_2, ma per php data_2 > data_1
se invece le formatti così
formato iso aa mm gg
data_1 = 2015/11/13
data_2 = 2015/10/22
noi italiani non siamo abituati a quella forma, ma php in quel modo fa i confronti giusti
 

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
Mentre il l'insert sotto

PHP:
//leggi i post e fai l'insert in tabella prenotazioni
sarà una cosa del genere
PHP:
$query = "INSERT INTO prenotazioni (id,id_auto,inizio,fine)
		VALUES (null, '$id_auto', '$inizio_richiesta', '$fine_richiesta')";

// lancio la query
$result = mysql_query($query);

// controllo l'esito
if (!$result) {
	die("Errore nella query $query: " . mysql_error());
}

// chiudo la connessione a MySQL
mysql_close();

echo 'inserimento completato';
correggimi se sbaglio
 
Ultima modifica:

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
ok grazie, si la questione date la vedo io, volevo solo sapere se nel post sopra é giusto o devo fare anche una select?
 

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
ciao ho provato lo script con le seguenti date
PHP:
inizio 01-10-2015 10:13:07
PHP:
fine 01-10-2015 12:13:07
i database che ho creato sono i seguenti
PHP:
CREATE TABLE IF NOT EXISTS `lista_automezzi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_auto` int(11) NOT NULL,
  `automezzo` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dump dei dati per la tabella `lista_automezzi`
--

INSERT INTO `lista_automezzi` (`id`, `id_auto`, `automezzo`) VALUES
(1, 1, 'panda'),
(2, 2, 'marea');


CREATE TABLE IF NOT EXISTS `prenotazioni` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_auto` int(11) NOT NULL,
  `inizio` int(13) NOT NULL,
  `fine` int(13) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


e all'avvio mi genera questo errore
PHP:
Parse error: syntax error, unexpected '%', expecting ')' in G:\EasyPHP\data\localweb\TEST.php on line 11
su questa riga
PHP:
if(mysql_num_rows(%ris)==0)
ho provato a correggere in
PHP:
if(mysql_num_rows($ris)==0)
ma il risultato é
PHP:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in G:\EasyPHP\data\localweb\TEST.php on line 11
scegli auto

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in G:\EasyPHP\data\localweb\TEST.php on line 37
temo però di non aver capito in fase di prenotazione come far visualizzare le auto disponibili, ti ringrazio per la pazienza
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
stai parlando di questo punto?
PHP:
<?php
//....
 $ris=mysql_query("SELECT * FROM prenotazioni");
    if(mysql_num_rows($ris)==0){
        //non ci sono prenotazioni tutte le auto disponibili
        $select="SELECT * FROM lista_automezzi";
    }else{
//......
?>
in effetti avevo digitato % al posto di $ però comunque fai una prova, metti un var_dump che poi toglierai
PHP:
<?php
//....
 $ris=mysql_query("SELECT * FROM prenotazioni");
 var_dump($ris);
    if(mysql_num_rows($ris)==0){
        //non ci sono prenotazioni tutte le auto disponibili
        $select="SELECT * FROM lista_automezzi";
    }else{
//......
?>
se ti da FALSE l'errore è in $ris=mysql_query("SELECT * FROM prenotazioni");
non l'avevo scritto perche mi sembrava logico, ma hai messo i dati di connessione?
ti conviene metterli all'inizio dello script
PHP:
<?php
//qui i dati di connessione
$conn = mysql_connect($host,$username,$password) or die (mysql_error());
$sel = mysql_select_db($db) or die (mysql_error());
//evidentemente con i tuoi dati
/* oppure meglio
ti fai un file chiamato connessione.php in modo da usarlo in tutte le pagine che ti servono e fai il require
require_once 'nome_cartella/connessione.php';
*/
if(isset($_POST['orario'])){
    $inizio_richiesta=$_POST['inizio']; 
	//....
?>
 

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
ciao ho inserito le date come da immagine

1.jpg


successivamente la select mi compare cosi'

2.jpg

quando però vado ad scegliere l'auto disponibile non inserisce nulla nella tabella prenotazioni.

il codice é il seguente

PHP:
 <?php

// dati di connessione

$host = "xxxxxxxxxxx"; $username = "xxxxxxxxxxx"; $password = "xxxxxxxxxxxx";
 
$conn = mysql_connect($host,$username,$password) or die (mysql_error());
$sel = mysql_select_db($db) or die (mysql_error()); 
 
if(isset($_POST['orario'])){
    $inizio_richiesta=$_POST['inizio'];
	$datain = date('Y-m-d H:i:s', strtotime($inizio_richiesta));
	$fine_richiesta=$_POST['fine'];
    $dataout = date('Y-m-d H:i:s', strtotime($fine_richiesta));
	$auto_libera=array();
    $auto_occupata=array();
    $disponibili=array();
    $ris=mysql_query("SELECT * FROM prenotazioni");
	var_dump($ris);
    if(mysql_num_rows($ris)==0){
        //non ci sono prenotazioni tutte le auto disponibili
        $select="SELECT * FROM lista_automezzi";
    }else{
        //cerco le disponibili in modo che non ci siano interferenze
        while($riga=mysql_fetch_array($ris)){
            $id_auto=$riga['id_auto'];
            $i=$riga['inizio'];
            $f=$riga['fine'];
            if(($inizio_richiesta < $i && $fine_richiesta > $i) || ($inizio_richiesta > $f && $fine_richiesta > $f)){
                $auto_libera[]=$id_auto;
            }else{
                $auto_occupata[]=$id_auto;
            }
        }
        //le auto disponibili sono quelle che non interferiscono
        $disponibili=array_diff($auto_libera, $auto_occupata);
        $select="SELECT * FROM lista_automezzi WHERE id IN '".implode("','",$disponibili)."'";
    }
    $ris=mysql_query($select);
?>
    scegli auto<br>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="scegli_auto">
    <input name="ini" type="hidden" value="<?php echo $inizio_richiesta; ?>">
    <input name="fin" type="hidden" value="<?php echo $fine_richiesta; ?>">
<?php
    while($riga=mysql_fetch_array($ris)){
        $id=$riga['id'];
        $cod=$riga['cod'];
        $automezzo=$riga['automezzo'];
        echo "$cod: $automezzo <input name='id_auto' type='radio' value='$id'><br>";
    }
?>
    <input name="scegli" type="submit" id="scegli" value="scegli">
    </form>
<?php
    if(isset($_POST['scegli'])){
        //leggi i post e fai l'insert in tabella prenotazioni
		
		
		
		$query = "INSERT INTO prenotazioni (id,id_auto,inizio,fine)
        VALUES (null, '$id_auto', '$inizio_richiesta', '$fine_richiesta')";

// lancio la query
$result = mysql_query($query);

// controllo l'esito
if (!$result) {
    die("Errore nella query $query: " . mysql_error());
}

// chiudo la connessione a MySQL
mysql_close();

echo 'inserimento completato';  

        //qui metterie anche una pulizia in automatico della tabella prenotazioni
        //cancellando i record con data fine minore dell'odierna
		
		$oggi=time();//o $oggi=date(formattazione) con la formattazione che usi
$query=mysql_query("DELETE prenotazioni WHERE fine < '$oggi'");
		
        //rimandi dove vuoi
    }
}else{
?>
<form name="orario" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    data inizio <input type="text" name="inizio"><br>
    data fine <input type="text" name="fine"><br>
    <input name="orario" type="submit" id="orario" value="prenota">
</form>
<?php
}
?>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
if(isset($_POST['scegli'])){
//leggi i post e fai l'insert in tabella prenotazioni
mancano i vari $_POST
PHP:
$id_auto=$_POST['id_auto'];
$inizio_richiesta=$_POST['ini'];
$fine_richiesta=$_POST['fin'];
poi comunque non
PHP:
$query = "INSERT INTO prenotazioni (id,id_auto,inizio,fine)
        VALUES (null, '$id_auto', '$inizio_richiesta', '$fine_richiesta')";
ma
PHP:
$query = "INSERT INTO prenotazioni (id_auto,inizio,fine)
        VALUES ('$id_auto', '$inizio_richiesta', '$fine_richiesta')";
 

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
Niente da fare ancora non va non fa nessun insert ti riposto il codice con le correzioni:

PHP:
 <?php

// dati di connessione

$host = "xxxxxxxxx"; $username = "xxxxxxxxxxx"; $password = "xxxxxxxxxx"; $db="xxxxxxxxx";
 
$conn = mysql_connect($host,$username,$password) or die (mysql_error());
$sel = mysql_select_db($db) or die (mysql_error()); 
 
if(isset($_POST['orario'])){
    $id_auto=$_POST['id_auto'];
    $inizio_richiesta=$_POST['ini'];
    $fine_richiesta=$_POST['fin']; 
   	$datain = date('Y-m-d H:i:s', strtotime($inizio_richiesta));
	$dataout = date('Y-m-d H:i:s', strtotime($fine_richiesta));
	$auto_libera=array();
    $auto_occupata=array();
    $disponibili=array();
    $ris=mysql_query("SELECT * FROM prenotazioni");
	var_dump($ris);
    if(mysql_num_rows($ris)==0){
        //non ci sono prenotazioni tutte le auto disponibili
        $select="SELECT * FROM lista_automezzi";
    }else{
        //cerco le disponibili in modo che non ci siano interferenze
        while($riga=mysql_fetch_array($ris)){
            $id_auto=$riga['id_auto'];
            $i=$riga['inizio'];
            $f=$riga['fine'];
            if(($inizio_richiesta < $i && $fine_richiesta > $i) || ($inizio_richiesta > $f && $fine_richiesta > $f)){
                $auto_libera[]=$id_auto;
            }else{
                $auto_occupata[]=$id_auto;
            }
        }
        //le auto disponibili sono quelle che non interferiscono
        $disponibili=array_diff($auto_libera, $auto_occupata);
        $select="SELECT * FROM lista_automezzi WHERE id IN '".implode("','",$disponibili)."'";
    }
    $ris=mysql_query($select);
?>
    scegli auto<br>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="scegli_auto">
    <input name="ini" type="hidden" value="<?php echo $inizio_richiesta; ?>">
    <input name="fin" type="hidden" value="<?php echo $fine_richiesta; ?>">
<?php
    while($riga=mysql_fetch_array($ris)){
        $id=$riga['id'];
        $cod=$riga['cod'];
        $automezzo=$riga['automezzo'];
        echo "$cod: $automezzo <input name='id_auto' type='radio' value='$id'><br>";
    }
?>
    <input name="scegli" type="submit" id="scegli" value="scegli">
    </form>
<?php
    if(isset($_POST['scegli'])){
        //leggi i post e fai l'insert in tabella prenotazioni
		$query = "INSERT INTO prenotazioni (id_auto,inizio,fine)
        VALUES ('$id_auto', '$inizio_richiesta', '$fine_richiesta')";

// lancio la query
$result = mysql_query($query);

// controllo l'esito
if (!$result) {
    die("Errore nella query $query: " . mysql_error());
}

// chiudo la connessione a MySQL
mysql_close();

echo 'inserimento completato';  

        //qui metterie anche una pulizia in automatico della tabella prenotazioni
        //cancellando i record con data fine minore dell'odierna
		
		$oggi=time();//o $oggi=date(formattazione) con la formattazione che usi
$query=mysql_query("DELETE prenotazioni WHERE fine < '$oggi'");
		
        //rimandi dove vuoi
    }
}else{
?>
<form name="orario" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    data inizio <input type="text" name="inizio"><br>
    data fine <input type="text" name="fine"><br>
    <input name="orario" type="submit" id="orario" value="prenota">
</form>
<?php
}
?>
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
guarda che non hai messo i $_POST
PHP:
if(isset($_POST['scegli'])){
    //leggi i post e fai l'insert in tabella prenotazioni
    $id_auto=$_POST['id_auto'];
    $inizio_richiesta=$_POST['ini'];
    $fine_richiesta=$_POST['fin'];  
    $query = "INSERT INTO prenotazioni (id_auto,inizio,fine)
        VALUES ('$id_auto', '$inizio_richiesta', '$fine_richiesta')";

    // lancio la query
    $result = mysql_query($query);
//.....
 

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
Ciao ho modificato come mi hai indicato, niente da fare non fa l'insert, secondo me il problema sta nell'array

PHP:
resource(3) of type (mysql result)
PHP:
<?php

// dati di connessione

$host = "xxxxxxxxxxxxx"; $username = "xxxxxxxxxxxxxx"; $password = "xxxxxxxxxxx"; $db="xxxxxxxxxx";
 
$conn = mysql_connect($host,$username,$password) or die (mysql_error());
$sel = mysql_select_db($db) or die (mysql_error()); 
 
if(isset($_POST['orario'])){
    $id_auto=$_POST['id_auto'];
    $inizio_richiesta=$_POST['ini'];
    $fine_richiesta=$_POST['fin'];  
    $datain = date('Y-m-d H:i:s', strtotime($inizio_richiesta));
	$dataout = date('Y-m-d H:i:s', strtotime($fine_richiesta));
	$auto_libera=array();
    $auto_occupata=array();
    $disponibili=array();
    $ris=mysql_query("SELECT * FROM prenotazioni");
	var_dump($ris);
    if(mysql_num_rows($ris)==0){
        //non ci sono prenotazioni tutte le auto disponibili
        $select="SELECT * FROM lista_automezzi";
    }else{
        //cerco le disponibili in modo che non ci siano interferenze
        while($riga=mysql_fetch_array($ris)){
            $id_auto=$riga['id_auto'];
            $i=$riga['inizio'];
            $f=$riga['fine'];
            if(($inizio_richiesta < $i && $fine_richiesta > $i) || ($inizio_richiesta > $f && $fine_richiesta > $f)){
                $auto_libera[]=$id_auto;
            }else{
                $auto_occupata[]=$id_auto;
            }
        }
        //le auto disponibili sono quelle che non interferiscono
        $disponibili=array_diff($auto_libera, $auto_occupata);
        $select="SELECT * FROM lista_automezzi WHERE id IN '".implode("','",$disponibili)."'";
    }
    $ris=mysql_query($select);
?>
    scegli auto<br>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="scegli_auto">
    <input name="ini" type="hidden" value="<?php echo $inizio_richiesta; ?>">
    <input name="fin" type="hidden" value="<?php echo $fine_richiesta; ?>">
<?php
    while($riga=mysql_fetch_array($ris)){
        $id=$riga['id'];
        $cod=$riga['cod'];
        $automezzo=$riga['automezzo'];
        echo "$cod: $automezzo <input name='id_auto' type='radio' value='$id'><br>";
    }
?>
    <input name="scegli" type="submit" id="scegli" value="scegli">
    </form>
<?php
    if(isset($_POST['scegli'])){
        //leggi i post e fai l'insert in tabella prenotazioni
    $id_auto=$_POST['id_auto'];
    $inizio_richiesta=$_POST['ini'];
    $fine_richiesta=$_POST['fin']; 
    $query = "INSERT INTO prenotazioni (id_auto,inizio,fine)
        VALUES ('$id_auto', '$inizio_richiesta', '$fine_richiesta')";
		
		// lancio la query
$result = mysql_query($query);

echo $query;

// controllo l'esito
if (!$result) {
    die("Errore nella query $query: " . mysql_error());
}

// chiudo la connessione a MySQL
mysql_close();

echo 'inserimento completato';  

        //qui metterie anche una pulizia in automatico della tabella prenotazioni
        //cancellando i record con data fine minore dell'odierna
		
		$oggi=time();//o $oggi=date(formattazione) con la formattazione che usi
$query=mysql_query("DELETE prenotazioni WHERE fine < '$oggi'");
		
        //rimandi dove vuoi
    }
}else{
?>
<form name="orario" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    data inizio <input type="text" name="inizio"><br>
    data fine <input type="text" name="fine"><br>
    <input name="orario" type="submit" id="orario" value="prenota">
</form>
<?php
}
?>
 

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
ciao,
non so se hai già risolto, ma negli script postati vedo diversi errori di sintassi, di nomi sbagliati e anche di logica
per cui ti posto la mia soluzione provata e funzionante,

dovrai solo ripulirla dai metodi che ho usato per l'accesso al db (ms sql by pdo) rimettendo al loro posto i metodi mysql

la query di selezione, trova gli automezzi disponibili, che vengono visualizzati ed
al passaggio successivo, quello selezionato viene prenotato

lo script è grezzo, mancano tutti i controlli e deve essere completato

un'ultima osservazione, anziché cancellare i record dalla tabella prenotazioni, li sposterei in uno storico,
vedi mai che debba cercare un automezzo per rintracciare chi deve pagare la multa ....

ciao
Marino
PHP:
<?php 

// $host = "xxxxxxxxxxxxx"; $username = "xxxxxxxxxxxxxx"; $password = "xxxxxxxxxxx"; $db="xxxxxxxxxx"; 

//$conn = mysql_connect($host,$username,$password) or die (mysql_error()); 
//$sel = mysql_select_db($db) or die (mysql_error());  

require_once 'Config_testDB.php';

if( !empty($_POST['orario']) )
{
    // é arrivata una richiesta di prenotazione

    $inizio_richiesta=$_POST['ini']; 
    $fine_richiesta=$_POST['fin'];   

    $datain = date('Y-m-d H:i:s', strtotime($inizio_richiesta)); 
    $dataout = date('Y-m-d H:i:s', strtotime($fine_richiesta)); 

    $sql = FunSelect( $datain, $dataout );
    $ris = $db->query( $sql );  // $ris=mysql_query($sql);
    if($ris->rowCount() == 0)   // if(mysql_num_rows($ris)==0)
    { 
        // non ci sono automezzi disponibili
        // situazione da gestire
    }
    else
    {
        // automezzi disponibili, li visualizzo

        $ris->setFetchMode( PDO::FETCH_ASSOC ); 

        $testo =  "";
        while( $riga = $ris->fetch() )  //while( $riga = mysql_fetch_array($ris) )
        {
            // $id=$riga['id']; 
            $cod=$riga['targa']; 
            $automezzo=$riga['descrizione']; 
            $testo .= "$cod: $automezzo <input name='id_auto' type='radio' value='$cod'><br>"; 
        } 
        FormScelta($inizio_richiesta, $fine_richiesta, $testo);
    }
}
else
{ 
    if( !empty($_POST['scegli']) )
    {
        // é stata confermata la prenotazione con la scelta dell'automezzo

        $id_auto=$_POST['id_auto']; 
        $inizio_richiesta=$_POST['ini']; 
        $fine_richiesta=$_POST['fin'];  

        $sql = "INSERT INTO prenotazioni (targa, utente, pr_inizio, pr_fine, pr_fineprud, conferma) 
            VALUES ('$id_auto', '', '$inizio_richiesta', '$fine_richiesta', '', '')"; 
        $result = $db->queryM( $sql );  // $result = mysql_query($sql);
        if (!$result)
        { 
            die( "Errore nella query $sql: " . " // mysql_error()" ); 
        } 
        echo 'inserimento completato';   
    }
    else
    { 
        FormOrario();
    }
}

//qui metterie anche una pulizia in automatico della tabella prenotazioni 
//cancellando i record con data fine minore dell'odierna 

// $oggi=time();//o $oggi=date(formattazione) con la formattazione che usi 
// $query=mysql_query("DELETE prenotazioni WHERE fine < '$oggi'"); 

$db->close();  // mysql_close(); 


function FormOrario()
{ 
?>
<form name="orario" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
    data inizio <input type="text" name="ini"><br> 
    data fine <input type="text" name="fin"><br> 
    <input name="orario" type="submit" id="orario" value="prenota"> 
</form> 
<?php
} 


function FormScelta( $inizio_richiesta, $fine_richiesta, $testo )
{ 
?>
    scegli auto<br> 
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="scegli_auto"> 
    <input name="ini" type="hidden" value="<?php echo $inizio_richiesta; ?>"> 
    <input name="fin" type="hidden" value="<?php echo $fine_richiesta; ?>"> 
    <?php echo $testo; ?> 
    <input name="scegli" type="submit" id="scegli" value="scegli"> 
    </form> 
<?php
} 


function FunSelect( $datain, $dataout )
{ 
return "

declare @R_inizio	AS datetime;
declare @R_fine		AS datetime;
set @R_inizio	= '".$datain."';
set @R_fine	= '".$dataout."';

SELECT distinct a.targa, a.descrizione, a.classe
FROM (

SELECT
  1 AS tipo
, targa
, @R_inizio	AS rich_inizio
, @R_fine	AS rich_fine
, pr_inizio
, pr_fine
  FROM prenotazioni
 WHERE @R_inizio BETWEEN pr_inizio AND pr_fine
    OR @R_fine   BETWEEN pr_inizio AND pr_fine

UNION 

SELECT
  2 AS tipo
, targa
, @R_inizio	AS rich_inizio
, @R_fine	AS rich_fine
, pr_inizio
, pr_fine
  FROM prenotazioni
 WHERE @R_inizio<pr_inizio AND @R_fine>pr_fine

) p 

right join automezzi a
on p.targa=a.targa
where p.targa is null

ORDER BY a.classe, a.descrizione;
";
} 

?>
ps, la query di selezione, può essere ridotta di un buon 70%, ma scritta così permette una facile verifica
 
Ultima modifica:

Marco Luigia

Nuovo Utente
16 Mag 2014
28
0
1
Ti ringrazio, in effetti ci stavo lavorando ancora su, solo due domande i campi della tabella prenotazioni di che tipo sono int()?

per effettuare la connessione al database posso utilizzare la parte di script che hai commentato ovvero:
PHP:
// $host = "xxxxxxxxxxxxx"; $username = "xxxxxxxxxxxxxx"; $password = "xxxxxxxxxxx"; $db="xxxxxxxxxx"; 

//$conn = mysql_connect($host,$username,$password) or die (mysql_error()); 
//$sel = mysql_select_db($db) or die (mysql_error());
grazie 1000 per la pazienza
 

marino51

Utente Attivo
28 Feb 2013
2.931
166
63
Lombardia
queste le mie tabelle nel db
Codice:
CREATE TABLE automezzi
(
  targa		varchar(10),
  descrizione	varchar(20),
  classe	varchar(4),
  PRIMARY KEY (targa)
);
CREATE TABLE prenotazioni
(
  targa		varchar(10),
  utente	varchar(10),
  pr_inizio 	datetime,
  pr_fine	datetime,
  pr_fineprud	datetime,
  conferma	int,
  PRIMARY KEY (targa, pr_inizio, pr_fine)
);
per le date preferisco usare datetime perché quando voglio controllare il contenuto del campo, leggo un valore capibile, se fosse definito int, sarebbe necessario avere qualcosa che converta, insomma tempo perso

per quanto riguarda la connessione, si, devi usare i tuoi metodi, ho inserito i miei solo per le prove
ciao
Marino