Array durcheinander aufgebaut + vor Ausgabe sortiert = trotzdem Fehler

Johnnii360

Erfahrenes Mitglied
Servus zusammen!

Ich steh gerade aufm Schlauch. Ich weiß, dass Arrays immer 0-9 usw. aufgebaut werden müssen. Allerdings geht es - zumindest nach meiner Überlegung - im Moment nicht anders und muss eine Array etwas durcheinander aufbauen um SQL-Abfragen zu reduzieren.

Ich habe hier ein Array ($FormFields). Da habe ich einmal Hard Coded Fields und einmal dynamische die ich aus der DB auslese. Die Anzeige ist in 5 Spalten aufgeteilt, dementsprechend darf die Array nur max. 5 Einträge haben.

Jemand eine Idee wie ich das am besten löse, damit er mir net dauernd den Offset 3 und 5 ankreidet?

Code:
Notice: Undefined offset: 3 in /var/www/intranet/htdocs/public/2014/sites/teamwork_add.php on line 361

Notice: Undefined offset: 5 in /var/www/intranet/htdocs/public/2014/sites/teamwork_add.php on line 361
(Zeile 361 ist hier der Teil in der While-Schleife.

Hier der Code:
PHP:
    /**
     * Definiere Anzahl an Tabspalten
     */
    $tabSections = 5;
   
    /**
     * Hard Coded Felder
     */
    // - Vorgangstyp [1]
    $FormFields['1'] = '<label for="vorgang">Vorgangstyp</label><select id="vorgang" name="vorgang"><option disabled value="none" selected>&nbsp;</option>';
    $SQLQueryString = "SELECT id,vorgangsart FROM ".$tabname_teamwork_progresses." ORDER BY vorgangsart ASC";
    $Records = $mysqli->query($SQLQueryString) or print('<option>'.$mysqli->error.'</option>');
    while($Result = $Records->fetch_array())
    {
        $FormFields['1'] .= '<option value="'.$Result['id'].'">'.$Result['vorgangsart'].'</option>';
    }
    $FormFields['1'] .= '</select><p style="padding: 0; margin: 0 0 10px 0;"></p>';
    // - Kunde [1]
    $FormFields['1'] .= '<label for="kunde">Kunde <img src="images/IconHelp.png" width="16" height="16" alt="Suche nach dem Kunden gibt bei Klick die Kundennummer an" title="Suche nach dem Kunden gibt bei Klick die Kundennummer an" style="border: none; vertical-align: middle;"></label><input type="text" id="kunde" name="kunde" placeholder="Firmen- o. Nachname" class="text ui-content required"><p id="Kundenname">&nbsp;</p>';
    // - Notizen [1]
    $FormFields['1'] .= '<label for="notizen" style="display: none;">Notizen</label><textarea id="notizen" name="notizen" rows="5" class="text ui-content" style="display: none;"></textarea>';
    // - Beschreibung [2]
    $FormFields['2'] = '<label for="beschreibung" style="display: none;">Beschreibung</label><textarea id="beschreibung" name="beschreibung" rows="5" class="text ui-content" style="display: none;"></textarea>';
    // - Ersteller [4]
    $FormFields['4'] = '<label for="erstellertxt">Ersteller</label><p id="erstellertxt" style="padding: 0; margin: 5px 0 10px 0; line-height: 22px;">'.$_SESSION['UserLastName'].', '.$_SESSION['UserFirstName'].'</p><input type="hidden" id="ersteller" name="ersteller" value="'.$_SESSION['UserID'].'">';
    // - Verantwortlicher [4]
    $FormFields['4'] .= '<label for="pv">Verantwortlicher</label><select id="pv" name="pv"><option disabled selected value="">&nbsp;</option><option value="0">Allgemein</option>';
    $SQLQueryStringExecutive = "SELECT id,vorname,nachname,username FROM ".$tabname_users." WHERE nachname!='Merlin' ORDER BY nachname ASC";
    $RecordsExecutive = $mysqli->query($SQLQueryStringExecutive) or print('<option selected>'.$mysqli->errno.'</option>');
    while($ResultExecutive = $RecordsExecutive->fetch_assoc())
    {
        $IsUser = ($ResultExecutive['username'] == $_SESSION['UserName'])?' selected':'';

        if(!empty($ResultExecutive['vorname']) && $ResultExecutive['vorname'] != "Admin")
        {
        $FormFields['4'] .= '<option value="'.$ResultExecutive['id'].'"'.$IsUser.'>'.$ResultExecutive['nachname'].', '.$ResultExecutive['vorname'].'</option>';
        }
        else
        {
        $FormFields['4'] .= '<option value="'.$ResultExecutive['id'].'"'.$IsUser.'>'.$ResultExecutive['nachname'].'</option>';
        }
    }
    $FormFields['4'] .= '</select><p style="padding: 0; margin: 0 0 10px 0;"></p>';
    // - Bearbeiter 1 [4]
    $FormFields['4'] .= '<label for="bearbeiter">Bearbeiter</label><select id="bearbeiter" name="bearbeiter"><option disabled selected value="">&nbsp;</option><option value="0">Allgemein</option>';
    $SQLQueryStringReviser = "SELECT id,vorname,nachname,username FROM ".$tabname_users." WHERE nachname!='Merlin' ORDER BY nachname ASC";
    $RecordsReviser = $mysqli->query($SQLQueryStringReviser) or print('<option selected>'.$mysqli->errno.'</option>');
    while($ResultReviser = $RecordsReviser->fetch_assoc())
    {
        $IsUser = ($ResultReviser['username'] == $_SESSION['UserName'])?' selected':'';

        if(!empty($ResultReviser['vorname']) && $ResultReviser['vorname'] != "Admin")
        {
        $FormFields['4'] .= '<option value="'.$ResultReviser['id'].'"'.$IsUser.'>'.$ResultReviser['nachname'].', '.$ResultReviser['vorname'].'</option>';
        }
        else
        {
        $FormFields['4'] .= '<option value="'.$ResultReviser['id'].'"'.$IsUser.'>'.$ResultReviser['nachname'].'</option>';
        }
    }
    $FormFields['4'] .= '</select><p style="padding: 0; margin: 0 0 10px 0;"></p>';
    // - Bearbeiter 2 [4]
    $FormFields['4'] .= '<label for="bearbeiter2">Bearbeiter #2</label><select id="bearbeiter2" name="bearbeiter2"><option disabled selected value="">&nbsp;</option><option value="0">Allgemein</option>';
    $SQLQueryStringReviser2 = "SELECT id,vorname,nachname,username FROM ".$tabname_users." WHERE nachname!='Merlin' ORDER BY nachname ASC";
    $RecordsReviser2 = $mysqli->query($SQLQueryStringReviser2) or print('<option selected>'.$mysqli->errno.'</option>');
    while($ResultReviser2 = $RecordsReviser2->fetch_assoc())
    {
        $IsUser = ($ResultReviser2['username'] == $_SESSION['UserName'])?' selected':'';

        if(!empty($ResultReviser2['vorname']) && $ResultReviser2['vorname'] != "Admin")
        {
        $FormFields['4'] .= '<option value="'.$ResultReviser2['id'].'"'.$IsUser.'>'.$ResultReviser2['nachname'].', '.$ResultReviser2['vorname'].'</option>';
        }
        else
        {
        $FormFields['4'] .= '<option value="'.$ResultReviser2['id'].'"'.$IsUser.'>'.$ResultReviser2['nachname'].'</option>';
        }
    }
    $FormFields['4'] .= '</select><p style="padding: 0; margin: 0 0 10px 0;"></p>';
    // - Status [4]
    $FormFields['4'] .= '<label for="status">Status</label><select id="status" name="status">';
    $SQLQueryStringStatus = "SELECT * FROM ".$tabname_teamwork_status." ORDER BY id ASC";
    $RecordsStatus = $mysqli->query($SQLQueryStringStatus) or print('<option selected>'.htmlspecialchars($mysqli->errno).'</option>');
    while($ResultStatus = $RecordsStatus->fetch_assoc())
    {
        $FormFields['4'] .= '<option value="'.$ResultStatus['statuswert'].'">'.$ResultStatus['statusanzeige'].'</option>';
    }
    $FormFields['4'] .= '</select><p style="padding: 0; margin: 0 0 10px 0;"></p>';
    // - Fortschritt [4]
    $FormFields['4'] .= '<label for="fortschritt">Fortschritt</label><select id="fortschritt" name="fortschritt"><option disabled value="">&nbsp;</option>';
    for($num = 1; $num <= 10; $num++)
    {
        $FormFields['4'] .= '<option value="'.$num.'0%">'.$num.'0%</option>';
    }
    $FormFields['4'] .= '</select><p style="padding: 0; margin: 0 0 10px 0;"></p>';
    // - Eingang [4]
    $FormFields['4'] .= '<label for="eingangsdatum">Eingang</label>';
    $ThisTimestamp = time();
    $FormFields['4'] .= '<p style="padding: 0; margin: 5px 0 10px 0; line-height: 22px;">'.date("d.m.Y, H:i:s", $ThisTimestamp).'</p>';
    $FormFields['4'] .= '<input type="hidden" id="eingangsdatum" name="eingangsdatum" value="'.date("Y-m-d H:i:s", $ThisTimestamp).'">';
    // - Termin [4]
    $FormFields['4'] .= '<label for="termin">Termin</label><input type="text" id="termin" name="termin" class="text ui-content" placeholder="TT.MM.JJJJ">';
   
    /**
     * Auslesen und auflisten der einzelnen Felder
     */
    $SQLFormFields = $mysqli->query("SELECT * FROM ".$tabname_teamwork_fields." ORDER BY feldposition ASC") or die($mysqli->error);
    while($FormField = $SQLFormFields->fetch_assoc())
    {
        $FormFields[$FormField['feldposition']] .= '<label for="'.$FormField['feldname'].'" class="'.$FormField['feld_benoetigt_in'].'">'.$FormField['feldbezeichnung'].'</label>'.FormatField ($FormField['feldart'], $FormField['feldname'], $FormField['feldwert'], $FormField['feld_benoetigt_in']);
    }
   
    /**
     * Sortiere die Array
     */
    ksort($FormFields);
   
    /**
     * Erstellen und Auflisten der Tabspalten
     */
    for($tc = 1; $tc < $tabSections; $tc++)
    {
        echo '<div class="tabSection">';
        echo $FormFields[$tc];
        echo '</div>';
    }
 
Ohne den Code jetzt groß angesehen zu haben: isset oder array_key_exists, um abzufragen, ob ein Index/Schlüssel existiert?
 
Bist du sicher das Zeile 361 oben 110 ist? Ich würde eher auf Zeile 124 tippen. Dort iterierst du über die Zahlen 1 bis 5, interessanterweise befüllst du das Array $FormFields aber nur mit den Indizes 1, 2 und 4. Der Fehler gibt dir eine Fehlermeldung über die fehlenden Indizes (undefined offset), zufällig genau 3 und 5. Kann Zufall sein, glaube ich aber nicht :p Zusätzlich kommt hinzu, dass in Zeile 110 bei dir oben keine numerischen Schlüssel verwendet werden.
 
Bist du sicher das Zeile 361 oben 110 ist? Ich würde eher auf Zeile 124 tippen. Dort iterierst du über die Zahlen 1 bis 5, interessanterweise befüllst du das Array $FormFields aber nur mit den Indizes 1, 2 und 4. Der Fehler gibt dir eine Fehlermeldung über die fehlenden Indizes (undefined offset), zufällig genau 3 und 5. Kann Zufall sein, glaube ich aber nicht :p Zusätzlich kommt hinzu, dass in Zeile 110 bei dir oben keine numerischen Schlüssel verwendet werden.
Jepp, ist Zeile 110. Auf mein Script übertragen sagt er mir da den Fehler. Und doch, nutze da schon nummerische Schlüssel. $FormField['feldposition'] ist in der DB ein nummerischer Wert.
 
Alles klar, habe den Fehler dann jetzt lokalisiert:
PHP:
$FormFields[$FormField['feldposition']] .= '...';
Das wird beim ersten mal scheitern, da .= etwas an einen bestehenden String anheftet. Beim ersten durchlauf exisitert dieser Array-Schlüssel allerdings noch garnichts, ergo kann auch nichts hinzugefügt werden.

Du müsstest $FormFields['3'] und $FormFields['5'] vorher im Code irgendwo mit einem leeren String ('') initialisieren, oder eben mit isset() in der Schleife prüfen, ob es diesen Index schon gibt.
 

Neue Beiträge

Zurück