[PHP] 1 form, 2 verschillende acties

Pagina: 1
Acties:
  • 123 views sinds 30-01-2008
  • Reageer

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
Ik zit met een probleem waar ik niet uit kom.
Ik heb één PHP-pagina met daarop een form met daarin allerlei tekstvelden die gevuld worden met waarden uit een MySQL DB.
Nu wil ik bij een groepje tekstvelden 2 buttons; eentje om de waarden te updaten en eentje om heel de regel te verwijderen a.d.h.v. een ID (id staat in een hidden veld).

Echter heb ik het eerst zo gemaakt dat er een extra hidden veld is met een naam (bijvoorbeeld updaterow) en in de php code gebruik ik dan de code if($updaterow) { ... } zodat de code die daar bij hoort uitgevoerd wordt.

Maar hoe krijg ik het nou voor elkaar dat er een bepaalde functie wordt uitgevoerd a.d.h.v. welke van de twee knoppen wordt geklikt (updaten of verwijderen) ?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
    /* 
     * Aan de hand van de geselecteerde titel de grafiek en in details de activiteiten weergeven.
     */
    
    if($submittitel)
    {   
        print("
            <p>
            <img src='http://www.xxxxx.nl/planning.php?titel=$selectedtitel'><br>
            <br>
            <font color='red'>U kunt 1 activiteit per keer updaten:</font>
            </p>
            <table width='500' border='0' cellspacing='0' cellpadding='5' align='left'>
            "); 

        $sql2 = mysql_query("SELECT * FROM planning WHERE titel = '$selectedtitel' ORDER BY positie ASC") or die(mysql_error());

        while($row2 = mysql_fetch_assoc($sql2))
        {   
            $id = stripslashes($row2[id]);
            $titel = stripslashes($row2[titel]);
            $positie = stripslashes($row2[positie]);
            $activiteit = stripslashes($row2[activiteit]);
            $start = stripslashes($row2[start]);
            $eind = stripslashes($row2[eind]);

            print("
                <form action='editplanning.php' method='post'>
                <input type='hidden' name='updaterow' value='yes'>
                
                <input type='hidden' name='id_e' value='$id'>
                <table>
                <tr>
                    <td>Titel: </td>
                    <td><input type='text' name='titel_e' value='$titel'></td>
                </tr>
                <tr>
                    <td>Positie: </td>
                    <td><input type='text' name='positie_e' value='$positie'></td>
                </tr>
                <tr>
                    <td>Activiteit: </td>
                    <td><input type='text' name='activiteit_e' value='$activiteit'></td>
                </tr>
                <tr>
                    <td>Startdatum: </td>
                    <td><input type='text' name='start_e' value='$start'></td>
                </tr>
                <tr>
                    <td>Einddatum: </td>
                    <td><input type='text' name='eind_e' value='$eind'></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type='submit' value='Activiteit opslaan'></td>
                </tr>
                </table>
                </form>
                ");

        } // Einde while
        
        print("
            </table>
            ");

    } // Einde if($submittitel)

    
    /*
     * Activiteit updaten
     */
    
    if($updaterow)
    {

        // Zet voor 'gevaarlijke' tekens (', ", en \) een extra \
        $id = addslashes($id_e);
        $positie = addslashes($positie_e);
        $titel = addslashes($titel_e);
        $activiteit = addslashes($activiteit_e);
        $start = addslashes($start_e);
        $eind = addslashes($eind_e);

        $sql3 = mysql_query("UPDATE `planning` SET `positie`='$positie', `titel`='$titel', `activiteit`='$activiteit', `start`='$start', `eind`='$eind' WHERE `id`='$id' LIMIT 1;") or die(mysql_error());

        $rows = mysql_affected_rows();
        if($rows == 1)
        {       
            echo "U heeft succesvol een activiteit geupdate.<br>
            U kunt direct naar een grafiek terugkeren door op [Ga verder...] te klikken.
            <br>
            <hr align='left' width='500'>
            <br>
            Bekijk de grafiek:<br><br>
            <img src='http://www.xxxxx.nl/planning.php?titel=$titel'><br>
            <br>
            Plak deze code in uw verhaal op de website om de planning zichtbaar te maken: <br>
            <font color='red'>
            <xmp><img src='http://www.xxxxx.nl/planning.php?titel=$titel'></xmp>
            </font>
            ";
        }
        else
        {
            echo "Er is iets fout gegaan bij het updaten. Ga <a href='JavaScript:history.go(-1);'>terug</a> en probeer het opnieuw.";
        }

    } //einde if($updaterow)

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


  • Rowanov
  • Registratie: Februari 2004
  • Niet online

Rowanov

Kop eens wat anders...

Javascript gebruiken om je formulier te submitten; dit is niet een probleem wat je server-side moet willen afhandelen.

Een tweede optie is om een extra var mee te geven in je post (hidden field), waarin je met javascript de waarde veranderd naar "update" of "delete".

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
Rowanov schreef op vrijdag 25 augustus 2006 @ 17:04:
Javascript gebruiken om je formulier te submitten; dit is niet een probleem wat je server-side moet willen afhandelen.

Een tweede optie is om een extra var mee te geven in je post (hidden field), waarin je met javascript de waarde veranderd naar "update" of "delete".
Die tweede optie... hoe ziet zoiets eruit ongeveer? :)

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


Verwijderd

2 Buttons zeg je, maar in je code zie ik er maar 1? Wat je kunt doen (en ja, dat kan serverside) is je submit een name value meegeven. Dan kun je serverside je post (of get) waarde uitlezen. Er wordt altijd maar 1 van je submit buttons meegestuurd.
Nadeel hiervan is dat je dat altijd op 1 pagina moet uitlezen dus af en toe zie je wel eens van die constructies als:
PHP:
1
2
3
4
5
if(isset($_POST["update"]))
{}

if(isset($_POST["delete"]))
{}
Ik vind dat dat er persoonlijk niet overzichtelijker van wordt.

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
Verwijderd schreef op vrijdag 25 augustus 2006 @ 22:52:
2 Buttons zeg je, maar in je code zie ik er maar 1? Wat je kunt doen (en ja, dat kan serverside) is je submit een name value meegeven. Dan kun je serverside je post (of get) waarde uitlezen. Er wordt altijd maar 1 van je submit buttons meegestuurd.
Nadeel hiervan is dat je dat altijd op 1 pagina moet uitlezen dus af en toe zie je wel eens van die constructies als:
PHP:
1
2
3
4
5
if(isset($_POST["update"]))
{}

if(isset($_POST["delete"]))
{}
Ik vind dat dat er persoonlijk niet overzichtelijker van wordt.
Dus regel 54 en 55 worden dan als volgt:
PHP:
1
2
<td><input type='submit' name='update' value='Activiteit opslaan'></td>
<td><input type='submit' name='delete' value='Activiteit verwijderen'></td>


en daaronder, moet ik dan als volgt doen?
PHP:
1
2
3
4
5
6
7
8
if($updaterow)
{
     if(isset($_POST["update"]))
     {}

     if(isset($_POST["delete"]))
     {}
}

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


Verwijderd

Het principe is dat je, als je:
PHP:
1
if(isset($_POST["update"]))
gebruikt, de code daarbij horend wordt uitgevoerd als je op de knop met de name value "update" klikt.

Verwijderd

Waarom 2 buttons? Waarom niet een selectbox of een setje radiobuttons?

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
Verwijderd schreef op zaterdag 26 augustus 2006 @ 20:28:
Het principe is dat je, als je:
PHP:
1
if(isset($_POST["update"]))
gebruikt, de code daarbij horend wordt uitgevoerd als je op de knop met de name value "update" klikt.
En dan zou
PHP:
1
2
if($updaterow)
{...}
dus overbodig zijn, toch? :)

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
Verwijderd schreef op zaterdag 26 augustus 2006 @ 20:43:
Waarom 2 buttons? Waarom niet een selectbox of een setje radiobuttons?
Omdat dat niet logisch zou zijn. Dat is net zo iets als 2 radioboxen maken met de keuzes OK en Cancel en dan 1 button eronder met OK ofzo. :+

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:24

MueR

Admin Devschuur® & Discord

is niet lief

Maak een mooie checkbox "Delete" bij de regel, en een knop met "OK". Wanneer de delete checkbox niet is aangevinkt, slaat ie de zooi op, anders mikt ie de regel uit de database. Jullie denken veel te moeilijk.

Anyone who gets in between me and my morning coffee should be insecure.


  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
MueR schreef op maandag 28 augustus 2006 @ 02:27:
Maak een mooie checkbox "Delete" bij de regel, en een knop met "OK". Wanneer de delete checkbox niet is aangevinkt, slaat ie de zooi op, anders mikt ie de regel uit de database. Jullie denken veel te moeilijk.
Op zich is het wel een oplossing die grafisch minder ruimte inneemt (elegant). Maar ook een die minder gebruikersvriendelijk is. De gebruiker kan niet direct zien of hij/zij nu iets gaat bewerken, verwijderen of eventueel iets anders. Daarnaast geeft de TS in de SP aan met 2 buttons te willen werken.

Twee submit buttons met een andere naam in je form. Dan kun je met een if constructie kijken welke is ingedrukt en kun je dus verschillende acties ondernemen. Die oplossing is hier indd al besproken.

Always shoot for the moon. Even if you miss you will land among the stars...


  • SinergyX
  • Registratie: November 2001
  • Laatst online: 23:11

SinergyX

____(>^^(>0o)>____

Waarom moeilijk? Ik gebruik altijd een 'update' en 'delete' button bij zulke queries, gebruikers snappen het (fool-proof; dat is zo'n delete-checkbox dus niet) en het is best goed toe te passen in de code.

[ Voor 3% gewijzigd door SinergyX op 28-08-2006 02:42 ]

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Ik zou persoonlijk de submits allebei dezelfde naam geven. (action ofzo) Geef ze allebei een verschillende value, zoals de ene update en de andere delete. Serverside lees je de action parameter uit en je weet wat je moet doen.

Overigens is het niet lelijk dat acties naar één centrale plaats verstuurd worden, maar dan moet je wel zorgen dat alles daar overzichtelijk blijft. Dit is dan volgens de Model 2 aanpak, welke doorgaans als netter wordt gezien dan steeds naar een aparte pagina posten.

http://en.wikipedia.org/wiki/Model_2

In feite post je steeds naar een controller. Dit is gewoon een PHP pagina die request parameters kan uitlezen en aan de hand van deze parameters door kan delegeren naar de daadwerkelijke code.

Fat Pizza's pizza, they are big and they are cheezy


  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

FlowDesign schreef op maandag 28 augustus 2006 @ 00:04:
Omdat dat niet logisch zou zijn. Dat is net zo iets als 2 radioboxen maken met de keuzes OK en Cancel en dan 1 button eronder met OK ofzo. :+
Mij lijkt de oplossing van Cheetah anders heel erg logisch. Je geeft daarmee namelijk aan wat je écht wil gaan doen, namelijk deleten óf updaten. Ik zou dus hierbij kiezen voor een radio button, daar je een van de twee (schijnbaar) moet kiezen.

De waarde van je submit button geef je dan "doorvoeren" of iets dergelijks... :) Onderstaande code ter verduidelijking, met extra optie om toe te voegen:
HTML:
1
2
3
4
<input type="radio" name="actie" value="1" />Toevoegen<br />
<input type="radio" name="actie" value="2" />Updaten<br /> 
<input type="radio" name="actie" value="3" />Verwijderen<br /> 
<input type="submit" value="Doorvoeren" />
Eventueel kan je aan de hand van de gekozen optie bij 'option' via JS de value dan bepalen bij de submit button... :) Dat je dan dingen dubbel aan geeft, dat is niet erg, lijkt mij alleen maar duidelijker naar de gebruiker toe... :)
MueR schreef op maandag 28 augustus 2006 @ 02:27:
Maak een mooie checkbox "Delete" bij de regel, en een knop met "OK". Wanneer de delete checkbox niet is aangevinkt, slaat ie de zooi op, anders mikt ie de regel uit de database. Jullie denken veel te moeilijk.
Zie hierboven, mij lijkt het logischer om een radio button te gebruiken, omdat je dan ook niet 'per ongeluk' kan vergeten om de checkbox aan te vinken, mocht je een record willen deleten... :) Uiteraard moet je de action / option / hoe je het ook noemen wilt, verplicht stellen binnen je form... :)

