PHP: multidimensionale arrays

Pagina: 1
Acties:
  • 119 views sinds 30-01-2008
  • Reageer

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
Ik heb een tabel. Links staan 10 users (voorbeeld) en bovenaan staan diensten waarvan iedere gebruiker gebruik van kan maken. (webmail, forum etc)

Nu heb ik het voor mekaar dat ie uit een databeest een waarde trekt

Ik wil voor iedere gebruiker, bij iedere dienst een checkbox waarmee je aan kunt geven of een gebruiker toegang heeft.

Ik krijg dus:

Gebruiker1 1 1 1 0 0 1
Gebruiker2 0 0 1 0 1 0

En zo door, dus een form met een stuk of 100 checkboxes.

Nou is het form zelf niet zo'n probleem, maar ik moet de waardes daarna ook uit kunnen lezen...

Daarom moet ook alles in een 2 dimensionaal array komen (of weet iemand misschien een makkijlekere oplossing?)

nou heb ik

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    switch($op) {
    case "set":
      echo "Gegevens verwerkt";
    }
      
      
  $result = mysql_query("select uid, uname, email from ".$prefix."_users");
  $aantal = 0;
  echo "<table border=\"1\">";
  
  //Koptekst
  echo "<tr>
    <td>Gebruikers ID</td>
    <td>Gebruikersnaam</td>
    <td>Email</td>
    
    <td>Chat</td>
    <td>Forum</td>
    <td>Filetransfer</td>
    <td>Webmail</td>
    <td>Agenda</td>
    <td>FAQ</td>
    <td>Smoelenboek</td>
    <td>Adresboek</td>
    <td>Telefoonlijst</td>
    <td>Todolijst</td>
    <td>Polls</td>
    <td>Search</td>
    <td>Links</td>
    <td>Prikbord</td>
    <td>Gastenboek</td>
    <td>Fotobrowser</td>
    <td>Backup</td> 
  </tr>
  ";
  
  echo "
    <form name=admin action=\"mmadmin.php\" method=post>
    <input type=hidden name=op value=set>";
     
  while($data = mysql_fetch_row($result)) {
    $aantal++;

    echo "
      <tr align=\"center\">
      <td>$data[0]</td>
      <td>$data[1]</td>
      <td>$data[2]</td>
      ";
    $result2 = mysql_query("select * from ".$prefix."_services where uid = $data[0]");
    $data2 = mysql_fetch_row($result2);

    //Voer hier een hogere waarde in als er meer services zijn
    for($i=1; $i < 18; $i++){
      echo "
        <td> 
      ";
        
        if($data2[$i]){
          echo"<input type=\"checkbox\" checked=\"true\">";  
        }
        else{
          echo"<input type=\"checkbox\">";
        }
                
      echo"</td>";
    }
    echo"</tr>";
  }
  echo "
  </table><br><input type=\"submit\" value=\"Versturen\"></form>


Nou moet ik alleen een manier hebben om de gegevens op te slaan...

Iemand een idee? Al vast bedankt

We are pentium of borg. Division is futile. You will be approximated.


Verwijderd

Ik heb dat zelf ooit eens opgelost door de rechten op te slaan in een integer. Bv. 4 checkboxes waarbij de 1e, 3e en 4e zijn aangevinkt: (1 x 2^0) + (0 x 2^1) + (1 x 2^2) + (1 x 2^3) = 13. Maar in jouw geval is dan t/m 2^9 nodig.

Er zullen vast wel betere manieren zijn maar deze werkt in ieder geval.

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
bedankt, ik ga het even proberen. Mochten er nog andere ideën zijn, hoor ik het graag

We are pentium of borg. Division is futile. You will be approximated.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Werkt een name=\"rechten[".$userid."][".$serviceid."]\" attribuut bij de checkbox niet?

Trouwens.. Dit opmaken zou ook in 1 query kunnen :) Zoals je het nu gedaan hebt lijkt me, zeker bij meer gebruikers een beetje traag worden...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
ik heb even zitten rekeken voordat ik eraan begon. Er zijn nu 17 diensten waarvan de rechten per gebruiker bijgehouden kunnen worden. Waarschijnlijk zijn dat er straks ongeveer 45. Bij 17 diensen heb ik 2^17 = 262144 als maximale waarde. maar bij 45 zijn dat er 1099511627776. Ik denk niet dat PHP dat leuk vindt?

We are pentium of borg. Division is futile. You will be approximated.


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
Janoz schreef op 11 september 2002 @ 13:10:
Werkt een name=\"rechten[".$userid."][".$serviceid."]\" attribuut bij de checkbox niet?

Trouwens.. Dit opmaken zou ook in 1 query kunnen :) Zoals je het nu gedaan hebt lijkt me, zeker bij meer gebruikers een beetje traag worden...
Het is een hele snelle server, dus in principe maakt dat niet zoveel uit...

Eerst dit es aan de gang krijgen, dan zie ik wel verder.

Ik ga het proberen met name, want met integer werkt niet (moet opgeslagen worden per gebruiker)

We are pentium of borg. Division is futile. You will be approximated.


  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 08-08 17:31
Je kunt alle rechten ook gewoon in 1 variabele kunnen opslaan, deze variabele zet je in een array. De rechten scheid je dan door een scheidingsteken.

$gebruiker[0] = "1|1|1|1|0|0|1";
$gebruiker[1] = "2|0|0|1|0|1|0";

Als je dan later de rechten wilt uitlezen moet je per gebruiker de rechten splitsen (explode) op het |-teken. Die komen dan weer automatisch in een array te staan.

$rechten = explode("|",$gebruiker[0]);

Tenminste op deze manier doe ik het altijd als ik een rechtensysteem opbouw. Ik hoop dat je er iets aan hebt.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Rainmaker schreef op 11 september 2002 @ 13:15:
[...]


Het is een hele snelle server, dus in principe maakt dat niet zoveel uit...

Eerst dit es aan de gang krijgen, dan zie ik wel verder.

Ik ga het proberen met name, want met integer werkt niet (moet opgeslagen worden per gebruiker)

En wat vind je van het eerste stukje van mijn reactie? :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
ik heb nu checkboxes met als naam Userid.1, userid.2, userid.3 etc.

Nu ga ik kijken of ik m uitgelezen krijg...
Ik hoop het. iig bedankt :D

We are pentium of borg. Division is futile. You will be approximated.


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
Ik ben al een heel end.

Nu moet ik eigenlijk nog 1 dingetje weten:

Ik moet in een if satement kijken of het ding gechecked is...

PHP:
1
2
3
<?
if(ding1)
{blaat}?>


werkt niet.

PHP:
1
2
<?if(ding1 = checked)
{blaat}?>


ook niet. Hoe doe ik zoiets?

We are pentium of borg. Division is futile. You will be approximated.


  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 19:26
makkelijkst gewoon om een array van integers te gebruiken, de nullen en enen sla je op als bits.
dus bv 1001 = 9
0110 = 6

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
HTML:
1
2
3
4
5
<form method="post">
<input type="checkbox" name="ding1">
<input type="checkbox" name="ding2">
<!-- meer blaat -->
</form>


PHP:
1
2
3
if ( $_POST['ding1'] == 'on' ) 
    blaat;
}


Of.

HTML:
1
2
3
4
5
<form method="post">
<input type="checkbox" name="ding1" value="checked">
<input type="checkbox" name="ding2" value="checked">
<!-- meer blaat -->
</form>


PHP:
1
2
3
if ( $_POST['ding1'] == 'checked' ) {
    blaat;
}


Je kan natuurlijk ook GET vars gebruiken.

== is trouwens voor vergelijkingen, = is voor assignments

[ Voor 0% gewijzigd door Ericston op 11-09-2002 15:18 . Reden: code=html ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:52
Waarom wil iedereen gegevens coderen in een integer of string? Waarom niet gewoon gegevens opslaan in de structuur die daarvoor geschikt is? Ik vraag me sterk af wat de reden kan zijn om een array van integers te maken.

In dit geval zie ik globaal twee mogelijkheden: ofwel je maakt een matrix met daarin gebruikers en privileges, wat in PHP neerkomt op een 2-dimensionale array waarbij elke boolean waarde aangeeft of de betreffende gebruiker het betreffende privilege heeft (bijvoorbeeld: $privilege["maks"]["post news item"] == true), ofwel je slaat per gebruiker een lijst met privileges op (bijvoorbeeld: $privileges["maks"] == array("post new item", "etc", "etc") ).

De eerste methode is het meest efficient als je snel wilt kunnen vaststellen of een gebruiker een bepaalde actie mag uitvoeren, de tweede methode kan vaak compacter opgeslagen worden. Om in een relationele database op te slaan is de tweede methode veruit het makkelijkst. Je hebt een tabel met gebruikers, een tabel met rechten, en een tabel die gebruikers en rechten (op basis van id bijvoorbeeld) aan elkaar koppelt. Als je, zoals in het gegeven voorbeeld, je rechten uit uitsluitend (bijvoorbeeld) een string laat bestaan, kun je de rechtentabel achterwege laten en de string zelf als id gebruiken.

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
Bedankt mensen.

Ik heb het voor mekaar :D

Bedankt voor jullie hulp :D

We are pentium of borg. Division is futile. You will be approximated.


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
toch nog 1 dingetje:

Het staat nu in een array, maar nu krijg ik het de database niet ingeschreven

PHP:
1
2
3
4
5
6
7
8
9
10
          $geb = $data[0];
          $temp = $gebruiker[$geb][$a];
          $sql = "update ".$prefix."_services set $naam = \"$temp\" where uid = \"$geb\"";
          //echo $sql;
          //$resul = mysql_query($sql);
          //echo $resul;
          if(mysql_fetch_row($resul))
            echo "Gegevens verwerkt";
          else
            echo "Mislukt";


Maak ik een foutje in mn SQL code, of zit het ergens anders?

echo $sql geeft wel de goede code terug (volgens mij), maar echo $resul geeft geen recourse ID...

offtopic:
Sorry dat ik dit topic weer omhoog kick, maar het is voor mn stage, en moet eigenlijk vandaag af

[ Voor 0% gewijzigd door Rainmaker op 12-09-2002 09:10 . Reden: Typo's ]

We are pentium of borg. Division is futile. You will be approximated.


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
ik heb het probleem eigenlijk kunne traceren naar het array:

het is een form die gebruik maakt van submit. Hij post naar zichzelf

Nou worden alleen de gegevens die in het array gebruiker staan niet meegegeven na de post...

ik heb al global gebruikers erboven gezet, ik heb het al geprobeerd met $_POST variabele, maar de waardes worden niet meegegeven... Weet iemand misschien hoe ik die waarden mee kan geven...

[ Voor 0% gewijzigd door Rainmaker op 13-09-2002 13:22 . Reden: typo ]

We are pentium of borg. Division is futile. You will be approximated.


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 13:54

Crazy D

I think we should take a look.

Hmm :? Variabelen bestaan zolang je script runt. Als de output gedaan is en het script is "aan het einde" dan bestaat de variabele al niet meer, en na de post zul je dus opnieuw de array moeten vullen.

Exact expert nodig?


  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024
maar er moet toch een mogelijkheid zijn om die variabele op te slaan en nna de post te kunnen gebruiken (een global?)

We are pentium of borg. Division is futile. You will be approximated.

Pagina: 1