1. Code
  2. PHP

Wie kann man die Formularverarbeitung im Allgemeinen ereinfachen

Scroll to top

German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)

Sparen Sie Zeit, reduzieren Sie Wartungsprobleme, vereinfachen Sie Ihren Code und machen alles, dass sich, wie ein verdammtes Genie, fühlen! In diesem Tutorial erfahren Sie, wie Sie variable Variablen, Lookup-Arrays und ein bisschen kluge Programmierung verwenden, um die Formularverarbeitung zu vereinfachen.


Variablenvariablen, Methoden und Eigenschaften

Bevor wir uns zu sehr mit der Verwendung eines Lookup-Arrays benutzen können, ist es wichtig, zuerst das Konzept hinter variablen Variablen zu verstehen.

Was sind variable Variablen?

Variable variable ist ein Begriff, der die Verwendung einer Variablen zum Deklarieren einer anderen Variablen beschreibt.

In der einfachsten Form könnte eine variable Variable so aussehen:

1
$foo = 'A value!'; // Declare an initial value

2
$bar = 'foo'; // Wait, what's happening?

3
echo $$bar; // Holy crap! That output 'A value!'

Warum müssen Sie sich dafür interessieren?

Wenn Sie sich einen Proof of Concept wie im vorherigen Beispiel ansehen, sieht die Verwendung variabler Variablen wahrscheinlich ziemlich albern und überkompliziert aus. Aber es gibt auch wirklich solide, praktische Gründe, sie in einigen Fällen zu verwenden.

Lookup arrays can easily simplify your codeLookup arrays can easily simplify your codeLookup arrays can easily simplify your code

Praktische Beispiele

Durch den verantwortungsvollen Einsatz von den variablen Variablen kann die Menge an Code, die wiederholt werden muss, drastisch reduziert werden, indem ein assoziatives Array in ein Objekt mit bereinigten Werten konvertiert wird.

Beispiel ohne variable Variablen

1
$comment = new stdClass(); // Create an object

2
3
$comment->name = sanitize_value($array['name']);
4
$comment->email = sanitize_values($array['email']);
5
$comment->url = sanitize_values($array['url']);
6
$comment->comment_text = sanitize_values($array['comment_text']);

Beispiel mit variablen Variablen

1
$comment = new stdClass(); // Create a new object

2
3
foreach( $array as $key=>$val )
4
{
5
    $comment->$key = sanitize_values($val);
6
}

Sehen Sie, wie einfacher das war? Und Sie können sich vorstellen, wie das Beispiel ohne variable Variablen aussehen würde, wenn das Array etwa 50 oder 100 Werte hätte.

HINWEIS: Ich weiss, dass Sie auch array_map() benutzen und das Array kann als Objekt umwandeln, um dasselbe zu erreichen. Das ist nicht der Punkt. Wir veranschaulichen hier ein Konzept. Mitspielen.


Das Problem mit der Formularverarbeitung

Machen Sie die Formularverarbeitung zum Kinderspiel.

Nachdem Sie nun wissen, wie man variable Variablen verwendet, können wir mit dem Fleisch und den Kartoffeln dieses Artikels fortfahren. Mit dieser Idee können Sie durch die Integration eines Lookup-Arrays anstelle mehrerer Controller-Dateien oder einer switch-Anweisung viel zusätzlichen Wartungsaufwand sparen. wiederholter Code und Kopfschmerzen im Allgemeinen.

Um unser Konzept zu veranschaulichen, werden wir die Idee der Formularverarbeitung verwenden. Dies ist ein wesentlicher Aspekt der Webprogrammierung und kann auch einer der langwierigsten Bereiche eines Projekts sein.

Nachdem Sie Ihre Codierungsgewohnheiten neu bewertet haben, können Sie die Formularverarbeitung möglicherweise zum Kinderspiel machen.

Oft wird jedes verarbeitete Formular eine separate Datei erstellt oder die switch-Anweisung verwendet. In diesem Abschnitt sehen wir an, wie beide Lösungen implementiert werden können, und dann eine Lösung mit variablen Variablen untersuchen und wie sie Ihre Projekte verbessern kann.

Ein Arbeitsbeispiel mit mehreren Formularverarbeitungsdateien

