• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

register_globals off. Content in Template, wenn Variable vorhanden.

aJunkie

Mitglied
Ich habe gestern die register_globals auf off gesetzt und jetzt funktioniert natürlich folgendes nicht:

Wenn URL: domain.de/template.php?variable

sollte im Template:
PHP:
<?php if (isset($variable)): ?>
// Inhalt
<?php endif; ?>

passieren. Es funktioniert natürlich nicht mehr.
Habe es alternativ mit $_COOKIE versucht, auch kein Erfolg.

Was wäre jetzt die Alternative, dass es auch ohne register_globals funktioniert?
 
Du willst ja keinen Cookie auslesen. Du möchtest ja wohl die daten haben, die Per Url übergeben werden, oder nicht? Wenn ja, dann mach es mit $_GET['variable'] wenn deine URL wie folgt aussieht: "bla.de/template.php?variable=xyz". mit $_GET['variable'] bekommst du dann den Wert (in diesem Fall xyz).
 
Okay, danke.
Also kann man es nicht besser machen als jetzt...? Da wollte ich mir sicher sein.

Und da ist noch was... vor Kurzem erst wurde <form action="was nun"> behandelt, dass ich da kein PHP Self nutzen soll bzw. es nicht brauche.

Aber ist es hier so nicht besser und sicher?
<form action="<?php echo htmlspecialchars ($_SERVER['PHP_SELF']); ?>" method="get">

In der LernDVD heißt es, dass es zwar so funktionier <form action="">, aber man sollte bestenfalls immer etwas eintragen.
 
In der LernDVD heißt es, dass es zwar so funktionier <form action="">, aber man sollte bestenfalls immer etwas eintragen.

Ich würde nicht sagen, dass das falsch ist. Dennoch:

- action="" (als Verweis auf "die aktive URL" -- das ist jetzt nicht völlig exakt) ist laut Spezifikation korrekt.
- Leute mit mehr Ahnung als ich empfehlen die Verwendung.
- Mir ist kein "gewöhnlicher" Fall bekannt, in dem es damit Probleme gibt.

Ich lasse das Attribut eigentlich immer leer, wenn ich nicht gerade mit einem Framework programmiere, das es von sich aus setzt bzw. das Funktionen zum unkomplizierten Setzen bereitstellt.

$_SERVER['PHP_SELF'] ist eigentlich nie eine gute Wahl. $_SERVER['SCRIPT_NAME'] wäre besser.
 
Jetzt muss ich doch noch einmal nachfragen.

In der Lern DVD wird häufig mit register_globals gearbeitet.

Stattdessen sollte ich superglobals nehmen, oder?

