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

Notice: Undefined index

rapid10

Mitglied
Hallo,

habe jetzt mal während dem Entwickeln alle Fehler/Notice/Deprecated-Meldungen erlaubt. Und siehe da, viele Notice-Meldungen. Unter anderem eine Meldung, die ich noch nicht oft zu Gesicht bekommen habe, nämlich Notice: Undefined offset.

Den Grund kenne ich, nur möchte das mit dem Beheben nicht so ganz hinhauen. Die Notice-Meldung wird angezeigt, wenn ein Array aufgerufen wird, dessen Index nicht existiert.

Ich habe jetzt eine Funktion, die prüft, ob ein Datum korrekt ist. Man gibt der Funktion unter anderem den Parameter $sep (das Trennzeichen). Anhand dieses Trennzeichens wird der String getrennt. Was ist, wenn dieses Trennzeichen nun nicht existiert? Es erscheint diese Fehlermeldung.

Genau das selbe mit $_POST: Möchte ich, dass nach einer fehlerhaften Benutzereingabe, die bereits beschriebenen Felder erhalten bleiben, schreibe ich normalerweise
PHP:
<input value="<?php echo $_POST[date]; ?>" />
da passiert aber beim ersten Aufruf der Fehler: Array Index existiert nicht.

Nun würde ich gerne wissen, wie man diese nervige Meldung beseitigen kann – und bitte ohne die Fehlerbenachrichtigung abzuschalten. ;)

Danke schon jetzt für eure Tipps.

EDIT: Das ist ein Teil meiner Datumsvalidierung:
PHP:
$date_elements = explode($sep, $value);
checkdate($date_elements[1], $date_elements[0], $date_elements[2])
 
Werbung:
$_POST[date] ist bestimmt in 99% der Fälle falsch. Es ist $_POST['date']. date ohne Anfürhungszeichen ist nur dann richtig, wenn date eine Konstante ist.
 
Werbung:
@mermshaus: danke, und welchen Wert empfiehlst du dem Array zu zuweisen? Einfach einen leeren String?

@Asterixus: du hast Recht! Habe ich aber nur in meinem Beitrag vergessen. ;)
 
Danke dir, aber leider funktioniert das nicht. Habe es dann mit einer "normalen" If-Verzweigung probiert und da hat es funktioniert. Ich würde das Problem aber gerne in einer Zeile lösen.
Mache ich noch etwas falsch?

EDIT: Da fällt mir noch ein: Wäre es möglich, diese Array-Überprüfung durch eine (Benutzerdefinierte-) Funktion zu ersetzen? Man gibt der Funktion das Array als Parameter, der Rest wird in der Funktion abgearbeitet. Zurückgegeben wird entweder das (existierende) übergebene Array oder ein neues leeres Array.
 
Zuletzt bearbeitet:
Werbung:
Danke dir, aber leider funktioniert das nicht. Habe es dann mit einer "normalen" If-Verzweigung probiert und da hat es funktioniert. Ich würde das Problem aber gerne in einer Zeile lösen.
Hast du mermshaus Beispiel 1:1 übernommen? Falls ja: das name-Attribut mit dem Wert date muss natürlich im Input Element vorhanden sein.


PHP:
<input value="<?php echo (isset($_POST['date'])) ? htmlentities($_POST['date']) : ''; ?>" name="date" />
 
Natürlich habe ich das nicht 1:1 übernommen. ;) Habe nur die if-Verzweigung in mein value eingefügt. Und in dem input-Feld steht auch name='date'. Muss das eventuell nach der Verzweigung stehen?
 
Werbung:
PHP:
echo "<input type='text' name='date' value='".(isset($_POST['date'])) ? $_POST['date'] : ''."' />";
Habe jetzt auch einmal versucht, eine Methode zu definieren:
PHP:
public static function checkArray($array)
	{
		if(!isset($array))
		{
			$array = '';
			return $array;
		}
		else
		{
			return $array;
		}
	}
Die haut aber leider auch nicht so hin, wie sie sollte. ;) Danke für deine Hilfe!
 
Willst du eine Klassen Methode oder eine Funktion? Public und static sind Dinge, die du nur in Klasse verwenden kannst.

Entweder so:
PHP:
<?php
class eine_Klasse 
{
    public static function checkArray($array)
    {
        if(!isset($array)) {
            $array = '';
            return $array;
        } else {
            return $array;
        }
    } 
}
?>

Aufrufen tust du die statische Methode mit:
PHP:
<?php
eine_Klasse::checkArray($array);
?>


Oder einfach nur eine Funktion:
PHP:
<?php
function checkArray($array)
{
     if(!isset($array)) {
         $array = '';
         return $array;
     } else {
         return $array;
     }
}
?>

Aufrufen tust du die Funktion mit

