problema con form

  • Creatore Discussione Creatore Discussione _Ania
  • Data di inizio Data di inizio
Mi vergogno ad approfittare così beceramente di voi ma lo faccio per il bene dell'associazione (e mio perchè mi picchiano se non faccio sto maledetto form :D ).

Per l'abbellimento, no problem, lo faccio in post-produzione :) tanto poi devo inserire il tutto in una pagina html stilisticamente gestita con i css...

Ho modificato come mi avevi detto i campi necessari e riposto il fomr
HTML:
<body>
<?php 
require_once "sezioni.php"; 

if (isset($_POST['prenota']) && $_POST['prenota']) { 
    $campi_vuoti = true; 
    $messaggio = ""; 
    foreach ($_POST as $key => $value) { 
        if (!empty($value)) { 
            $campi_vuoti = false; 
            $messaggio = " Tutti i campi sono obbligatori"; 
        } 
        $_POST[$key] = protect($value); 
    } 
    if (!$campi_vuoti) { 
        // qui andra fatta la insert 
    } 
} 
?> 
<table width="350" align="center">  
    <form method="post" action=""> 
        <tr> 
            <td colspan="2"> 
                Scegli la data : &nbsp; 
                <select name="date" onchange="this.form.submit()"> 
                    <!-- qui le date disponibili --> 
                    <option value=""></option> 
                    <option value="2012-04-08" 
                    <?php 
                    if (isset($_POST['date']) && $_POST['date'] == "2012-04-08") { 
                        echo " selected='selected'"; 
                    } 
                    ?> 
                            >08 Aprile 2012</option> 
                    <option value="2012-04-15" 
                    <?php 
                    if (isset($_POST['date']) && $_POST['date'] == "2012-04-15") { 
                        echo " selected='selected'"; 
                    } 
                    ?>         
                            >15 Aprile 2012</option> 
                </select> 
            </td> 
        </tr> 
        <tr> 
            <td colspan="2"> 
                Scegli l'orario : &nbsp; 
                <select name="orario" onchange="this.form.submit()"> 
                    <?php 
                    // qui metterai gli orari disponibili 
                    $array_orari = array("14:00", "14:30", "15:00", "15:30", "16:00","16:30","17:00","17:30","18:00","18:30", "19:00"); 
                    if (isset($_POST['date'])) { 
                        $data = $_POST['date']; 
                    } else { 
                        $data = "2012-04-08"; 
                    } 
                    echo "<option value=''></option>"; 
                    foreach ($array_orari as $value) { 
                        if (conta($data, $value) < 50) { 
                            echo "<option value='$value'"; 
                            if (isset($_POST['orario']) && $_POST['orario'] == $value) { 
                                echo " selected='selected'"; 
                            } 
                            echo ">$value</option>"; 
                        } 
                    } 
                    ?> 
                </select> 
                <span> 
                    <?php 
                    if (isset($_POST['orario']) && !empty($_POST['orario'])) { 
                        echo " " . (50 - conta($data, $_POST['orario'])) . " posti liberi"; 
                    } 
                    ?> 
                </span> 
            </td> 
        </tr> 
        <tr> 
            <td colspan="2"><br/>Riempi i seguenti campi per prenotare : <br/><br/></td> 
        </tr> 
        <tr> 
            <td>Nome:</td> 
            <td><input type="text" name="nome"/></td> 
        </tr> 
        <tr> 
            <td>Cognome:</td> 
            <td><input type="text" name="cognome"/></td> 
        </tr> 
        <tr> 
            <td>Numero di telefono:</td> 
            <td><input type="text" name="telefono"/></td> 
        </tr> 
        <tr> 
            <td>Indirizzo email:</td> 
            <td><input type="text" name="mail"/></td> 
        </tr> 
        <tr> 
            <td>Numero di persone:</td> 
            <td><input size="2" type="text" name="persone"/></td> 
        </tr> 
        <tr> 
            <td colspan="2" align="center"><input type="submit" name="prenota" value="Prenota"/></td> 
        </tr> 
    </form> 
</table> 

</body>

Mi sorgono solo due dubbi: come faccio, impostata la cosa così, se nei due giorni ho orari diversi (nel senso che di solito il sabato partiamo da metà giornata mentre la domenica facciamo visite anche di mattina)? E poi, in questo modo, a me non rimane traccia scritta delle prenotazioni vero?? Cioè, non mi rimangono divisi per giorni e orari nel database le varie prenotazioni... Mi resta solo un mucchio di numeri? Come faccio a controllare le prenotazioni? Non so se mi sono spiegata nei miei dubbi...
 
prova a cambiare il primo blocco di codice cosi:

PHP:
<?php
require_once "sezioni.php";
$messaggio = "&nbsp;";
if (isset($_POST['prenota']) && $_POST['prenota']) {
    $campi_vuoti = true;

    foreach ($_POST as $key => $value) {
        if (empty($value)) {
            $campi_vuoti = false;
            $messaggio = ">>>>>>> Tutti i campi sono obbligatori <<<<<<<";
        }
        $_POST[$key] = protect($value);
    }
    if ($campi_vuoti) {
        $connessione = mysql_connect("localhost", "root", "", "database");
        $db = mysql_select_db("database");
        $query = "INSERT INTO utenti SET nome = '" . $_POST['nome'] . "',
                                         cognome = '" . $_POST['cognome'] . "',
                                         mail = '" . $_POST['mail'] . "',
                                         telefono = '" . $_POST['telefono'] . "',
                                         persone = " . $_POST['persone'] . ",
                                         data = '" . $_POST['date'] . "',
                                         orario = '" . $_POST['orario'] . "'";
        $risultato = mysql_query($query);
        mysql_close();
        if ($risultato) {
            header("refresh:3;url=/home.php");
            $messaggio = ">>>>>>> Prenotazione accettata <<<<<<<";
        } else {
            header("refresh:3;url=/form.php");
            $messaggio = ">>>>>>> Errore di sistema Contatta l'assistenza <<<<<<<";
        }
    }
}
echo "<p align='center'> $messaggio </p>";
?>

dovrai cambiare i tuoi riferimenti

Per le diverse fasce orarie ci devo pensare un attimo

per l'altra domanda non l'ho capita, Ti rimangono i dati nel db a meno che non li cancelli a mano

ogni record inserito avra la sua data e la sua ora e gli altri dati
 
Grande! Funziona! Anche se, aimeh, il sistema che dovrebbe ritornarti il messaggio di errore in caso di mancata scrittura sul database lo fa incartare. In particolare mi dice:
"Warning: Cannot modify header information - headers already sent by (output started at /htdocs/public/www/form/formprenotazioni1.php:6) in /htdocs/public/www/form/formprenotazioni1.php on line 75"

Le righe in questione sono le seguenti:

if ($risultato) {
header("refresh:3;url=/home.php"); <------------------questa è la riga 75 per lui
$messaggio = ">>>>>>> Prenotazione accettata <<<<<<<";
} else {
header("refresh:3;url=/form.php");
$messaggio = ">>>>>>> Errore di sistema Contatta l'assistenza <<<<<<<";
}

Posso chiederti il significato di /home.php??

Il link alla pagina è sempre questo http://www.bunkersoratte.it/form/formprenotazioni1.php.

Per la mia domanda che non hai capito, l'avevi capita bene! E mi hai risposto!! Grazie. :)
 
il sistema che dovrebbe ritornarti il messaggio di errore in caso di mancata scrittura sul database lo fa incartare

Peccato! si vede che c'è qualcosa che gli da fastidio prima di quella istruzione

/home.php è la pagina che dovrebbe richiamnare dope 3 secoindi dal messaggio ( la tua sara /home.html penso)

prova a cambiarlo con:

PHP:
if ($risultato) {
            echo "<script type='text/javascript'>";
            echo "alert('Prenotazione accettata');";
            echo "location.href='/home.php';";
            echo "</script>";
        } else {
            echo "<script type='text/javascript'>";
            echo "alert('Errore contatta la direzione');";
            echo "location.href='/form.php';";
            echo "</script>";
        }
 
poi cambierei anche questa riga
HTML:
<tr> 
            <td>Numero di persone:</td> 
            <td><input size="2" type="text" name="persone"/></td> 
        </tr>
con questa
PHP:
<tr> 
            <td>Numero di persone:</td> 
            <td><select name="persone">
                    <?php
                    if (isset($_POST['orario']) && !empty($_POST['orario'])) {
                        for ($i = 1; $i <= $limite; $i++) {
                            echo "<option value='$i'>$i</option>";
                        }
                    }
                    ?>
                </select></td> 
        </tr>
cosi limiti gli utenti a inserire i numeri dei posti liberi

La variabile $limite la puoi valorizzare qui:
PHP:
              <span> 
                    <?php
                    if (isset($_POST['orario']) && !empty($_POST['orario'])) {
                        $limite = (50 - conta($data, $_POST['orario']));
                        echo " " . $limite . " posti liberi";
                    }
                    ?> 
                </span>

quando e se tutto funziona posta il codice completo che sicuramente avrà bisogno di qualche aggiustamento o potrà servire ad altri
 