Also nicht
PHP:
<?php if (isset($variable)
//
?>

// sondern

<?php if ($_POST['variable'])
//
?>

Statt isset immer $_POST und $_GET?

Bissl durcheinander, gerade register_globals von nicht register_globals zu unterscheiden.
 
isset muss schon bleiben. isset() prüft ja nur, ob eine Variable gesetzt ist oder nicht. Je nachdem gibt sie true oder false zurück. Also: if(isset($_POST['variable'])) { //Befehle } <---- Heißt soviel wie: wenn "variable" gesetzt ist, dann führe das in {} aus.
 
Das verstehe ich ja.
Aber ist das jetzt register_globals oder nicht?

Ich verstehe das so:

register_globals:
PHP:
<?php if (isset($variable))
//
?>
Ohne register_globals:
PHP:
<?php if(isset($_POST['variable']))
//
?>
Verstehe ich das richtig?
Ich sollte nicht einfach nur $variable machen (register_globals), sondern immer posten oder getten?
 
Ja. Du solltest auf POST- und GET-Daten nur über die superglobalen Arrays $_POST und $_GET zugreifen. Die einzelnen Felder darin können gesetzt sein, müssen es aber nicht (deshalb Prüfung mit isset() oder empty()).

Bei entsprechenden error_handling-Einstellungen beschwert sich PHP übrigens auch über nicht gesetzte Array-Indizes:

PHP:
<?php

error_reporting(-1); // = alle Errors/Notices anzeigen

echo $_POST['nichtgesetzt'];
// Notice: Undefined index: nichtgesetzt in index.php  on line 5
 
Genau diese Fehlermeldung bekomme ich nicht weg, weil anscheinend mehr gemacht werden muss, als ich es im Moment tue.

PHP:
<?php
if (isset($fahrschule) && $_GET['fahrschule'] == "rechne") {
if (isset($_GET['kmh']) && !is_array($_GET['kmh']) && (!empty($_GET['kmh']))) {
    $_GET['reaktionsweg'] = ($kmh / 10) * 3;
    $bremsweg = ($kmh / 10) * ($kmh / 10);
    $gbremsweg = ($kmh / 10) * ($kmh / 10 / 2);
    $anhalteweg = $reaktionsweg + $bremsweg;
    $ganhalteweg = $reaktionsweg + $gbremsweg;
 }
}
?>
<h1>Fahrschulrechner</h1>
<form action="" method="get">
<p>Ich fahre <input type="text" name="kmh" size="4" value="<?php if(isset($_GET['fahrschule'])) echo $_GET['kmh']; ?>"> km/h. 
<input type="hidden" name="fahrschule" value="rechne">
<input type="submit" value="Berechnen"></p>
</form>
<?php if(isset($_GET['fahrschule'])): ?>
<p>Reaktionsweg: <?php echo $_GET['reaktionsweg']; ?> m</p>
<p>Bremsweg: <?php echo $_GET['bremsweg']; ?> m</p>
<p>Bremsweg bei Gefahr: <?php echo $_GET['gbremsweg']; ?> m</p>
<p>Anhalteweg: <?php echo $_GET['anhalteweg']; ?> m</p>
<p>Anhalteweg bei Gefahr: <?php echo $_GET['ganhalteweg']; ?> m</p>
<?php endif; ?>

Erst wenn kmh gegeben ist, werden die anderen Variablen geschaffen!?
 
So habe ich es hinbekommen, aber das ist doch pervers? :-O

PHP:
<?php
if (isset($_POST['fahrschule']) && $_POST['fahrschule'] == "rechne") {
if (isset($_POST['kmh']) && (!empty($_POST['kmh']))) {
    $_POST['reaktionsweg'] = 0;
    $_POST['reaktionsweg'] = ($_POST['kmh'] / 10) * 3;
    $_POST['bremsweg'] = ($_POST['kmh'] / 10) * ($_POST['kmh'] / 10);
    $_POST['gbremsweg'] = ($_POST['kmh'] / 10) * ($_POST['kmh'] / 10 / 2);
    $_POST['anhalteweg'] = $_POST['reaktionsweg'] + $_POST['bremsweg'];
    $_POST['ganhalteweg'] = $_POST['reaktionsweg'] + $_POST['gbremsweg'];
    
    if(($_POST['kmh'] == "") || !is_numeric($_POST['kmh'])) {
    $_POST['fehler'] = "";
    $_POST['fehler'] .= "Bitte nur Zahl eingeben!";    
    }
 }

 if(isset($_POST['reset'])) {
    unset($_POST['kmh']);
 }
 
}
?>
<h1>Fahrschulrechner</h1>
<form action="" method="post">
<p>Ich fahre <input type="text" name="kmh" size="4" value="<?php if(!empty($_POST['kmh'])) echo htmlspecialchars($_POST['kmh']); ?>"> km/h. 
<input type="hidden" name="fahrschule" value="rechne">
<input type="submit" value="Berechnen"></p>
</form>
<?php if(!empty($_POST['fehler'])) echo htmlspecialchars($_POST['fehler']); ?>
<?php if(!empty($_POST['kmh']) && (empty($_POST['fehler']))): ?>
<p>Reaktionsweg: <?php echo htmlspecialchars($_POST['reaktionsweg']); ?> m</p>
<p>Bremsweg: <?php if(!empty($_POST['bremsweg'])) echo htmlspecialchars($_POST['bremsweg']); ?> m</p>
<p>Bremsweg bei Gefahr: <?php if(!empty($_POST['gbremsweg'])) echo htmlspecialchars($_POST['gbremsweg']); ?> m</p>
<p>Anhalteweg: <?php if(!empty($_POST['anhalteweg'])) echo htmlspecialchars($_POST['anhalteweg']); ?> m</p>
<p>Anhalteweg bei Gefahr: <?php if(!empty($_POST['ganhalteweg'])) echo htmlspecialchars($_POST['ganhalteweg']); ?> m</p>
<form action="" method="post">
<input type="submit" name="reset" value="Löschen">
</form>
<?php endif; ?>
 
Zuletzt bearbeitet:
Ich decke dich noch mal mit etwas Code ein:

PHP:
<?php

/**
 * Stellt fest, ob alle benötigten Werte im POST-/GET-/COOKIE- bzw. REQUEST-Feld
 * gesetzt sind
 *
 * Hintergrund: Es ist für den Client möglich, nur bestimmte POST-Felder zurück
 * an den Server zu schicken. Wenn wir das ganz zu Beginn der Auswertung einmal
 * zentral prüfen, können wir danach davon ausgehen, dass alle erwarteten Felder
 * gesetzt sind. Das spart ewige isset()-Aufrufe.
 *
 * Diese Funktion sollte zentral in ein Include ausgelagert werden.
 *
 * @param array  $needles Feld von Feldnamen, die gesetzt sein müssen
 * @param string $where   Nachsehen in GET, POST, COOKIE oder REQUEST
 *                        (Standard: POST)
 * @return array Feld mit Fehlermeldungen
 */
function istGesetzt(array $needles, $where = 'POST')
{
    $where  = strtoupper($where);
    $errors = array();
    $a      = null;

    switch ($where) {
        case 'GET'    : $a = &$_GET;     break;
        case 'POST'   : $a = &$_POST;    break;
        case 'COOKIE' : $a = &$_COOKIE;  break;
        case 'REQUEST': $a = &$_REQUEST; break;
        default:
            throw new IllegalArgumentException(
                    '$where needs to be "GET", "POST", "COOKIE" or "REQUEST"');
            break;
    }

    foreach ($needles as $needle) {
        $a[$needle] = trim($a[$needle]);

        if (!isset($a[$needle]) || $a[$needle] === '') {
            $errors[] = 'Feld "' . $needle . '" nicht gesetzt';
        }
    }

    return $errors;
}

/**
 * Sichert einen String vor XSS-Attacken
 *
 * Es ist sinnvoll, diese Funktion auszulagern, um die Ausgabe schnell von UTF-8
 * auf ISO-8859-1 oder so umstellen zu können (erfordern unterschiedliche Escape-
 * Funktionen).
 *
 * Diese Funktion sollte zentral in ein Include ausgelagert werden.
 *
 * @param string $string
 * @return string
 */
function escape($string)
{
    return htmlspecialchars($string);
}



function actionIndex(array &$vars)
{
    // Keine Template-Variablen müssen verändert werden
}

function actionRechne(array &$vars)
{
    // Prüfen, ob alle Werte gesetzt
    $vars['errors'] = istGesetzt(array('kmh'));

    // Falls ja, prüfen, ob alle Werte sinnvollen Inhalt besitzen
    if (empty($vars['errors'])) {
        $_POST['kmh'] = (float) $_POST['kmh'];

        if ($_POST['kmh'] <= 0) {
            $vars['errors'][] = 'km/h muss größer als 0 sein';
        }
    }

    // Falls ja, weitere Werte zur Ausgabe errechnen
    if (empty($vars['errors'])) {
        $vars['reaktionsweg'] = ($_POST['kmh'] / 10) * 3;
        $vars['bremsweg']     = ($_POST['kmh'] / 10) * ($_POST['kmh'] / 10);
        $vars['gbremsweg']    = ($_POST['kmh'] / 10) * ($_POST['kmh'] / 10 / 2);
        $vars['anhalteweg']   = $vars['reaktionsweg'] + $vars['bremsweg'];
        $vars['ganhalteweg']  = $vars['reaktionsweg'] + $vars['gbremsweg'];
    }
}

function actionReset(array &$vars)
{
    // Keine Template-Variablen müssen verändert werden
}

function actionPotenzrechner(array &$vars)
{
    // Prüfen, ob alle Werte gesetzt
    $vars['errors'] = istGesetzt(array('base', 'exponent'));

    // Falls ja, prüfen, ob alle Werte sinnvollen Inhalt besitzen
    if (empty($vars['errors'])) {
        $_POST['base']     = (float) $_POST['base'];
        $_POST['exponent'] = (int) $_POST['exponent'];
    }

    // Falls ja, weitere Werte zur Ausgabe errechnen
    if (empty($vars['errors'])) {
        $vars['result'] = bcpow($_POST['base'], $_POST['exponent']);
    }
}



/*
 * Dieser Teil ist beliebig wiederverwendbar. Hier wird die aktuell nachgefragte
 * Action ermittelt und ausgeführt und die Template-Variablen werden im globalen
 * Namensraum bekanntgemacht
 */

$_POST['action'] = (isset($_POST['action']))
    ? strtolower(trim($_POST['action']))
    : 'index';

$tplVars  = array();
$tplVars['action'] = $_POST['action'];

$actionFunction = 'action' . ucfirst($_POST['action']);

if (!function_exists($actionFunction)) {
    throw new BadFunctionCallException(
            'Action "' . $_POST['action'] . '" does not exist');
} else {
    $actionFunction($tplVars);
}

unset($actionFunction);

extract($tplVars);

?>




<?php if ($action === 'reset'): ?>
    <p>Formular zurückgesetzt.</p>
<?php endif; ?>

<?php if (!empty($errors)): ?>
    <h2>Fehler!</h2>

    <?php foreach ($errors as $error): ?>
        <p>Fehler: <?php echo escape($error); ?></p>
    <?php endforeach; ?>

    <hr />
<?php endif; ?>

<h1>Fahrschulrechner</h1>

<form action="" method="post">
    <p>Ich fahre
        <input type="text" name="kmh" size="4"
               value="<?php if(isset($_POST['kmh'])) echo escape($_POST['kmh']); ?>"> km/h.
        <input type="hidden" name="action" value="rechne">
        <input type="submit" value="Berechnen">
    </p>
</form>

<?php if ($action === 'rechne' && empty($errors)): ?>

    <p>Reaktionsweg: <?php echo escape($reaktionsweg); ?> m</p>
    <p>Bremsweg: <?php echo escape($bremsweg); ?> m</p>
    <p>Bremsweg bei Gefahr: <?php echo escape($gbremsweg); ?> m</p>
    <p>Anhalteweg: <?php echo escape($anhalteweg); ?> m</p>
    <p>Anhalteweg bei Gefahr: <?php echo escape($ganhalteweg); ?> m</p>
    <form action="" method="post">
        <input type="hidden" name="action" value="reset">
        <input type="submit" name="reset" value="Löschen">
    </form>
    
<?php endif; ?>

<hr />

<h2>Irgendwas völlig Anderes:</h2>

<p>Potenzrechner:</p>

<form method="post" action="">
    <p>Basis: <input type="text" name="base"
                     value="<?php if(isset($_POST['base'])) echo escape($_POST['base']); ?>" /></p>
    <p>Exponent: <input type="text" name="exponent"
                        value="<?php if(isset($_POST['exponent'])) echo escape($_POST['exponent']); ?>" /></p>
    <p>
        <input type="hidden" name="action" value="potenzrechner" />
        <input type="submit" value="Rechnen" />
    </p>
</form>

<?php if ($action === 'potenzrechner' && empty($errors)): ?>
    <p>Ergebnis: <?php echo escape($_POST['base']) . '^' . escape($_POST['exponent']); ?>
        = <?php echo escape($result); ?></p>
<?php endif; ?>

<hr />

<h2>Illegale Action aufrufen</h2>

<form method="post" action="">
    <p><input type="hidden" name="action" value="bogus" />
        <input type="submit" value="Test" />
    </p>
</form>

<hr />

<h2>Ausgelöste Action</h2>
<p><?php echo escape($action); ?></p>

Das ist ein grundsätzliches Designmuster zum Aufbau von Seiten/Formularen.[1] Jeder Request (also jede Anfrage vom Client) wird als "Action" interpretiert. Das Laden der eigentlichen Seite hier etwa als "index"-Action, das Abschicken deines Formulars als "rechne"-Action und so weiter. Je nach Action wird automatisch die zugehörige Funktion aufgerufen, die beliebig Variablen setzen kann, die nachher im HTML-Template (also in der Ausgabe) zur Verfügung stehen.

Zusätzlich zu deiner Funktionalität habe ich noch ein weiteres Beispiel ergänzt, um zu verdeutlichen, wie sehr sich die Vorgehensweise vereinheitlichen und schematisieren lässt.

Selbst wenn du nicht gleich alles verstehst, zeigt dieses Beispiel vielleicht, wie sich Anfragen/Formularauswertungen in eine wiederkehrende Abfolge von Schritten zerlegen lassen.



[1] Nicht unbedingt in dieser Art der Umsetzung, aber generell schon. :)
 
Zuletzt bearbeitet:
Danke für deine Mühe und das nicht nur in diesem Thread.

Ich kann nachvollziehen, was dein Code macht, aber ganz verstanden habe ich es nicht. Das stimmt.

Bin davon noch weit entfernt.

Danke nochmal. *Lesezeichen setz*
 
Zurück
Oben