PHP:
<?php
checkArray($array);
?>


Wobei der inhalt, der im Funktionsrumpf steht ziemlich sinnlos ist. Wozu brauchst du überhaupt diese Funktion?



Zeig bitte mal das ganze Formular her.
 
Ich weiß schon, was der Unterschied zwischen Methode und Funktion ist. ;)

Und wieso ist das unnötig? Ich möchte so einfach wie möglich prüfen können, ob das Array leer ist oder bereits Inhalt hat. Falls nicht muss einfach ein leeres Array daraus gemacht werden. :) Oder ist der Ansatz sogar völlig falsch?
 
Werbung:
Mit isset überprüfst du die Existenz einer Variable.
Wenn du überprüfen willst, ob ein Array leer ist, machst du folgendes:
$array == array();
oder count($array) === 0;
 
Vielen Dank! Jetzt greift immerhin die Methode. Nur die Notice-Meldung ist noch immer da.
PHP:
public static function checkArray($array)
	{
		if($array == array())
		{
			$array = '';
			return $array;
		}
		else
		{
			return $array;
		}
	}
PHP:
echo "<input type='text' name='date' value='".\System\Security::checkArray($_POST['date'])."' />";
Wenn ich statt einem leeren String einen Wert (z.B. "hallo") einfüge, erscheint dieser Wert auf im Input-Feld. Doch die Meldung von PHP bleibt. Was ist da das Problem?
Code:
Notice: Undefined index: date in XXX.php on line 175
 
HTML Code sollte man in Single Quotes ausgeben:

PHP:
echo '<input type="text" name="date" value="'.\System\Security::checkArray($_POST['date']).'" />';

Was passiert denn bei diesem if Konstrukt:

PHP:
if (is_array($_POST['date']) 
    echo '$_POST[\'date\'] ist ein Array';
else
    echo '$_POST[\'date\'] ist kein Array';
 
Zuletzt bearbeitet:
Werbung:
Nur "ist kein Array" wird ausgegeben. Nicht mal der Array-Inhalt wird ausgegeben.
Hab es auch schon mit der Methode probiert. Wenn ich
PHP:
\System\Security::checkArray($_POST['date']);

if (is_array($_POST['date']))
{
	echo $_POST['date'].'ist ein Array';
}
else
{
	echo $_POST['date'].'ist kein Array';
}
schreibe, erscheint auch: "ist kein Array".
Es muss etwas beim Füllen des nicht vorhandenen Array schief gehen. Aber was nur?
 
Ok hast mich wohl falsch verstanden.

Damit wollte ich sagen, dass $_POST ein Array ist, $_POST['data'] nur ein Element dieses Arrays.

Schreib den Code so:

PHP:
<?php
public static function checkArray($arrayElement)
{
    if (isset((string)$arrayElement)) {
        return trim(htmlentities($arrayElement)); 
    } else {
        return '';
    }
}  

echo '<input type="text" name="date" value="'.\System\Security::checkArray($_POST['date']).'" />';

Edit:
Wobei das Notice wird dadurch auch nicht ausgeschaltet, da beim neuladen der Seite versucht wird, ein $_POST Array Element zu übergeben, was aber nur dann existiert, wenn das Formular auch abgesendet wird.
Am einfachsten wäre es immer noch auf die Variante von mermshaus zurückzugreifen.
 
Danke, habe das jetzt einmal so eingebaut.
Ich müsste ein leeres $_POST['date'] erzeugen. Deshalb habe ich ja diese Methode definiert, um das nicht bei jedem $_POST neu zu schreiben, das in meinem Projekt vorkommt. Nur, wie definiert man ein $_POST-Array, das noch nicht existiert?
 
Werbung:
So sollte es funktionieren:
PHP:
<?php
public static function checkArray($arrayElement)
{
    if (!empty($arrayElement)) {
        if (isset($_POST[$arrayElement])) {
            return trim(htmlentities($_POST[$arrayElement]));
        } else {
            return '';
        }
    } else {
        return '';
    }
}  

echo '<input type="text" name="date" value="'.\System\Security::checkArray('date').'" />';
 
Noch kurz zu der Geschichte mit dem Ternary-Operator:

rapid10 schrieb:
PHP:
echo "<input type='text' name='date' value='".(isset($_POST['date'])) ? $_POST['date'] : ''."' />";

Der .-Operator wird vor dem ?:-Operator ausgewertet.

- PHP: Operator Precedence - Manual

Dort steht:

PHP:
echo ("<input type='text' name='date' value='".(isset($_POST['date'])))
        ? $_POST['date']
        : (''."' />");

Gewollt ist:

PHP:
echo "<input type='text' name='date' value='".((isset($_POST['date'])) ? $_POST['date'] : '')."' />";
 
Zurück
Oben