Eine häufig verwendete Methode zum Behandeln von Formularübermittlungen besteht darin, eine ganz neue Datei zu erstellen, um die Daten jedes Formulars separat zu verarbeiten.

Nehmen Sie zum Beispiel diese drei Formulare, mit denen ein Benutzerkonto mit einem neuen Namen, einer neuen E-Mail-Adresse oder beidem aktualisiert wird:

1
<form action="assets/inc/ex1-form1.php"
2
      method="post"
3
      id="ex1-form1">
4
    <div>
5
        <h4>Form 1</h4>
6
        <label>Name
7
            <input type="text" name="name" class="input-text" />
8
        </label>
9
        <input type="submit" class="input-submit" value="Submit" />
10
        <input type="hidden" name="token" value="secret token goes here" />
11
    </div>
12
</form>
13
14
<form action="assets/inc/ex1-form2.php"
15
      method="post"
16
      id="ex1-form2">
17
    <div>
18
        <h4>Form 2</h4>
19
        <label>Email
20
            <input type="text" name="email" class="input-text" />
21
        </label>
22
        <input type="submit" class="input-submit" value="Submit" />
23
        <input type="hidden" name="token" value="secret token goes here" />
24
    </div>
25
</form>
26
27
<form action="assets/inc/ex1-form3.php"
28
      method="post"
29
      id="ex1-form3">
30
    <div>
31
        <h4>Form 3</h4>
32
        <label>Name
33
            <input type="text" name="name" class="input-text" />
34
        </label>
35
        <label>Email
36
            <input type="text" name="email" class="input-text" />
37
        </label>
38
        <input type="submit" class="input-submit" value="Submit" />
39
        <input type="hidden" name="token" value="secret token goes here" />
40
    </div>
41
</form>

Jedes dieser Formulare zeigt auf eine andere Verarbeitungsdatei. Wie sieht jede dieser Dateien aus?

Verarbeitungsformular 1 (assets/inc/ex1-form1.php)

1
<?php
2
3
// Turn on error reporting so we can see if anything is going wrong

4
error_reporting(E_ALL);
5
ini_set('display_errors', 1);
6
7
// Make sure our faux-token was supplied

8
if( isset($_POST['token']) && $_POST['token']==='secret token goes here' )
9
{
10
    // Require the necessary class

11
    require_once 'class.copterlabs_account.inc.php';
12
13
    // Create a new instance of the class

14
    $account_obj = new CopterLabs_Account();
15
16
    // Handle the form submission

17
    $output = $account_obj->save_name();
18
19
    // For this example, just output some data about the form submission

20
    echo "<pre>Processing File: ", $_SERVER['PHP_SELF'],
21
            "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n",
22
            '<p><a href="../../">Go back</a></p>';
23
}
24
else
25
{
26
    die( 'Invalid form submission' );
27
}

Verarbeitungsformular 2 (assets/inc/ex1-form2.php)

1
<?php
2
3
// Turn on error reporting so we can see if anything is going wrong

4
error_reporting(E_ALL);
5
ini_set('display_errors', 1);
6
7
// Make sure our faux-token was supplied

8
if( isset($_POST['token']) && $_POST['token']==='secret token goes here' )
9
{
10
    // Require the necessary class

11
    require_once 'class.copterlabs_account.inc.php';
12
13
    // Create a new instance of the class

14
    $account_obj = new CopterLabs_Account();
15
16
    // Handle the form submission

17
    $output = $account_obj->save_email();
18
19
    // For this example, just output some data about the form submission

20
    echo "<pre>Processing File: ", $_SERVER['PHP_SELF'],
21
            "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n",
22
            '<p><a href="../../">Go back</a></p>';
23
}
24
else
25
{
26
    die( 'Invalid form submission' );
27
}

Verarbeitungsformular 3 (assets/inc/ex1-form3.php)

1
<?php
2
3
// Turn on error reporting so we can see if anything is going wrong

4
error_reporting(E_ALL);
5
ini_set('display_errors', 1);
6
7
// Make sure our faux-token was supplied

8
if( isset($_POST['token']) && $_POST['token']==='secret token goes here' )
9
{
10
    // Require the necessary class

11
    require_once 'class.copterlabs_account.inc.php';
12
13
    // Create a new instance of the class

14
    $account_obj = new CopterLabs_Account();
15
16
    // Handle the form submission

17
    $output = $account_obj->save_both();
18
19
    // For this example, just output some data about the form submission

20
    echo "<pre>Processing File: ", $_SERVER['PHP_SELF'],
21
            "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n",
22
            '<p><a href="../../">Go back</a></p>';
23
}
24
else
25
{
26
    die( 'Invalid form submission' );
27
}

Wie Sie sehen können, wiederholen in den Beispielen viel Code. Wenn Sie sie auf 15 Formulare auf einer Site erweitern, werden Sie schnell feststellen, dass der Service ein Albtraum sein kann.

Die Kontoklasse

Wie Sie sehen können, erstellen die Verarbeitungsdateien eine Instanz der Klasse CopterLabs_Account. Das ist eine sehr einfache Klasse, die Informationen zu einer Formularübermittlung ausgibt.

Hier ist der Code für die Klasse (assets/inc/class.coperlabs_account.inc.php):

1
<?php
2
3
/**

4
 * A simple class to test form submissions

5
 *

6
 * PHP version 5

7
 *

8
 * LICENSE: Dual licensed under the MIT or GPL licenses.

9
 *

10
 * @author    Jason Lengstorf <jason.lengstorf@copterlabs.com>

11
 * @copyright 2011 Copter Labs

12
 * @license   https://www.opensource.org/licenses/mit-license.html

13
 * @license   http://www.gnu.org/licenses/gpl-3.0.txt

14
 */
15
class CopterLabs_Account
16
{
17
18
    public $name = NULL,
19
           $email = NULL;
20
21
    public function save_name()
22
    {
23
        $this->name = htmlentities($_POST['name'], ENT_QUOTES);
24
25
        return "Method: " . __METHOD__ . "\nName: " . $this->name . "\n";
26
    }
27
28
    public function save_email()
29
    {
30
        $this->email = htmlentities($_POST['email'], ENT_QUOTES);
31
32
        return "Method: " . __METHOD__ . "\nEmail: " . $this->email . "\n";
33
    }
34
35
    public function save_both()
36
    {
37
        $this->name = htmlentities($_POST['name'], ENT_QUOTES);
38
        $this->email = htmlentities($_POST['email'], ENT_QUOTES);
39
40
        return "Method: " . __METHOD__ . "\nName: " . $this->name . "\nEmail: "
41
                . $this->email . "\n";
42
    }
43
44
}

Sie können diesen Code in Beispiel 1 auf der Demoseite ausprobieren.

Ein Arbeitsbeispiel mit einer einzelnen Verarbeitungsdatei und einer Switch-Anweisung

Eine weitere beliebte Lösung für die Formularverarbeitung besteht darin, alle Verarbeitungsskripte in einer Datei zu konsolidieren und mithilfe einer switch-Anweisung zu bestimmen, was mit den Daten geschehen soll.

Der Switch-Ansatz verwendet üblicherweise einen Trick, bei dem eine versteckte Eingabe zu dem Formular hinzugefügt wird, das eine Aktion enthält, die bei der Übermittlung ausgeführt werden soll. Diese
Aktion wird dann festgelegt, was mit dem Formular geschehen soll.

Hier sind die gleichen drei Formulare von oben mit hinzugefügten Aktionen, die alle auf eine einzelne Verarbeitungsdatei verweisen:

1
<form action="assets/inc/ex2-switch.php"
2
      method="post"
3
      id="ex2-form1">
4
    <div>
5
        <h4>Form 1</h4>
6
        <label>Name
7
            <input type="text" name="name" class="input-text" />
8
        </label>
9
        <input type="submit" class="input-submit" value="Submit" />
10
        <input type="hidden" name="action" value="update-name" />
11
        <input type="hidden" name="token" value="secret token goes here" />
12
    </div>
13
</form>
14
15
<form action="assets/inc/ex2-switch.php"
16
      method="post"
17
      id="ex2-form2">
18
    <div>
19
        <h4>Form 2</h4>
20
        <label>Email
21
            <input type="text" name="email" class="input-text" />
22
        </label>
23
        <input type="submit" class="input-submit" value="Submit" />
24
        <input type="hidden" name="action" value="update-email" />
25
        <input type="hidden" name="token" value="secret token goes here" />
26
    </div>
27
</form>
28
29
<form action="assets/inc/ex2-switch.php"
30
      method="post"