Si, forse sarebbe stata più elegante l'altra soluzione invece del messaggio di allarme con tanto di suono :D Ma va divinamente!!!
Ho anche visto che ora, quando un turno si riempie, l'orario sparisce dal menu a tendina, perciò nn preoccuparti del problema dei due giorni con orari diversi. Farò una bella zozzeria e riemipò i turni della mattina con finte prenotazioni prima di rendere attivo il form (anche direttamente da database). Non sarà la cosa più pulita al mondo, ma va benissimo!

L'unica cosa che vedo è che ora si è perso il controllo sul numero massimo di persone inseribili. Cioè: se il turno è ancora attivo, magari ci sono 5 posti liberi, e io mi prenoto 20 persone, lui, senza colpo ferire, mi prenota le 20 persone, arrivando ad un turno di 65 persone!
Perdonami, ho provato a capire da sola come risolvere il problema ma mi ci vorrà un mese per capire bene tutti i passaggi che hai scritto te! :crying:

Ancora grazie.
 
Appunto!! :D

Si ora riposto tutto!! Spero che serve anche ad altri, mi farebbe sentire meno in colpa :D
 
Perfect! Certo, la megastrisciata di numeri, del menu persone, lanciata verso l'alto fa un pò impressione... ma sicuramente funziona!!

L'unica cosa, che però è, temo, un pò grave, è che se io dopo aver fatto la prenotazione, torno indietro alla pagina del form (indietro col pulsante del browser dico) trovo il form ancora pieno dei miei dati e ,cosa peggiore, il sistema non si arrabbia e mi fa prenotare come se prima non avessi fatto nulla. Cioè, io ora, per esempio, nel mio database ho l'orario delle 15.00 dell'8 con prenotate (allo stesso ipotetico nome) 79 persone...