Wat je natuurlijk ook kan doen is de te verrichten actie afvangen via een $_GET variabele... :)

[ Voor 24% gewijzigd door CH4OS op 28-08-2006 13:33 ]


  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
JKVA schreef op maandag 28 augustus 2006 @ 07:44:
Ik zou persoonlijk de submits allebei dezelfde naam geven. (action ofzo) Geef ze allebei een verschillende value, zoals de ene update en de andere delete. Serverside lees je de action parameter uit en je weet wat je moet doen.

Overigens is het niet lelijk dat acties naar één centrale plaats verstuurd worden, maar dan moet je wel zorgen dat alles daar overzichtelijk blijft. Dit is dan volgens de Model 2 aanpak, welke doorgaans als netter wordt gezien dan steeds naar een aparte pagina posten.

http://en.wikipedia.org/wiki/Model_2

In feite post je steeds naar een controller. Dit is gewoon een PHP pagina die request parameters kan uitlezen en aan de hand van deze parameters door kan delegeren naar de daadwerkelijke code.
Ik ken het MVC design pattern, maar dat is nogal een overkill voor deze (redelijk simpele) pagina. :)

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
FlowDesign schreef op zaterdag 26 augustus 2006 @ 00:56:
[...]


Dus regel 54 en 55 worden dan als volgt:
PHP:
1
2
<td><input type='submit' name='update' value='Activiteit opslaan'></td>
<td><input type='submit' name='delete' value='Activiteit verwijderen'></td>


en daaronder, moet ik dan als volgt doen?
PHP:
1
2
3
4
5
6
7
8
if($updaterow)
{
     if(isset($_POST["update"]))
     {}

     if(isset($_POST["delete"]))
     {}
}
Bovenstaand werkt perfect. Bedankt AMDinc :)

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


  • susscorfa
  • Registratie: Augustus 2006
  • Laatst online: 22:41
zo ver ik weet kunnen multiple submits een probleem opleveren. je kunt daar door problemen krijgen dat het niet altijd goed gesubmit word mss moet je er ff op googlen. iig zelf heeft iemand mij dit laatst verteld dus doen we daar nu alles met javascript submits

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Wat ook kan:

HTML:
1
2
3
4
<form method="post">
<input type='button' value='opslaan' onclick="this.form.action='url'; this.form.submit();">
<input type='button' value='verwijderen' onclick="this.form.action='andereurl'; this.form.submit();">
</form>

March of the Eagles


  • mithras
  • Registratie: Maart 2003
  • Niet online
susscorfa schreef op dinsdag 29 augustus 2006 @ 13:03:
zo ver ik weet kunnen multiple submits een probleem opleveren. je kunt daar door problemen krijgen dat het niet altijd goed gesubmit word mss moet je er ff op googlen. iig zelf heeft iemand mij dit laatst verteld dus doen we daar nu alles met javascript submits
Waarom zou dat niet kunnen? Van w3.org:
submit buttons: When activated, a submit button submits a form. A form may contain more than one submit button.
Waarbij het 'name' attribuut de control name toewijst:
A control's "control name" is given by its name attribute. The scope of the name attribute for a control within a FORM element is the FORM element.
Dus je kan een submit type van een input element een name meegeven, die dus binnen dat form als control name wordt gebruikt.