31
      id="ex2-form3">
32
    <div>
33
        <h4>Form 3</h4>
34
        <label>Name
35
            <input type="text" name="name" class="input-text" />
36
        </label>
37
        <label>Email
38
            <input type="text" name="email" class="input-text" />
39
        </label>
40
        <input type="submit" class="input-submit" value="Submit" />
41
        <input type="hidden" name="action" value="update-both" />
42
        <input type="hidden" name="token" value="secret token goes here" />
43
    </div>
44
</form>

Und die neue Verarbeitungsdatei sieht folgendermaßen aus: (assets/inc/ex2-switch.php)

1
<?php
2
3
// Turn on error reporting so we can see if anything is going wrong

4
error_reporting(E_ALL);
5
ini_set('display_errors', 1);
6
7
// Make sure our faux-token was supplied

8
if( isset($_POST['token']) && $_POST['token']==='secret token goes here' )
9
{
10
    // Require the necessary class

11
    require_once 'class.copterlabs_account.inc.php';
12
13
    // Create a new instance of the class

14
    $account_obj = new CopterLabs_Account();
15
16
    // Sanitize the action

17
    $action = htmlentities($_POST['action'], ENT_QUOTES);
18
19
    // Use the new 'action' hidden input to determine what action to call

20
    switch( $action )
21
    {
22
        // Form 1 handling

23
        case 'update-name':
24
            $output = $account_obj->save_name();
25
            break;
26
27
        // Form 2 handling

28
        case 'update-email':
29
            $output = $account_obj->save_email();
30
            break;
31
32
        // Form 3 handling

33
        case 'update-both':
34
            $output = $account_obj->save_both();
35
            break;
36
37
        // If no valid action is found, something isn't right

38
        default:
39
            die( 'Unsupported action.' );
40
    }
41
42
    // For this example, just output some data about the form submission

43
    echo "<pre>Processing File: ", $_SERVER['PHP_SELF'],
44
            "\nAction: ", htmlentities($_POST['action'], ENT_QUOTES),
45
            "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n",
46
            '<p><a href="../../#ex2">Go back to example 2</a></p>';
47
}
48
else
49
{
50
    die( 'Invalid form submission' );
51
}

Sie können das sehen, wenn Sie Beispiel 2 auf der Demoseite besuchen. Das ist eine deutliche Verbesserung gegenüber der Verwendung mehrerer Formulare, aber Sie können sehen, dass wir immer noch Code duplizieren.

Darüber hinaus ist es meine persönliche Präferenz, Switch-Anweisungen zu vermeiden, wann immer ich kann. Dies liegt an der Tatsache, dass der Schalter lose Vergleiche verwendet ('a string' löst 'case 0' aus, da eine Zeichenfolge 0 ergibt, wenn Sie sie in eine Ganzzahl konvertieren) und sich extrem einfach in Spaghetti-Code umwandeln lässt.


Korrektur des Problems: Lookup-Arrays und Variable Variablen

Wie wir bisher gesehen haben, haben beide oben genannten Lösungen ihre Nachteile und erfordern doppelten Code. Stellen Sie sich vor, es gäbe ein Dutzend oder mehr Formulare auf der Website - nicht hübsch.

Um dieses Problem zu korrigieren, können wir ein Konzept verwenden, das als Lookup-Array bezeichnet wird und die vom Formular übergebenen Aktionen einer für das Objekt aufgerufenen Methode zuordnet.

Ja, Sie können die Aktion als Methodennamen festlegen, aber dadurch kann eine falsche Formularübermittlung jede öffentliche Methode aufrufen. Das Array zu einem Schlüssel-Wert-Paar zu machen, ist ein kleiner Schritt, um ohne viel zusätzlichen Aufwand ein wenig mehr Kontrolle hinzuzufügen.

Ein Arbeitsbeispiel mit einer einzelnen Verarbeitungsdatei und einem Lookup-Array

Verwenden Sie unser Wissen über variable Variablen zu Beginn dieses Tutorials und ändern Sie unsere Demo, um ein Lookup-Array zu verwenden.

Ändern Sie die drei Formulare so, dass sie auf eine neue Controller-Datei verweisen:

1
<form action="assets/inc/ex3-lookup-array.php"
2
      method="post"