Esiste un modo per obbligare il sistema a ripulire il form? (Ovviamente se aggiorno la pagina il problema non sussiste, ma io devo anche calcolare l'ipotetico tecnoleso che si prenota 27 volte facendo il giochino che ho fatto io per paura che non abbia preso la prenotazione.

Il codice è il seguente ora

HTML:
<body>
<?php 
require_once "sezioni.php"; 
$messaggio = "&nbsp;"; 
if (isset($_POST['prenota']) && $_POST['prenota']) { 
    $campi_vuoti = true; 

    foreach ($_POST as $key => $value) { 
        if (empty($value)) { 
            $campi_vuoti = false; 
            $messaggio = ">>>>>>> Tutti i campi sono obbligatori <<<<<<<"; 
        } 
        $_POST[$key] = protect($value); 
    } 
    if ($campi_vuoti) { 
        $connessione = mysql_connect("nomeserver", "nomeutente", "password", "nomedatabase"); 
        $db = mysql_select_db("nomedatabase"); 
        $query = "INSERT INTO utenti SET nome = '" . $_POST['nome'] . "', 
                                         cognome = '" . $_POST['cognome'] . "', 
                                         mail = '" . $_POST['mail'] . "', 
                                         telefono = '" . $_POST['telefono'] . "', 
                                         persone = " . $_POST['persone'] . ", 
                                         data = '" . $_POST['date'] . "', 
                                         orario = '" . $_POST['orario'] . "'"; 
        $risultato = mysql_query($query); 
        mysql_close(); 
       if ($risultato) { 
            echo "<script type='text/javascript'>"; 
            echo "alert('Prenotazione accettata');"; 
            echo "location.href='/home.html';"; 
            echo "</script>"; 
        } else { 
            echo "<script type='text/javascript'>"; 
            echo "alert('Errore contatta la direzione');"; 
            echo "location.href='/form.php';"; 
            echo "</script>"; 
        }
    } 
} 
echo "<p align='center'> $messaggio </p>"; 
?> 
 
<table width="350" align="center">  
    <form method="post" action=""> 
        <tr> 
            <td colspan="2"> 
                Scegli la data : &nbsp; 
                <select name="date" onchange="this.form.submit()"> 
                    <!-- qui le date disponibili --> 
                    <option value=""></option> 
                    <option value="2012-04-08" 
                    <?php 
                    if (isset($_POST['date']) && $_POST['date'] == "2012-04-08") { 
                        echo " selected='selected'"; 
                    } 
                    ?> 
                            >08 Aprile 2012</option> 
                    <option value="2012-04-15" 
                    <?php 
                    if (isset($_POST['date']) && $_POST['date'] == "2012-04-15") { 
                        echo " selected='selected'"; 
                    } 
                    ?>         
                            >15 Aprile 2012</option> 
                </select> 
            </td> 
        </tr> 
        <tr> 
            <td colspan="2"> 
                Scegli l'orario : &nbsp; 
                <select name="orario" onchange="this.form.submit()"> 
                    <?php 
                    // qui metterai gli orari disponibili 
                    $array_orari = array("14:00", "14:30", "15:00", "15:30", "16:00","16:30","17:00","17:30","18:00","18:30", "19:00"); 
                    if (isset($_POST['date'])) { 
                        $data = $_POST['date']; 
                    } else { 
                        $data = "2012-04-08"; 
                    } 
                    echo "<option value=''></option>"; 
                    foreach ($array_orari as $value) { 
                        if (conta($data, $value) < 50) { 
                            echo "<option value='$value'"; 
                            if (isset($_POST['orario']) && $_POST['orario'] == $value) { 
                                echo " selected='selected'"; 
                            } 
                            echo ">$value</option>"; 
                        } 
                    } 
                    ?> 
                </select> 
                <span> 
                    <?php 
                    if (isset($_POST['orario']) && !empty($_POST['orario'])) {
						$limite = (50 - conta($data, $_POST['orario']));
						 echo " " . (50 - conta($data, $_POST['orario'])) . " posti liberi";
                    } 
                    ?> 
                </span> 
            </td> 
        </tr> 
        <tr> 
            <td colspan="2"><br/>Riempi i seguenti campi per prenotare : <br/><br/></td> 
        </tr> 
        <tr> 
            <td>Nome:</td> 
            <td><input type="text" name="nome"/></td> 
        </tr> 
        <tr> 
            <td>Cognome:</td> 
            <td><input type="text" name="cognome"/></td> 
        </tr> 
        <tr> 
            <td>Numero di telefono:</td> 
            <td><input type="text" name="telefono"/></td> 
        </tr> 
        <tr> 
            <td>Indirizzo email:</td> 
            <td><input type="text" name="mail"/></td> 
        </tr> 
        <tr> 
            <td>Numero di persone:</td> 
            <td><select name="persone">
                    <?php
                    if (isset($_POST['orario']) && !empty($_POST['orario'])) {
                        for ($i = 1; $i <= $limite; $i++) {
                            echo "<option value='$i'>$i</option>";
                        }
                    }
                    ?>
                </select></td> 
        </tr>
            <td colspan="2" align="center"><input type="submit" name="prenota" value="Prenota"/></td> 
        </tr> 
    </form> 
</table> 



</body>
 
Meglio aggiungere ulteriori controlli in questa parte di codice prima dell'insert
PHP:
foreach ($_POST as $key => $value) { 
        if (empty($value)) { 
            $campi_vuoti = false; 
            $messaggio = ">>>>>>> Tutti i campi sono obbligatori <<<<<<<"; 
        } 
        $_POST[$key] = protect($value); 
    }
anche perche puo essere che diverse persone prenotino quasi contemporaneamente

ora ci penso
 
Ottima idea :)
Tipicamente telefono e mail arrivano allo stremo nei giorni immediatamente precedenti...

Poi appena sistemata questa cosa riposto anche il codice del file "sezioni".

Intanto ri-grazie.
 
questo dovrebbe evitare di superare il liminte nel caso che i posti finiscono mentre qualcuno sta compilando la form

PHP:
foreach ($_POST as $key => $value) {

        $_POST[$key] = protect($value);
        if (empty($value)) {
            $campi_vuoti = false;
            $messaggio = ">>>>>>> Tutti i campi sono obbligatori <<<<<<<";
        }
        if ($key == "persone") {
            // verifichiamo che persone sia un numero
            if (is_numeric($_POST[$key])) {
                // ricontrolliamo la disponibilita
                $prenotati = conta($_POST['date'], $_POST['orario']);

                if (($_POST[$key] + $prenotati) > 50) {
                    $campi_vuoti = false;
                    // ripuliamo la select dell'orario
                    unset($_POST['orario']);
                    $messaggio = ">>>>>>> I posti richiesti non sono pi&ugrave; disponibili <<<<<<<";
                }
            } else {
                $campi_vuoti = false;
                $messaggio = ">>>>>>> Il campo persone deve essere numerico <<<<<<<";
            }
        }
        // se troviamo un errore usciamo dal ciclo
        if ($campi_vuoti == false) {
            break;
        }
    }
 
ciao
forse per evitare sovrapposizioni, nelle query di insert e update converrebbe mettere anche la clausola LOW_PRIORITY

LOW PRIORITY: l'inserimento non viene effettuato fino a quando esistono client che leggono sulla tabella interessata;
 