Van een submit button is het geloof ik zo dat de waarde naar TRUE gaat als die verstuurd wordt, maar dat weet ik niet zeker (het kan net zo goed een '1' zijn).

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
De andere buttons worden niet meeverzonden wanneer je bv op "opslaan" klikt. Doe maar eens print_r($_POST) en klik op elke button. De waarde is geen true maar gewoon de value van die button. Dus je kan makkelijk checken:

PHP:
1
if (isset($_POST['opslaan']) && $_POST['opslaan'] != '')

March of the Eagles


  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 22:57
Wat mijns inziens eigenlijk ook wel een mooie oplossing is...
Eén checkbox neerzetten voor verwijderen en één submit button.

Dus als de checkbox niet aangevinkt is, dan doe je de update en als ie wel aangevinkt is dan verwijder je wat je wilt verwijderen.

Het voordeel hiervan is, dat een gebruiker niet per ongeluk op verwijderen zal klikken i.p.v. op opslaan. (Voor nog meer fool-proofness kun je uiteraard ook nog een pop-up box gebruiken.)

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S


  • mithras
  • Registratie: Maart 2003
  • Niet online
FlowDesign schreef op dinsdag 29 augustus 2006 @ 13:54:
Wat mijns inziens eigenlijk ook wel een mooie oplossing is...
Eén checkbox neerzetten voor verwijderen en één submit button.

Dus als de checkbox niet aangevinkt is, dan doe je de update en als ie wel aangevinkt is dan verwijder je wat je wilt verwijderen.

Het voordeel hiervan is, dat een gebruiker niet per ongeluk op verwijderen zal klikken i.p.v. op opslaan. (Voor nog meer fool-proofness kun je uiteraard ook nog een pop-up box gebruiken.)
Wat je dan vaak ziet is een combinatie van beide: een gewone 'update' button, en daarnaast zowel een checkbox als een verwijder button. Zo moet je 2 handelingen uitvoeren om een item te verwijderen. Natuurlijk kan je na het submitten van 'verwijder' nog een check uit laten voeren van 'weet je het zeker?', maar dat zorgt voor een extra request. Vandaar dat een checkbox+aparte button wel het veiligst is daarvoor.
Pagina: 1