3
      id="ex3-form1">
4
    <div>
5
        <h4>Form 1</h4>
6
        <label>Name
7
            <input type="text" name="name" class="input-text" />
8
        </label>
9
        <input type="submit" class="input-submit" value="Submit" />
10
        <input type="hidden" name="action" value="update-name" />
11
        <input type="hidden" name="token" value="secret token goes here" />
12
    </div>
13
</form>
14
15
<form action="assets/inc/ex3-lookup-array.php"
16
      method="post"
17
      id="ex3-form2">
18
    <div>
19
        <h4>Form 2</h4>
20
        <label>Email
21
            <input type="text" name="email" class="input-text" />
22
        </label>
23
        <input type="submit" class="input-submit" value="Submit" />
24
        <input type="hidden" name="action" value="update-email" />
25
        <input type="hidden" name="token" value="secret token goes here" />
26
    </div>
27
</form>
28
29
<form action="assets/inc/ex3-lookup-array.php"
30
      method="post"
31
      id="ex3-form3">
32
    <div>
33
        <h4>Form 3</h4>
34
        <label>Name
35
            <input type="text" name="name" class="input-text" />
36
        </label>
37
        <label>Email
38
            <input type="text" name="email" class="input-text" />
39
        </label>
40
        <input type="submit" class="input-submit" value="Submit" />
41
        <input type="hidden" name="action" value="update-both" />
42
        <input type="hidden" name="token" value="secret token goes here" />
43
    </div>
44
</form>

Stellen Sie als Nächstes die Verarbeitungsdatei zusammen, die die Formularübermittlung verarbeitet (assets/inc/ex3-lookup-array.php):

1
<?php
2
3
// Turn on error reporting so we can see if anything is going wrong

4
error_reporting(E_ALL);
5
ini_set('display_errors', 1);
6
7
// Make sure our faux-token was supplied

8
if( isset($_POST['token']) && $_POST['token']==='secret token goes here' )
9
{
10
    // Require the necessary class

11
    require_once 'class.copterlabs_account.inc.php';
12
13
    // Create a new instance of the class

14
    $account_obj = new CopterLabs_Account();
15
16
    // Sanitize the action

17
    $action = htmlentities($_POST['action'], ENT_QUOTES);
18
19
    // Set up a lookup array to match actions to method names

20
    $lookup_array = array(
21
        'update-name' => 'save_name',
22
        'update-email' => 'save_email',
23
        'update-both' => 'save_both'
24
    );
25
26
    // Make sure the array key exists

27
    if( array_key_exists($action, $lookup_array) )
28
    {
29
        // Using variable variables, call the proper method and store the output

30
        $output = $account_obj->$lookup_array[$action]();
31
    }
32
    else
33
    {
34
        die( 'Unsupported action.' );
35
    }
36
37
    // For this example, just output some data about the form submission

38
    echo "<pre>Processing File: ", $_SERVER['PHP_SELF'],
39
            "\nAction: ", htmlentities($_POST['action'], ENT_QUOTES),
40
            "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n",
41
            '<p><a href="../../#ex3">Go back to example 3</a></p>';
42
}
43
else
44
{
45
    die( 'Invalid form submission' );
46
}

Überprüfen Sie dies auf der Demoseite, indem Sie die Formulare in Beispiel 3 ausprobieren.

Da wir die Aktion als Schlüssel im Array festlegen, verwenden wir array_key_exists(), um sicherzustellen, dass die Aktion gültig ist. Dann verwenden wir den Wert, der der Aktion entspricht, als Methodennamen. Beachten Sie, dass wir die Klammern nach dem Wert hinzugefügt haben, um sicherzustellen, dass er als Methode ausgeführt wird.

Durch das Hinzufügen des Lookup-Arrays bleibt der Code präzise, einfach und klar (sobald Sie den Überblick über variable Variablen erhalten haben).


Schlussfolgerung

Wenn wir verantwortungsvoll arbeiten, können Lookup-Arrays das Update und Wartung Ihrer Skripte erheblich vereinfachen, wenn Sie sie mit variablen Variablen kombinieren.

Wie können Sie Ihrer Meinung nach Lookup-Arrays und variable Variablen in Ihre Projekte integrieren, um die Wartung zu vereinfachen? Lass es mich in den Kommentaren wissen!