it-swarm.com.de

php $ _GET und undefined index

Ein neues Problem ist für mich aufgetreten, als ich versuchte, mein Skript auf einem anderen PHP Server auszuführen.

Auf meinem alten Server scheint der folgende Code gut zu funktionieren - auch wenn kein s-Parameter deklariert ist. 

<?php
 if ($_GET['s'] == 'jwshxnsyllabus')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
if ($_GET['s'] == 'aquinas')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
 if ($_GET['s'] == 'POP2')
echo "<body onload=\"loadSyllabi('POP2')\">";
elseif ($_GET['s'] == null)
echo "<body>"
?>

Auf einem lokalen Server auf meinem lokalen Computer (XAMPP - Apache) erhalte ich folgende Fehlermeldung, wenn für s kein Wert definiert ist.

Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 43
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 45
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 47
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 49

Was ich tun möchte, damit das Skript bestimmte Javascript-Funktionen aufruft, wenn für s ein Wert deklariert ist, aber wenn nichts deklariert ist, möchte ich, dass die Seite normal geladen wird. 

Kannst du mir helfen?

39
Jeff

Bei der Fehlerberichterstattung wurden auf dem vorherigen Server keine Hinweise angezeigt, weshalb Sie die Fehler nicht gesehen haben.

Sie sollten prüfen, ob der Index s tatsächlich im $_GET-Array vorhanden ist, bevor Sie versuchen, ihn zu verwenden.

So etwas würde ausreichen:

if (isset($_GET['s'])) {
    if ($_GET['s'] == 'jwshxnsyllabus')
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
    else if ($_GET['s'] == 'aquinas')
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
    else if ($_GET['s'] == 'POP2')
        echo "<body onload=\"loadSyllabi('POP2')\">";
} else {
    echo "<body>";
}

Wenn Sie mehr Fälle hinzufügen möchten, kann es von Vorteil sein, eine switch-Anweisung zu verwenden, um den Code lesbarer zu machen.

switch ((isset($_GET['s']) ? $_GET['s'] : '')) {
    case 'jwshxnsyllabus':
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
        break;
    case 'aquinas':
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">";
        break;
    case 'POP2':
        echo "<body onload=\"loadSyllabi('POP2')\">";
        break;
    default:
        echo "<body>";
        break;
}

BEARBEITEN: Übrigens, der erste Satz von Code, den ich geschrieben habe, ahmt nach, was von Ihnen als Ganzes getan werden soll. Ist das erwartete Ergebnis eines unerwarteten Werts in ?s= dazu gedacht, kein <body>-Tag auszugeben, oder war dies ein Versehen? Beachten Sie, dass der Switch dies korrigiert, indem standardmäßig <body> verwendet wird.

58
Rudi Visser

Gewöhnen Sie sich an, zu überprüfen, ob eine Variable mit isset verfügbar ist, z.

if (isset($_GET['s']))
{
     //do stuff that requires 's'
}
else
{
     //do stuff that doesn't need 's'
}

Sie können das Melden von Benachrichtigungen deaktivieren, aber der Umgang mit ihnen ist eine gute Hygiene und ermöglicht es Ihnen, Probleme zu entdecken, die Sie sonst vermissen könnten.

6
Paul Dixon

Ich verwende immer eine Utility-Funktion/-Klasse zum Lesen aus den Arrays $ _GET und $ _POST, um nicht immer prüfen zu müssen, ob der Index vorhanden ist ... So etwas wird den Trick erfüllen.

class Input {
function get($name) {
    return isset($_GET[$name]) ? $_GET[$name] : null;
}

function post($name) {
    return isset($_POST[$name]) ? $_POST[$name] : null;
}

function get_post($name) {
    return $this->get($name) ? $this->get($name) : $this->post($name);
}
}
$input = new Input;
$page = $input->get_post('page');
5
evilunix

Ich hatte das gleiche Problem in Localhost mit Xampp. Jetzt verwende ich diese Kombination von Parametern:

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

php.net: http://php.net/manual/pt_BR/function.error-reporting.php