Ottimo!
Continua, ovviamente, a fare quello che dicevo, cioè tornando indietro trovo il form compilato come lo avevo lasciato.
Però ora non mi permette più di riprenotare sugli stessi posti, o meglio, sembrerebbe permetterlo, ma poi, premendo il tasto "prenota" mi riporta il messaggio di errore.

Quindi: va benissimo!!!!

Non so come ringraziarvi, soprattutto te criric. Alla fine, da una richiesta di aiuto, è diventato una intera riscrittura del codice.
Grazie infinite della pazienza.

Ora pulisco il codice dei due file dai dati del database e poi lo riposto per le future generazioni. Che almeno la tua impresa titanica sia utile a più d'uno! :)
 
Grazie del suggerimento borgo italia, ma mi sa che devi dirmi anche dove e cosa devo mettere, per me parlate quasi arabo :o
 
aspetta, che farei un altra modifica sui messaggi dopo la query in modo da non rischiare che qualcuno torni indietro e ripeta l'iscrizione

appena partorisco una soluzione te la posto
 
cosi potrebbe andare:

PHP:
        if ($risultato) {
            unset($_POST);
            $messaggio = ">>>>>>> Prenotazione accettata <<<<<<< <br/> <a href='/home.html'>Torna alla home</a>";
        } else {
            unset($_POST);
            $messaggio = ">>>>>>> Errore contatta la direzione <<<<<<< <br/> <a href='/home.html'>Torna alla home</a>";
        }

Ricaricachiamo la form ripulendo i campi e avvisiamo! Al massimo si puo nascondere la form se vuoi

come ultima cosa scriverei i campi in questo modo

PHP:
<tr> 
            <td>Nome:</td> 
            <td><input type="text" name="nome"
                <?php
                if (isset($_POST['nome'])) {
                    echo " value='" . $_POST['nome'] . "'";
                }
                ?>/></td> 
        </tr>

Per ora non mi viene in mente altro
ciao

@Borgo
non ho mai usato LOW_PRIORITY mi informerò sembra interessante
 
Ultima modifica:
Quasi dimenticavo

per gli orari diversi puoi fare cosi:

PHP:
                    // qui metterai gli orari disponibili 
                    if (isset($_POST['date'])) {
                        $data = $_POST['date'];
                    } else {
                        $data = "2012-04-08";
                    }


                    if ($data == "2012-04-08") {
                        $array_orari = array("14:00", "14:30", "15:00", "15:30", "16:00", "16:30", "17:00", "17:30", "18:00", "18:30", "19:00");
                    } else if ($data == "2012-04-15") {
                        $array_orari = array("08:00", "09:30", "10:00", "10:30");
                    } else {
                        $array_orari = array();
                    }
 
Ultima modifica:
Ho litigato 1 ora intera con il codice perchè mi scriveva il testo in nero e sullo sfondo non di leggeva...
Ovviamente bastava scrivere class='nomestile' anzichè class="nomestile"...

Odio ufficialmente i linguaggi di programmazzione e tutto ciò che anche lontanamente gli somiglia...

Il form fa cmq quello che dicevo, cioè, tornando indietro con il pulsante del browser mi ritrovo il form compilato, ma per me non è un problema, tanto cmq i posti non si possono occupare di nuovo e questo era tutto quello che contava! :D

Posto al volo il link, se vuoi vedere il risultato del tuo epico sforzo criric e, appena finito di cenare, posto il codice per i posteri!

http://www.bunkersoratte.it/form/formprenotazioni2.php

Ancora grazie ad entrambi!!
 
Su firefoxe e chrome non funzionano piu le select :confused:

PS:
quando hai finito di litigare con i css (forse sono il problema per firefoxe e chrome) prova ad aggiungere l'attributo size alla select delle persone con 2 o 3 o 4 vedi se ti piace l'effetto

HTML:
<select name="persone" size="3">
 
Ultima modifica:
I problemi di compatibilità con firefox e crome sono roba nota...
Quando ho rifatto il sito, poco tempo fa (è on-line in questa versione da marzo), ho scoperto che, poichè la posizione degli oggetti nella pagina non era fissa (restano bloccati la parte superiore e il menù laterale mentre il contenuto della pagina può scorrere) non funzionano più i link, se non in explorer... almeno la causa dovrebbe essere quella, da quanto emerso da una rapida ricerca sul web.
Ora, lo so che una cosa del genere dovrebbe farmi inorridire e non dormire più la notte, ma avevo il terrore del form che dovevo fare e quindi ho seppellito il problema. :D
Immagino che avendo voi risolto il mio problema del form, ora sia il caso che io mi dedichi alla questione compatibilità! ;)

Grazie dell'ulteriore consiglio! Ora provo e posto il codice.
 

Discussioni simili