Ciao,
non è tanto questione di cambiare la action perché la action indica semplicemente quale pagina richiamare e non cambia nulla se usi php_self o indichi il nome della pagina nel modo classico. Comunque l'uso di php_self è corretto.
La vera questione è su come differenziare il primo giro dai successivi e questo problema (che comunque è molto piccolo e fra un attimo ti dico come gestirlo) nasce dal fatto che vuoi visualizzare sulla stessa pagina sia i dati prelevati dal database che il form per inserirne altri, almeno così mi è sembrato di capire dal tuo primo post.
Quindi se vuoi creare una struttura ciclica o ricorsiva sei obbligato a far gestire entrambe le operazioni, quella di raccolta dati e quella di visualizzazione, alla stessa pagina.
Normalmente invece non funziona così, una struttura "normale" di raccolta dati prevede una pagina_1 (php o html è indifferente) contenente il form che viene presentato vuoto e che nella action punta a pagina_2.php.
pagina_2.php riceve i dati dal form, compie le operazioni necessarie e prepara un output html del tipo "riepilogo dei dati inseriti" oppure "grazie per aver inserito i dati".
Eventualmente nel codice generato c'è anche un link per tornare a pagina_1 e inserire altri dati.
Quindi in un giro normale si hanno due pagine diverse corrispondenti a due azioni diverse: la visualizzazione del form di raccolta e la visualizzazione dell'esito dell'elaborazione.
Volendo mettere tutto assieme, volendo cioè visualizzare i dati via via inseriti nella stessa pagina del form usato per inserirli occorre necessariamente fare un'unica pagina che richiama ricorsivamente se stessa e che deve avere un meccanismo per distinguere la prima esecuzione dalle successive.
Ci sono vari modi per farlo, session e querystring per esempio ma il più semplice è l'utilizzo di una variabile nascosta cioè di un campo
codice:
<input type="hidden" value="1" name="hid_1">
da inserire nel form assieme a tutti gli altri.
Facendo in questo modo ti basterà testare all'inizio della pagina se il campo hid_1 è valorizzato o meno per capire se sei al primo giro o no
Codice PHP:
<?php
if ($_POST['hid_1'] == "1") {
// elaborazioni eseguita solo dopo la prima volta, in questo caso è una semplice stampa
// a video del nome digitato ma possono essere cose più complesse come query su db
print("GIRO SUCCESSIVO
");
print("Il nome che hai inserito è " . $_POST['nome']);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<input type="hidden" value="1" name="hid_1">
Nome:
<input type="text" value="" name="nome">
<input type="submit" value="invia">
</form>
In questo modo il form viene inviato in ogni caso ma le elaborazioni su db vengono fatte solo dal secondo giro in poi.
Vorrei che ti soffermassi su due cose:
- print ed echo sono praticamente identiche e quasi completamente interscambiabili, entrambe inviano stringhe di testo al client.
- il codice racchiuso fra i tag <?php e ?> viene mandato al motore php perché venga eseguito mentre ciò che è fuori da quei tag viene inviato direttamente al client. Questo permette di mescolare liberamente codice html e php, infatti, come vedi, la prima metà del mio script è in php mentre la seconda metà è in html e, addirittura, all'interno del tag form il php viene aperto giusto per richiedere una singola operazione al php cioè la stampa con echo della variabile php_self dopodiché il php viene chiuso e si torna all'html.
Questo si ripercuote anche, ad esempio, sui commenti, il primo infatti è un commento php mentre il secondo è html.
Ciao