Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabelle durchlaufen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabelle durchlaufen

    Hi.

    Habe folgende Tabellen:
    system_permission_squad
    PHP-Code:
    CREATE TABLE `fw_system_permission_squad` (
      `
    squad_idint(11NOT NULL auto_increment,
      `
    namevarchar(30NOT NULL,
      `
    iconvarchar(15NOT NULL,
      `
    news_addenum('no','yes'NOT NULL,
      `
    news_editenum('no','yes'NOT NULL,
      `
    news_deleteenum('no','yes'NOT NULL,
      `
    news_checkenum('no','yes'NOT NULL,
      `
    system_moduleenum('no','yes'NOT NULL,
      `
    user_addenum('no','yes'NOT NULL,
      `
    user_editenum('no','yes'NOT NULL,
      `
    user_deleteenum('no','yes'NOT NULL,
      `
    user_searchenum('no','yes'NOT NULL,
      `
    user_edit_permissionenum('no','yes'NOT NULL,
      `
    user_show_logenum('no','yes'NOT NULL,
      
    UNIQUE KEY `group_id` (`squad_id`)
    ENGINE=MyISAM AUTO_INCREMENT=DEFAULT CHARSET=latin1 AUTO_INCREMENT=
    und

    user_permission
    PHP-Code:
    CREATE TABLE `fw_user_permission` (
      `
    user_idint(11NOT NULL default '0',
      `
    group_idint(11) default NULL,
      
    PRIMARY KEY  (`user_id`)
    ENGINE=MyISAM DEFAULT CHARSET=latin1
    Nun würde ich gerne die alle Gruppen in dem der Benutzer in der Tabelle user_permission ist auslesen, in einem Array speichern und dieses Array dann durch die Tabelle system_permission_squad leiten. Alle Ergebnisse sollen in einem Session-Array gespeichert werden:

    Bsp.:
    $_SESSION['permission']['news_add'] = $permission['news_add'];

    Dabei sollen nur die die Einträge welche ein "yes" ergeben ausgelesen werden. Diese sollen dann wie oben genannt in nem Session-Array gespeichert werden.

    Nur irgendwie weiß ich nicht wirklich wie ich das bewerkstelligen kann :\.
    Kann mir da jemand weiterhelfen?

  • #2
    Was soll denn "durch die Tabelle xy leiten" bedeuten?

    Kommentar


    • #3
      Zitat von Cineplex
      1.) Du liest alle Einträge der Tabelle mit einer while-Schleife aus.
      2.) Du überprüfst ob der Datensatz den Wert "yes" besitzt.
      2.) Du schreibst das Resultat in die Session.

      Wo liegt dein Problem?
      Bei genau dem oben genannten zu bewerkstelligen.
      Abgesehen davon dass das mit der Überprüfung in den WHEN-Teil des Querys kann und eine schon vorhandene Perm nicht 2 mal vergeben werden sollte und man das ganze imho mit einer for-Schleife statt ner while lösen sollte (mysql_num_rows).

      Aber wie gesagt codertechnisch weiß ich nicht wie es geht sonst würd ich ja nicht fragen .

      Kommentar


      • #4
        Zitat von Komandar
        Abgesehen davon dass das mit der Überprüfung in den WHEN-Teil des
        Querys
        Meinst wohl den "WHERE"- Teil?

        Zitat von Komandar
        kann und eine schon vorhandene Perm nicht 2 mal vergeben werden sollte und man das ganze imho mit einer for-Schleife statt ner while lösen sollte (mysql_num_rows).
        Wieso lieber for als while? Ganz im Gegenteil! Mit "while" sparst Du Dir eine Codezeile, weil Du das numrows nicht abfragen musst! (while($row=mysql_fetch_array(oder assoc, je nach dem)($result))........

        Zitat von Komandar
        Aber wie gesagt codertechnisch weiß ich nicht wie es geht sonst würd ich ja nicht fragen .
        Würde das ganze über ein JOIN regeln. JOINS sind zwar ein bisschen Serverlastig, aber Du hast bestimmt keine 30k User oder??

        PHP-Code:
        $query "SELECT `t1.id, t1.bla2, t2.id, t2.bla22, t2.bla.23, etc...` FROM t1 LEFT JOIN t2 ON (t1.id=t2.id) WHERE `t1.bla2`= $user";
        /* wobei in t1.bla2 der username steht, der gerade eingeloggt ist und für den die Daten nun abgefragt werden */
        $resultmysql_query($query);
        while(
        $row mysql_fetch_array($result)) {
        //Daten auslesen und wenn Eintrag "yes" in dein Session array packen

        Achte bei deinem SQL query auf SQL Injections. Also nicht so, wie ich es jetzt da oben reingeschmiert habe!

        *EDIT*: habe noch einen logischen Fehler entdeckt. Du brauchst dafür gar keine Schleife. Ich hoffe, dass ich Dich richtig verstanden habe. Demnach sollte der gerade eingeloggte Benutzer ja nur einmal im user_permission table vorhanden sein - ergo kannst Du Dir die Schleife ganz sparen und brauchst nur das mysql_fetch_array (in welchem dann die gewollten daten komplett enthalten sind). Will jetzt nichtmehr im Code rumpfuschen, hoffe dieser Nachtrag hilft. Ist ja schließlich schon spät... oder früh? Gute Nacht!

        Kommentar


        • #5
          PHP-Code:
                      $query_permission $db->sql_query("SELECT `userperm.*, squadperm.*
                                                                                              FROM "
          .PREFIX."_user_permission
                                                                                              LEFT JOIN "
          .PREFIX."_system_permission_squad
                                                                                              ON (userperm.group_id=squadperm.group_id)
                                                                                              WHERE userperm.user_id="
          .$_SESSION['user']['user_id']."
                                                                                           "
          );

                      while(
          $permission $db->sql_fetchrow($query_permission)) {
                          
          $_SESSION['permission'] = array();
                          
          $_SESSION['permission'][?????]            = $permission[????];

                      } 
          Hab das ganze jetzt mal auf mein Skript angepasst.
          Nun wie kriege ich das ganze mit dem in die Session speichern hin?

          P.s.: Die DB-Klasse die ich nutze (welche auch mysql_fetch_array unterstützt) ist die vom phpBB.

          Kommentar


          • #6
            Zitat von Komandar
            PHP-Code:
            $query_permission $db->sql_query("SELECT `userperm.*, squadperm.* FROM ".PREFIX."_user_permission LEFT JOIN ".PREFIX."_system_permission_squad ON userperm.group_id=squadperm.group_id) WHERE userperm.user_id=".$_SESSION['user']['user_id']."");

            /* bau die anweisung am besten in phpmyadmin zusammen und schau einfach was er als ergebnisarray ausgibt! */

            $permission $db->sql_fetchrow($query_permission))

            /* while brauchst Du hier nicht. Weil das Ergebnis-array folgendermaßen aussieht: 
            $permission[t1.feld1, t1.feld2, t2.feld2, t2.feld3, t2.feld4, usw...];
            Enthält also die Felder aus beiden tabellen mit gemeinsamer (in diesem fall group.id) id vorangestellt - Diese Felder sind ja auch schon durch die WHERE anweisung korrekt miteinander korreliert! */

            /* Und jetzt gehts z.b. weiter mit */

            $_SESSION['permission']['user_id'] = $permission['user_id'];
            $_SESSION['permission']['news_add'] = $permission['news_add'];
            $_SESSION['permission']['user_delete'] = $.....;

            /* usw... Ich kann mich dunkel erinnern, dass Du nur Felder mit "yes" in den array packen wolltest. Dazu brauchst Du dann eben noch ne Abfrage ob in dem Tabellenfeld "yes" steht */
            sowas wie:
            (
            $permission['news_delete'] == 'yes') ? $_SESSION['permission']['news_delete'] = $permission['news_delete'] : $_SESSION['permission']['news_delete'] = NULL
            //(z.b.)
            }
            //Variablen unset usw.... 
            P.s.: Die DB-Klasse die ich nutze (welche auch mysql_fetch_array unterstützt) ist die vom phpBB.
            Wieso benutzt Du da eine Klasse von phpBB? Wenn Du damit nicht mehr machst als in diesem Beispiel, würde ich mir auf jeden Fall schnell eine eigene kleine Klasse schreiben!

            Viel Erfolg.

            Kommentar


            • #7
              Hmm wäre ne überlegung Wert .
              Aber erstmal das jetzige Skript zum laufen bringen... ^^.

              Zu den oben genannten Code:
              PHP-Code:
              $_SESSION['permission']['user_id'] = $permission['user_id'];
              $_SESSION['permission']['news_add'] = $permission['news_add'];
              $_SESSION['permission']['user_delete'] = $.....; 
              Habe vergessen zu erwähnen, dass ich das relativ dynamisch halten möchte, sodass das Skript alle Felder in der Tabelle selbstständig erkennen sollte (news_add, news_edit), da da noch mehrere hinzukommen werden und ich so diesen Teil des codes immer manuell anpassen müsste.

              Weißt das auch irgendwie zu verwirklichen ?

              Kommentar


              • #8
                PHP-Code:
                //ungetestet:

                $col_names array_keys($permission);

                foreach(
                $col_names as $value) {
                (
                $permission["$value"] == 'yes') ? $_SESSION['permission']["$value"] = $permission["$value"] : $_SESSION['permission']["$value"] = NULL;

                müsste eigentlich so gehen. Probier halt mal ein bisschen rum. Das Ergebnis array muss in diesem beispiel mit fetch_assoc geholt werden. Wenn fetch_array verwendet wird, muss das array vor der Schleife noch bearbeitet werden.
                Hilft das?

                Kommentar


                • #9
                  Also klappt soweit aber irgendwie setzt der die Sessions nicht.
                  Keine Fehlermeldung und das query übernimmt er auch ganz normal oO.

                  Kommentar


                  • #10
                    Ohne Codeschnippsel schwer zu sagen. Paste doch auch mal den Teil aus der phpBB Klasse, wo die Daten in das array kommen.

                    Gib mal mit print_r Deine Variable $permission aus. Wie sieht das aus?
                    Was meinst Du mit "setzt die Sessions" nicht? Meinst Du, dass z.b. $_SESSION['permissions']['news_delete'] leer ist, obwohl $permissions['news_delete'] "yes" ist?

                    Kommentar


                    • #11
                      Huhu.

                      Also die Session-Variable gibt kein "yes" aus.
                      Enum ist natürlich in der DB bei dem User auf yes gesetzt.

                      Die Query-Anfrage sieht wie folgt aus:
                      PHP-Code:
                      Query-DataSELECT `userperm.*, groupperm.* FROM fw_user_permission LEFT JOIN fw_system_permission_group ON (userperm.group_id=groupperm.group_id) WHERE userperm.user_id=1 
                      Zum print_r ... da kommt keine Ausgabe.

                      Die Klasse:
                      PHP-Code:
                          function sql_fetchrowset($query_id 0)
                          {
                              if( !
                      $query_id )
                              {
                                  
                      $query_id $this->query_result;
                              }

                              if( 
                      $query_id )
                              {
                                  unset(
                      $this->rowset[$query_id]);
                                  unset(
                      $this->row[$query_id]);

                                  while(
                      $this->rowset[$query_id] = mysql_fetch_array($query_idMYSQL_ASSOC))
                                  {
                                      
                      $result[] = $this->rowset[$query_id];
                                  }

                                  return 
                      $result;
                              }
                              else
                              {
                                  return 
                      false;
                              }
                          }

                          function 
                      sql_fetchfield($field$rownum = -1$query_id 0)
                          {
                              if( !
                      $query_id )
                              {
                                  
                      $query_id $this->query_result;
                              }

                              if( 
                      $query_id )
                              {
                                  if( 
                      $rownum > -)
                                  {
                                      
                      $result mysql_result($query_id$rownum$field);
                                  }
                                  else
                                  {
                                      if( empty(
                      $this->row[$query_id]) && empty($this->rowset[$query_id]) )
                                      {
                                          if( 
                      $this->sql_fetchrow() )
                                          {
                                              
                      $result $this->row[$query_id][$field];
                                          }
                                      }
                                      else
                                      {
                                          if( 
                      $this->rowset[$query_id] )
                                          {
                                              
                      $result $this->rowset[$query_id][0][$field];
                                          }
                                          else if( 
                      $this->row[$query_id] )
                                          {
                                              
                      $result $this->row[$query_id][$field];
                                          }
                                      }
                                  }

                                  return 
                      $result;
                              }
                              else
                              {
                                  return 
                      false;
                              }
                          } 

                      Kommentar


                      • #12
                        ok, das sollte passen. Gibt Dein Query-String bei phpmyadmin das richtige ergebnis aus? Denke dass es am querystring liegt!!

                        Kommentar


                        • #13
                          Hi.

                          Setz in die Query noch die Bedingung rein, dass der entsprechende Wert auf "yes" stehen muss, dann musst due die Ergebinsse nicht noch mal mit PHP filtern.

                          Und dann wäre es natürlich geschickt, auch überall die korrekten Tabellennamen zu verwenden. Um das PREFIX nicht immer reinschreiben zu müssen, am besten mit Aliasen arbeiten.

                          Ich frag mich nebenbei, ob du wohl so weit kommen wirst, wenn jeder Benutzer nur maximal einer Gruppe zugeordnet sein kann und will dazu mal noch anmerken, dass es mitunter keine gute Idee ist, die unterschiedlichen Access-Request-Aktionen fest ins Tabellendesign zu klopfen. Mit einer flexiblen Zuordnung kannst du dir auch das yes - no -Spielchen sparen, sondern ordnest einfach jeweils der Gruppe eine Aktion zu, die auch ein Recht daran hat.

                          Und, ach ja, wenn du ein assoziatives Array mit "<aktion>" = "yes" hast (Bedingung in der Datenbank), dann reicht ein $_SESSION['perm'] += $row; - zumindest, falls der Index 'perm' auch als leeres Array initialisiert wurde.

                          Allerdings würde sich ein indiziertes Array mit den Aktionen besser machen, also einweder wieder in einer while-Schleife die keys auslesen oder gleich alles in ein Array stopfen und $_SESSION['permissions'] = array_keys($aAllowedActions);

                          Basti

                          Kommentar


                          • #14
                            Basti.... nu hast mich total verwirrt.

                            Also zum obigen Query:
                            PHP-Code:
                            #1054 - Unknown column 'userperm.*, groupperm.* FROM fw_user_permission LEFT JOIN fw_sys' in 'field list' 
                            Zu Deiner Methode Basti.
                            Ja, der User soll in mehreren Gruppen sein können.
                            Und wie würdest Du es genau bewerkstelligen?

                            Kannst mir das obige Skript vielleicht auf Deine vorgehensweise umschreiben?
                            Das mit dem PREFIX... ist einfach nur, damit man das Skript mehrere male in einer gleichen DB nutzen kann.

                            Das Prefix ist ne Konstante die er sich automatisch holt.

                            Kommentar


                            • #15
                              Komandarl, dein Querystring ist ja schon falsch, so läuft der nicht!

                              Entwickel ihn unbedingt mit phpmyadmin und achte auf die hochkommata! Die sind nämlich bei Dir völlig falsch gesetzt und es sollten auch keine ' sein, sondern ´ !

                              Bring am besten erstmal diese Version zum laufen, bevor Du andere Gefilde vordringst.

                              Kommentar

                              Lädt...
                              X