[php] dynamisch opgebouwde array zonder vaste namen uitlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
Ik zit hier met het volgende probleem waar ik echt niet uitkom.

situatieschets:
Ik heb een overzicht een cursist met daaronder een aantal cursussen.
Per cursus wordt gekeken in de tabel cursus_deelname of de cursist hier wel of niet aan meedoet. Doet hij er wel aan mee, dan verschijnt er een knopje om de cursist uit te schrijven, staat hij er niet in dan een knopje om hem in te schrijven. Dat werkt allemaal goed, gezien ik de benodigde IDs meestuur in de URL.

Het probleem is nu dat het ook mogelijk moet zijn om alle cursussen in 1 keer toe te voegen of te verwijderen bij een gebruiker. Hiervoor zijn er checkboxes geplaatst voor de cursus die aangevinkt kunnen worden.
Dit staat op een form dat gesubmit wordt naar een pagina waarin de queries staan.
De queries werken op zich ook, dus dat is het probleem niet.
Waar het fout gaat is het meesturen welke cursussen aangevinkt zijn. Om het lijstje te maken gebruik ik de volgende query

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$row_count = 0;

$cursusqry = mysql_query ("SELECT * FROM Cursus");
while ($row2 = mysql_fetch_array ($cursusqry)) 
{
$CID = $row2['ID'];
$Cursusnaam = $row2['Cursusnaam'];

// hier een overzicht dat de gegevens laat zien

$row_count ++;
}


Dit geeft een mooi overzicht van de Cursusnaam met het CursusID (CID). Om de gegevens in Cursus_Deelname te bewerken wordt $CID gebruikt om de cursus te identificeren.

Ik heb nu dus een UserID en CursusID die gekoppeld kunnen worden. Waar het fout gaat is als ik het met meerdere cursussen tegelijk wil doen. De gegevens worden gesubmit vanaf een form en de IDs worden meegestuurd. het UserID wordt gewoon in een hidden field gezet, dus die kan ik makkelijk te pakken krijgen. De CursusIDs kan ik daar echter niet neerzetten.

PHP:
1
<input type="checkbox" name="cursus<? echo $CID; ?>" />

Op deze manier geef ik aan welke cursus ID is aangevinkt. In de array die gesubmit is krijg ik ook netjes te zien "[cursus2] => on ". Waar ik op vastloop is alleen hoe te controlleren welke aangevinkt zijn.
Afhankelijk van de cursussen die in de tabel zijn kan het goed zijn dat ik namelijk niet Cursus1, Cursus2 en Cursus3 heb maar (zeker na verloop van tijd als de tabel flink gemuteerd is) kan het prima Cursus4, Cursus19, Cursus37 zijn.

Een simpele check als
PHP:
1
2
3
4
5
6
7
8
if (cursus1 ="on")
{
echo 'aan';
}
else
{
echo 'uit';
}

kan ik niet gebruiken, omdat cursus 1 dus ook cursus12 kan zijn.

Ik heb al de prefix Cursus meegegeven aan het ID zodat ik misschien wat makkelijker kan kijken of het aangevinkt is of niet, de vraag alleen, hoe kan ik dat nou het beste doen. De gegevens uit de $_POST array plukken lukt me wel, zolang de namen maar vast staan, maar nu ze dat niet doen weet ik eventjes niet waar ik moet zoeken. Iemand een idee waar ik naar moet kijken, dan kan ik weer verder met het zoeken naar een oplossing

Ik hoop dat het zo een beetje duidelijk is (ik heb de belangrijkste code gepost, maar uiteraard is die pagina nog veel langer, dus mocht ik iets vergeten zijn dat belangrijk is laat het even weten, dan vul ik het even aan).

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Geef je checkboxes de naam cursus[id].
Dan kun je vervolgen controleren met if(isset($_POST["cursus"][id]))

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Misschien dat je iets met array_keys() kunt aanvangen en op basis daarvan de boel kunt uitlezen.

Zoiets:
PHP:
1
2
3
4
5
6
7
8
9
$keys = array_keys($_POST);

for($i = 0; $i < count($keys); $i++) {
    if(substr($keys[$i], 0, 6) == "cursus") {
       if($_POST[$keys[$i]] == "on") {
          echo "aan!";
       }
    }
}

[ Voor 54% gewijzigd door MTWZZ op 15-01-2007 12:25 ]

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

je geeft de checkbox een naam en een value mee, als volgt:

code:
1
2
3
4
 <input type="checkbox" name="cursus[]" value="1" />
 <input type="checkbox" name="cursus[]" value="2" />
 <input type="checkbox" name="cursus[]" value="3" />
 <input type="checkbox" name="cursus[]" value="4" />


Als je dan 1 & 3 aanklikt en verstuurd naar php, krijg je daar de array cursus terug die 1 & 3 bevatten.

Raar... Is zo gek nog niet


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
Tsjilp schreef op maandag 15 januari 2007 @ 12:29:
je geeft de checkbox een naam en een value mee, als volgt:

code:
1
2
3
4
 <input type="checkbox" name="cursus[]" value="1" />
 <input type="checkbox" name="cursus[]" value="2" />
 <input type="checkbox" name="cursus[]" value="3" />
 <input type="checkbox" name="cursus[]" value="4" />


Als je dan 1 & 3 aanklikt en verstuurd naar php, krijg je daar de array cursus terug die 1 & 3 bevatten.
Dit zou op zich de makkelijkste manier zijn natuurlijk (ik loop gewoon de array door en laat alle waardes retourneren), ik zat echt VEEL te moeilijk te denken :P
Ik krijg nu wel al de cursusarray, nu alleen nog even kijken hoe de values mee te geven zijn :)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
PHP:
1
2
3
4
while ($row2 = mysql_fetch_array ($cursusqry))  
{ 
  echo '<input type="checkbox" name="cursus[]" value="' .$row2['ID'] . '" /> ' . $row2['Cursusnaam'];
}


en dan uitlezen met:

PHP:
1
2
3
4
foreach($_POST[cursus] as $id)
{
  // cursus met $id is aangevinkt geweest.
}

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
Grijze Vos schreef op maandag 15 januari 2007 @ 12:56:
PHP:
1
2
3
4
while ($row2 = mysql_fetch_array ($cursusqry))  
{ 
  echo '<input type="checkbox" name="cursus[]" value="' .$row2['ID'] . '" /> ' . $row2['Cursusnaam'];
}


en dan uitlezen met:

PHP:
1
2
3
4
foreach($_POST[cursus] as $id)
{
  // cursus met $id is aangevinkt geweest.
}
Ik dacht dat ook te hebben, maar was een = vergeten bij het value attribuut (echt volledig overheen gekeken).. maar het werkt nu.
Ik zat dus te moeilijk te denken zag ik al wel. Tnx allen.

Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

Even nog een opmerking achteraf.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$row_count = 0;

$cursusqry = mysql_query ("SELECT * FROM Cursus");
while ($row2 = mysql_fetch_array ($cursusqry)) 
{
$CID = $row2['ID'];
$Cursusnaam = $row2['Cursusnaam'];

// hier een overzicht dat de gegevens laat zien

$row_count ++;
}
?>


Dit kan natuurlijk beter, waarom prop je in $CID : $row2['ID']. Dit kost je aan resources. Gewoon direct $row['ID']; gebruiken dan. Ga je er checks etc op los laten, dan heb ik niets gezegt. Dan ga je die extra resources toch gebruiken :-)

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

Verwijderd

"Dit kan natuurlijk beter, waarom prop je in $CID : $row2['ID']. Dit kost je aan resources. Gewoon direct $row['ID']; gebruiken dan. Ga je er checks etc op los laten, dan heb ik niets gezegt. Dan ga je die extra resources toch gebruiken :-)"
Dan nog:
Dan kun je beter met $CID =& $row2['ID'] werken, tenzij je de data wilt manipuleren (wat mij niet logisch lijkt bij een id).

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ach, soms kan het best de leesbaarheid van je code verbeteren hoor. En jullie 'zeuren' nu over nog geen miliseconde in de totale runtime.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
k8skaaay schreef op maandag 15 januari 2007 @ 14:52:
Even nog een opmerking achteraf.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$row_count = 0;

$cursusqry = mysql_query ("SELECT * FROM Cursus");
while ($row2 = mysql_fetch_array ($cursusqry)) 
{
$CID = $row2['ID'];
$Cursusnaam = $row2['Cursusnaam'];

// hier een overzicht dat de gegevens laat zien

$row_count ++;
}
?>


Dit kan natuurlijk beter, waarom prop je in $CID : $row2['ID']. Dit kost je aan resources. Gewoon direct $row['ID']; gebruiken dan. Ga je er checks etc op los laten, dan heb ik niets gezegt. Dan ga je die extra resources toch gebruiken :-)
Het is meer de standaard manier van scripten die ik gebruik.
Als eerste zodat ik alle variabelen die ik gebruik op een min of meer eenduidige manier heb staan, daarnaast om ook de mogelijkheid om er checks op te gooien (nu zal dat met een ID niet zo heel snel gebeuren op zich, maar vaak trek ik meer uit een query dan alleen een ID natuurlijk :))

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Grijze Vos schreef op maandag 15 januari 2007 @ 12:56:
PHP:
1
2
3
4
foreach($_POST[cursus] as $id)
{
  // cursus met $id is aangevinkt geweest.
}
Nog ff zeuren al zal het wel een snel voorbeeldje geweest zijn ;)
php.net
Why is $foo[bar] wrong?

You should always use quotes around a string literal array index. For example, use $foo['bar'] and not $foo[bar]. But why is $foo[bar] wrong? You might have seen the following syntax in old scripts:

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>

This is wrong, but it works. Then, why is it wrong? The reason is that this code has an undefined constant (bar) rather than a string ('bar' - notice the quotes), and PHP may in future define constants which, unfortunately for your code, have the same name. It works because PHP automatically converts a bare string (an unquoted string which does not correspond to any known symbol) into a string which contains the bare string. For instance, if there is no defined constant named bar, then PHP will substitute in the string 'bar' and use that.

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Brakkie schreef op dinsdag 16 januari 2007 @ 09:08:
Nog ff zeuren al zal het wel een snel voorbeeldje geweest zijn ;)
Strikte error_reporting is je vriend!

Rustacean

Pagina: 1