3
rodrigoio

Tatsächlich würde keine der vorgeschlagenen Antworten, obwohl dies eine bewährte Methode ist, die Warnung entfernen.

Der Richtigkeit halber würde ich Folgendes tun:

function getParameter($param, $defaultValue) {
    if (array_key_exists($param, $_GET)) {
        $value=$_GET[$param];
        return isSet($value)?$value:$defaultValue;
    }
    return $defaultValue;
}

Auf diese Weise überprüfe ich das _GET-Array auf Existenz des Schlüssels, ohne die Warnung auszulösen. Es ist keine gute Idee, die Warnungen zu deaktivieren, da sie oft interessant sind.

Um die Funktion zu nutzen, tun Sie einfach:

$myvar = getParameter("getparamer", "defaultValue")

wenn der Parameter vorhanden ist, erhalten Sie den Wert. Wenn dies nicht der Fall ist, erhalten Sie den Standardwert.

1
rupps

Prüfen Sie zunächst, ob der $_GET['s'] eingestellt ist oder nicht. Ändern Sie Ihre Bedingungen so

<?php
if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
elseif (isset($_GET['s']) && $_GET['s'] == 'POP2')
echo "<body onload=\"loadSyllabi('POP2')\">";
elseif (isset($_GET['s']) && $_GET['s'] == null)
echo "<body>"
?>

Und behandeln Sie auch Ihre ifelse Bedingungen richtig

1
Awais Qarni

Ich empfehle Ihnen, Ihre Arrays zu überprüfen, bevor Sie blind auf sie zugreifen: 

if(isset($_GET['s'])){
    if ($_GET['s'] == 'jwshxnsyllabus')
        /* your code here*/
}

Eine weitere (schnelle) Korrektur besteht darin, die Fehlerberichterstattung zu deaktivieren, indem Sie dies oben in das Skript schreiben: 

error_reporting(0);  

In Ihrem Fall ist es sehr wahrscheinlich, dass die Konfiguration für Fehlerberichte in php.ini auf Ihrem anderen Server standardmäßig auf 0 gesetzt wurde.
Wenn Sie den error_reporting mit 0 als Parameter aufrufen, deaktivieren Sie alle Benachrichtigungen/Warnungen und Fehler. Für mehr Details, schau in dem PHP-Handbuch

Denken Sie daran, dass dies eine schnelle Lösung ist, und es wird dringend empfohlen, Fehler zu vermeiden, anstatt sie zu ignorieren.

0
gion_13

Sie sollten prüfen, ob der Index existiert, bevor Sie ihn verwenden

if (isset($_GET['s']) AND $_GET['s'] == 'foobar') {
    echo "foo";
}

Verwenden Sie E_ALL | E_STRICT während der Entwicklung!

0
erenon

Einfache Funktion, arbeitet mit GET oder POST. Außerdem können Sie einen Standardwert zuweisen.

function GetPost($var,$default='') {
    return isset($_GET[$var]) ? $_GET[$var] : (isset($_POST[$var]) ? $_POST[$var] : $default);
}
0
bolhaskutya

Eine andere Option wäre die Unterdrückung der PHP undefinierten Indexbenachrichtigung mit dem @-Symbol vor der GET-Variablen:

$s = @$_GET['s'];

Dadurch wird die Benachrichtigung deaktiviert. Es ist besser zu prüfen, ob die Variable gesetzt wurde und entsprechend zu handeln. 

Das funktioniert aber auch.

0
Floris

Vermeiden Sie wenn, sonst und sonstiges!

$loadMethod = "";
if(isset($_GET['s'])){
    switch($_GET['s']){
        case 'jwshxnsyllabus':
            $loadMethod = "loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')";
        break;
        case 'aquinas':
            $loadMethod = "loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')";
        break;
        case 'POP2':
            $loadMethod = "loadSyllabi('POP2')";
    }
}

echo '<body onload="'.$loadMethod.'">';

sauberer, lesbarer Code ist wartbarer Code

0
SparK