Come si fà un post con query string, nella stessa pagina?

Oggi ho questo problema:

nell'index dopo un po' di codice html c'è questo

index.php

<?php
            include_once('functions.inc.php');

            //Place the function names in an Array 
            $Array = array('cats',
                    'new_article',
                    'modify_article',
                    'delete_article');
            
            //If action doesn't exist, do the main() function
            if (!in_array($_GET['action'], $Array, TRUE)){
                main();
            }else{
                $_GET['action']();
            }
            ?>

In pratica ho 4 url:

catalog.php?action=cats

catalog.php?action=new_article

catalog.php?action=modify_article

catalog.php?action=delete_article

Quello però che adesso mi interessa :) è il primo in cui mi dà tutte le categorie che ho nel db. Il problema, in pratica, è che non riesco ad aggiungere, modificare od eliminare niente tramite questo codice.

functions.inc.php

function cats(){
            global $dbQueries;
            ?>
            
            <p>Inserisci una nuova categoria</p>
            <form action="catalog.php?action=addcat" method="post">
                <label for="catname">Nuova Categoria</label><input id="catname" name="catname" type="text" size="16" />
                <input type="submit" value="Aggiungi" id="aggiungi" />
            </form>   
            <h2>Modifica Categoria</h2>
            <form action="catalog.php?action=modifycats" method="post">
            
            <?php
            //Vediamo quante categorie ho finora?
            $query = mysql_query('SELECT * FROM categorie ORDER BY id');
                   
            $dbQueries++;
            $i = 0;
            
            while($catinfo = mysql_fetch_assoc($query)){
            ?>    
                
                <b><?php echo $catinfo['id'];?></b>
                <label for="catname[<?php echo $i?>]">Nome Categoria</label>
                    <input id="catname[<?php echo $i?>]" name="catname[<?php echo $i?>]" type="text" size="16" value="<?php echo $catinfo['catname'];?>" />
                <label for="delete[<?php echo $i?>]">Rimuovi Categoria</label>
                    <input type="checkbox" id="delete[<?php echo $i?>]" name="delete[<?php echo $i?>]" value="1" />
                <input type="hidden" name="id[<?php echo $i?>]" value="<?php echo $catinfo['id'];?>" />
            
            <?php
                $i++;
            }
            ?>
            
                <label for="numcats"></label> <input type="hidden" name="numcats" value="<?php echo $i?>" />
                <label for="invia"></label> <input type="submit" name="submit" value="invia" id="invia"/>
                <label for="annulla"></label> <input type="reset" name="annulla" value="annulla" id="annulla"/>
            </form>
            
            <?php
            }
            
            function addcat(){
            
              $_POST['catname'] = trim($_POST['catname']);
            
              if (!$_POST['catname']){
                fatal_error($language['CONTENT_ERRORREQUIREDFIELD']);
              }
            
              //Check if Category Name already exists
              $result = mysql_query('SELECT catname FROM categorie WHERE catname =\''. $_POST['catname'] .'\'');
              $dbQueries++;
            
              if (mysql_numrows($result) != 0){
                fatal_error($language['CONTENT_CATEXISTS']);
              }
            
              mysql_query('INSERT INTO categorie (catname) VALUES (\''. $_POST['catname'] .'\')');
              $dbQueries++;
            
              echo "            {$language['CONTENT_ADDEDCATSUCCESS']}<br />\n";
              echo "            <a href=\"catalog.php?action=cats\">{$language['CONTENT_BACK']}</a>\n";
            }
            
            function modifycats(){
            
              /* Assign arrays variables */
              $catname = $_POST['catname'];
              $delete = $_POST['delete'];
              $id = $_POST['id'];
            
              $i = 0;
            
              /* Update/Delete the Categories */
              while ($i < $_POST['numcats'])
              {
                eval("\$name = \$catname[$i];");
                //eval("\$icon = \$caticon[$i];");
                eval("\$del = \$delete[$i];");
                eval("\$cid = \$id[$i];");
            
                if ($del == 1){
                    $qs = 'DELETE FROM categorie WHERE id ='. $cid .'';
                }else{
                  $qs = 'UPDATE categorie SET catname =\''. $name .'\' WHERE id ='. $cid .'';
                }
            
                mysql_query($qs);
                
                $dbQueries++;
                $i++;
              }
            
              echo "            {$language['CONTENT_UPDATECATS']}<br />\n";
              echo "            <a href=\"catalog.php?action=cats\">{$language['CONTENT_BACK']}</a>\n";

            }

Dove è che sbaglio?

Non vi "obbligo" a leggere tutto il codice, ma almeno mi potete spiegare come funziona il post tramite query string(catalog.php?action=cats, e quindi non add_cats.php)?

p.s. scusatemi per il post lungo, ma è tutto il giorno che ci sto provando :'(

inviato 9 anni fa
dantefoxfox
X 0 X

quando l'attributo action del form è vuoto allora il POST viene effettuato inviando i dati del form allo stesso URL della pagina corrente, quindi se è presente una query string questa verrà conservata.

In pratica è come se la pagina fosse ricaricata esattamente come prima, con l'unica differenza che stavolta i dati del form saranno impacchettati nell'array $_POST.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni della risposta :)

Volevo aprire una nuova discussione, ma a pensarci bene, questa è più che in argomento:

come richiesta di risorse è più impegnativo, per il server, fare una pagina con le funzioni che vengono richiamate tramite action, oppure fare delle singole pagine?

risposto 9 anni fa
dantefoxfox
X 0 X

Cosa intendi per funzioni chiamate tramite action?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

chiamare una funzione dalla query string:

sono esattamente la stessa cosa che metterle in due pagine diverse.

:bye:

risposto 9 anni fa
Andrea Turso
Andrea Turso
86
X 0 X
Cosa intendi per funzioni chiamate tramite action?

Come quelle quelle che ho postato nell'esempio.

sono esattamente la stessa cosa che metterle in due pagine diverse.

Quindi lo si fà per comodità? Per ordine? Per sicurezza?

risposto 9 anni fa
dantefoxfox
X 0 X

Io normalmente utilizzo una stessa pagina per mostrare il form e processare il post. Così tutta la logica della pagina è in un unico file.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Io normalmente utilizzo una stessa pagina per mostrare il form e processare il post. Così tutta la logica della pagina è in un unico file.

Bene :)

Allora mi adeguerò anch'io. O0

Grazie!

risposto 9 anni fa
dantefoxfox
X 0 X
Io normalmente utilizzo una stessa pagina per mostrare il form e processare il post. Così tutta la logica della pagina è in un unico file.

Mi è venuto giusto in mnete adesso un piccolo dubbio: utilizzando la querystring, in questo caso, non c'è nessun pericolo, tipo Sql injection?

risposto 9 anni fa
dantefoxfox
X 0 X

Non è importante da dove provenga l'input dell'utente (query string, form, cookie) poiché questi dati sono tutti potenzialmente pericolosi e quindi sono tutti da verificare attentamente prima dell'uso.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda