Logik Problem, welche form von array soll ich verwenden

Amschti

Erfahrenes Mitglied
Unglaublich, eigentlich wollte ich ein einfaches menü machen.... das Problem ist, ich möchte anhand einen Cookies das beim Login erzeugt wird, den status des Users festlegen, also, Administrator, Moderator, Gast... und dementsprechend das menü laden....

das hab ich mal fabriziert.......

PHP:
$a=0;$b=0;$t=0;

/// Adminmenü
$titel[$t++] = 'gast';
$link[$a++][$b++] = array("name" => "a", "link" => "this.html");

/// modMenu
$titel[$t++] = 'mod';
$b=0;
$link[$a++][$b] = array("name" => "b", "link" => "this.html");
$link[$a][$b++] = array("name" => "c", "link" => "this.html");

/// admin2
$titel[$t++] = 'Admin';
$b=0;
$link[$a++][$b] = array("name" => "d", "link" => "this.html");
$link[$a][$b++] = array("name" => "e", "link" => "this.html");
$link[$a][$b++] = array("name" => "f", "link" => "this.html");

///Danach soll es das ganze auslesen...

echo '<div id="navi">
        <div id="titel" class="navi_link">'.$titel[$_COOKIE[gruppe]].'</div>';
foreach ($link[$_COOKIE[gruppe]] as  $value) {

        echo '<div  class="navi_link navi_buttons" onclick="getpage(\''.$value[link].'\')">'.$value[name].'</div>';

}
echo'</div>';

Mal abgesehen davon, das das auslesen nicht funktioniert ;), warum auch immer. geh ich das ganze richtig an, oder soll ich gleich wieder abbrechen. Ich habe schon soviele varianten gesehen, und weiss nicht ob ich mich für die richtige entschieden habe.
 
Da ich keine Ahnung habe, was der Code grad so fabriziert (müsste mich hinsetzen und das ganze ++ Zeug nachdokumentieren umd die Logik zu finden), mach doch mal ein var_dump() auf den Array
 
Was heißt richtig ... Es gibt eben viele Möglichkeiten so etwas zu realisieren.

Ein paar Fehler sind schon drin. Also erstens sollten Indizes von Arrays Strings sein, also $_COOKIE['gruppe'] statt $_COOKIE[gruppe].
Außerdem:
PHP:
// hier ist a = 1
$link[$a++][$b] = array("name" => "b", "link" => "this.html");
// hier ist a = 2
$link[$a][$b++] = array("name" => "c", "link" => "this.html");
Erinnerung
$x = $a++ weist den aktuellen Wert von $a zu, und erhöht $a um 1
$x = ++$a erhöht $a um 1 und weist den Wert dann zu

Ansonsten sieht es einigermaßen richtig aus.
 
ajajajaj,es funktioniert!!

es waren tatsächlich diese Additionen die ich z.t. völlig falsch gesezt habe... jch hab jetzt fast 2-3 stunden versucht eine foreach schlaufe in einer foreach schlaufe zu fabrizieren.... dan habe ich noch so zeugs wie "RecursiveIteratorIterator" studiert. die mich fast dazu bewog, einfach aufzuhören.:)

DANKE!
 
Ich würde ein ganzes normale Menü gestalte und die einzelnen Menü-Punkte anhand der User/Admin-Rechte regeln, so kannst du auch ausschließen, das User XY einen Link aufruft, den er nicht aufrufen darf
 
Das würde ich auch wie bofh lösen, da es in der Regel in einer Navigation eine überschaubare Anzahl von zu überprüfenden Menupunkte gibt. So oder ähnlich:

PHP:
// Bspw. Access Level von 0 entspricht dem Gast,
// 1 dem Moderator und 2 ist der Admin.

// Hier die Links, die nur für den Admin sind
if($_SESSION['UserAccessLevel'] > 1) {
    echo "<a href='administrator_zeugs.php'>Administrationsbereich</a>";
    // ... und weitere
}

// Hier die Links die für Mod und Admin sind
if($_SESSION['UsrAccessLevel'] > 0) {
    echo "<a href='moderator_zeug.php'>Moderationsbereich</a>";
    // ... und weitere
}

// und schlussendlich die restlichen Links
echo "<a href='foobar.php'>Foo Bar</a>";
echo "<a href='babedebupi.php'>Babedebupi</a>";

Hast du einen Grund, warum du dir diesen Aufwand mit den Arrays antust? Ausserdem - wie bereits erwähnt - pass bei Folgendem auf:

PHP:
$a[babede] = "bupi";

echo $a[babede]; // gibt bupi aus

// AAAAABBBBEEERR

$a[babede] = "bupi";

// ... hier dazwischen viel Code

define("babede", "Etwas ganz anderes");

// ... wieder viel Code und du bist dir dummerweise der gleichen Namengebung nicht wirklich bewusst :)

echo $a[babede]; // gibt Etwas ganz anderes aus

Ersteres Funktioniert, weil der Interpreter deinen Key zum assoziativen Array automatisch in einen String umwandelt, wenn er keine entsprechende Konstante findet. Solltest du aber (oder aber auch das PHP - Team im Rahmen der Weiterentwicklung von PHP) einmal eine Konstante definieren, die zufälligerweise gleich heisst, wie ein Key in einem deiner Arrays, wirst du nicht mehr auf den richtigen Wert kommen. Deshalb in assoziativen Arrays (Hashes) die Keys immer als String mitgeben.
 
Noch einige Anregungen:

PHP:
<?php

function e($s)
{
    return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}

$titel = array();
$link = array();

/// Adminmenü
$titel[] = 'gast';
$link[] = array(
    array("name" => "a", "link" => "this.html")
);

/// modMenu
$titel[] = 'mod';
$link[] = array(
    array("name" => "b", "link" => "this.html"),
    array("name" => "c", "link" => "this.html")
);

/// admin2
$titel[] = 'Admin';
$link[] = array(
    array("name" => "d", "link" => "this.html"),
    array("name" => "e", "link" => "this.html"),
    array("name" => "f", "link" => "this.html")
);

$gruppe = 1; // Test

$tpl = array(
    'titel' => $titel[$gruppe],
    'link'  => $link[$gruppe]
);

?>

<div id="navi">
    <div id="titel" class="navi_link"><?=e($tpl['titel'])?></div>
    <?php foreach ($tpl['link'] as $value) : ?>
        <div class="navi_link navi_buttons"
             onclick="getpage(<?=e($value['link'])?>)"
        >
            <?=e($value['name'])?>
        </div>
    <?php endforeach; ?>
</div>

Stichwörter dazu:

- http://php-de.github.io/jumpto/eva-prinzip/
- http://php-de.github.io/jumpto/cross-site-scripting/
- http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel (? guter Artikel)

Was Igäl schon berichtigt hat: Nutze keine Cookies, die werden beim Nutzer auf dem Rechner gespeichert und sind deshalb manipulierbar. Nutze Sessions.

Interessehalber: Sagt man wirklich irgendwo „Schlaufe“?
 
Wow! Mir kommen fast die Tränen vor Freude! :) Hier wird ein geholfen, unglaublich! Vielen dank für die Anregungen, ich werde alle beherzigen. Auch das mit den Sessions.

@igäl. ich habe diese IF Anweisung über die Komplette seite gelegt ;) und die eindeutige ID habe ich verschlüsselt... daher ist es danach ja irrelevant. Der einzige Grund weshalb ich die Links nicht jedesmal ausschreibe oder den <a> tag verwende, ist eigentlich einfach.. das wird keine Webseite, sondern vielmehr eine Art Intranet, in meiner Berufsbranche ( die nichts mit IT etc. am hut hat) wird schon lange nach diese art "Komunikation" gesucht.... ohne zuviel zu verraten ;), ausserdem will ich alles über jquery regeln lassen.... :)
 
Zurück