[PHP&MySQL] Dropdown box genereren.

Pagina: 1
Acties:

  • Tundreq
  • Registratie: April 2002
  • Laatst online: 23-09-2025
Ik ben al een paar dagen bezig met zoeken naar een oplossing om mijn dropdown box te laten vullen.
En omdat ik nog maar beginner ben met php kom ik er nog niet echt uit.

Ik zal iig eerst een idee laten zien van mijn database, er staat namelijk een categorie in en die zorgt tevens ook een beetje voor mijn probleem, maar ja kan er niet zonder.

Categorie | Product
Desktop | Computer 1
Desktop | Computer 2
Desktop | Computer 3

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
if(isset($_POST['submit'])) {
  //Eerst tel ik hoeveel producten er in de categorie zitten, deze waarde gebruik ik bij de volgende for statement
  $sql = "SELECT * FROM products WHERE categorie='".$_POST['categorie']."'";
  $resultaat = mysql_query($sql) OR die ("Kon geen verbinding maken met de database.");
  $aantalrij = mysql_num_rows($resultaat); //telt aantal rijen
    
  for ($i=1; $i<=$aantalrij; $i++){
    $sql = "SELECT * FROM products WHERE categorie='".$_POST['categorie']."' AND product !='$productnaam'";
    $resultaat = mysql_query($sql) OR die ("Kon geen verbinding maken met de database.");
    $rij = mysql_fetch_object($resultaat);
    $productnaam = htmlspecialchars($rij->product);
    echo "<option value=\"$productnaam\">$productnaam</option>";
}

Het probleem is nu als ik het zo uitvoer dat als er 5 producten zijn gevonden dat hij om en om computer 1 en computer 2 weergeeft terwijl naar 2 gewoon 3 en 4 moeten komen.

Hoe los ik dit probleem op, heb al heel wat creatieve dingen geprobeerd en gezocht maar nog niks gevonden wat me kon helpen.

  • samo
  • Registratie: Juni 2003
  • Laatst online: 18:43

samo

yo/wassup

zoek op php.net naar mysql_fetch_row.
De query in regel 8 komt mij namelijk nogal dubbel over.

Bekend van cmns.nl | ArneCoomans.nl | Het kindertehuis van mijn pa in Ghana


  • Tundreq
  • Registratie: April 2002
  • Laatst online: 23-09-2025
samo-arne schreef op dinsdag 19 juli 2005 @ 11:48:
zoek op php.net naar mysql_fetch_row.
De query in regel 8 komt mij namelijk nogal dubbel over.
Ik weet niet hoe het precies zit maar er worden namelijk meerdere rijen opgevraagd.
Want ik vraag namelijk op categorie op waardoor ik dus meer resultaten krijg vanuit de database, en als ik dan productnaam echo dan krijg ik maar 1 naam te zien en dat is de bovenste vanuit de Mysql database.

  • Gertjan
  • Registratie: Oktober 2001
  • Laatst online: 07-02 20:23

Gertjan

mmmm, beer...

Ik vind je probleem vrij vaag omschreven, maar als ik het goed begrepen heb, zou de volgende code wel moeten kloppen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(isset($_POST['submit'])) {
  $sql = "SELECT * FROM products WHERE categorie='".$_POST['categorie']."'";
  $resultaat = mysql_query($sql) OR die ("Kon geen verbinding maken met de database.");
  $aantalrij = mysql_num_rows($resultaat); //telt aantal rijen

  echo "<select name='Product'>";

  while( $row = mysql_fetch_asoc($resultaat) ) {
    $pn = $row['Product'];
    echo "<option value='$pn' />$pn";
  }

  echo "</select>";
}

[ Voor 17% gewijzigd door Gertjan op 19-07-2005 11:54 . Reden: </select> toegevoegd ]


  • Obliterator
  • Registratie: November 2000
  • Laatst online: 30-04 16:09
Zoek ook eens op internet naar het normalizeren van databases. Die categorie opslaan als tekst bij elk produkt gaat geheid fout als de database groter wordt.

  • Icey
  • Registratie: November 2001
  • Laatst online: 11:36
Dit is een klein stukje van een groter geheel, maar wellicht heb je er toch wat aan :). Ik had een ProductID, waaraan een aantal VragenID's gekoppeld zijn (gescheiden door een komma). Bij een bepaald product had ik dus vraag 1,7,2 o.i.d. Per vraagid had ik de vraag zelf, type vraag, en de opties :).

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
foreach ($vraag as $VragenID){
// We halen de benodigde gegevens op uit de database, aan de hand van het VragenID halen we de goede vraag op.
$sql = mysql_query("SELECT * FROM vragen WHERE VraagID = '$VragenID'");
$row = mysql_fetch_object($sql);
$VraagOmschrijving = $row->VraagOmschrijving;
$VraagType = $row->VraagType;
$VraagOpties = $row->VraagOpties;
//Vraagnummer halen we hierboven op, aan het einde tellen we er eentje bij op. Het aantal weten we ook!
echo "<b>Vraag $VraagNummer van $VraagAantal</b><br>$VraagOmschrijving<br>";
        
//Dit is een ingewikkeld stukje, we kijken naar het vraagtype (radio, text of select) en halen daarna de opties (gescheiden door een komma) op die er ertussen zetten.
switch ($VraagType) {
case "radio":
$VraagOptie = explode(",", $VraagOpties);
foreach ($VraagOptie as $VraagOptieAntwoord){
echo "<input type=\"radio\" name=\"$ProductID-$VragenID\" value=\"$VraagOptieAntwoord\"> $VraagOptieAntwoord<br>";
}
break;
case "text":
echo "<textarea name=\"$ProductID-$VragenID\" rows=\"7\" cols=\"45\"></textarea><br>";
break;
case "select":
$VraagOptie = explode(",", $VraagOpties);
echo "<select name=\"$ProductID-$VragenID\">";
foreach ($VraagOptie as $VraagOptieAntwoord){
echo "<option value=\"$VraagOptieAntwoord\">$VraagOptieAntwoord</option>";
}
echo "</select><br>";
break;
}
echo "<br>";
// We tellen bij het vraagnummer er een cijfer bovenop, en beginnen opnieuw voor de volgende.
$VraagNummer = $VraagNummer + 1;
}
}

  • Tundreq
  • Registratie: April 2002
  • Laatst online: 23-09-2025
Ali_Illegali schreef op dinsdag 19 juli 2005 @ 11:54:
Ik vind je probleem vrij vaag omschreven, maar als ik het goed begrepen heb, zou de volgende code wel moeten kloppen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(isset($_POST['submit'])) {
  $sql = "SELECT * FROM products WHERE categorie='".$_POST['categorie']."'";
  $resultaat = mysql_query($sql) OR die ("Kon geen verbinding maken met de database.");
  $aantalrij = mysql_num_rows($resultaat); //telt aantal rijen

  echo "<select name='Product'>";

  while( $row = mysql_fetch_assoc($resultaat) ) {
    $pn = $row['Product'];
    echo "<option value='$pn' />$pn";
  }

  echo "</select>";
}
Ik heb het even erin gestop en krijg als resultaat wel de juiste aantal opties alleen zijn ze leeg, en dat heb ik al eerder gehad met mijn if statement.

Nog maar even kijken als ik wat aan de code van Icey heb.

  • Tundreq
  • Registratie: April 2002
  • Laatst online: 23-09-2025
Icey schreef op dinsdag 19 juli 2005 @ 11:57:
Dit is een klein stukje van een groter geheel, maar wellicht heb je er toch wat aan :). Ik had een ProductID, waaraan een aantal VragenID's gekoppeld zijn (gescheiden door een komma). Bij een bepaald product had ik dus vraag 1,7,2 o.i.d. Per vraagid had ik de vraag zelf, type vraag, en de opties :).

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
foreach ($vraag as $VragenID){
// We halen de benodigde gegevens op uit de database, aan de hand van het VragenID halen we de goede vraag op.
$sql = mysql_query("SELECT * FROM vragen WHERE VraagID = '$VragenID'");
$row = mysql_fetch_object($sql);
$VraagOmschrijving = $row->VraagOmschrijving;
$VraagType = $row->VraagType;
$VraagOpties = $row->VraagOpties;
//Vraagnummer halen we hierboven op, aan het einde tellen we er eentje bij op. Het aantal weten we ook!
echo "<b>Vraag $VraagNummer van $VraagAantal</b><br>$VraagOmschrijving<br>";
        
//Dit is een ingewikkeld stukje, we kijken naar het vraagtype (radio, text of select) en halen daarna de opties (gescheiden door een komma) op die er ertussen zetten.
switch ($VraagType) {
case "radio":
$VraagOptie = explode(",", $VraagOpties);
foreach ($VraagOptie as $VraagOptieAntwoord){
echo "<input type=\"radio\" name=\"$ProductID-$VragenID\" value=\"$VraagOptieAntwoord\"> $VraagOptieAntwoord<br>";
}
break;
case "text":
echo "<textarea name=\"$ProductID-$VragenID\" rows=\"7\" cols=\"45\"></textarea><br>";
break;
case "select":
$VraagOptie = explode(",", $VraagOpties);
echo "<select name=\"$ProductID-$VragenID\">";
foreach ($VraagOptie as $VraagOptieAntwoord){
echo "<option value=\"$VraagOptieAntwoord\">$VraagOptieAntwoord</option>";
}
echo "</select><br>";
break;
}
echo "<br>";
// We tellen bij het vraagnummer er een cijfer bovenop, en beginnen opnieuw voor de volgende.
$VraagNummer = $VraagNummer + 1;
}
}
Als ik het goed zie tel je er gewoon elke keer 1 bij op, dat is bij mij niet mogelijk omdat ik met de categorie desktop ook wel een product_id heb alleen deze zijn niet op te tellen met 1, omdat nummer 4 een laptop kan zijn en 5 weer een desktop.

Ik hoop dat je het snapt want begint allemaal al aardig wazig te worden.

Verwijderd

Obliterator schreef op dinsdag 19 juli 2005 @ 11:56:
Zoek ook eens op internet naar het normalizeren van databases. Die categorie opslaan als tekst bij elk produkt gaat geheid fout als de database groter wordt.
Voor welk bedrijf is het, en wat krijg je ervoor, ik wil er ook wel werken als dit allemaal kan daar >:)
Modbreak:Moet dit nou? Het is hier de HK niet...

[ Voor 8% gewijzigd door NMe op 19-07-2005 13:59 ]


  • Tundreq
  • Registratie: April 2002
  • Laatst online: 23-09-2025
Ali_Illegali schreef op dinsdag 19 juli 2005 @ 11:54:
Ik vind je probleem vrij vaag omschreven, maar als ik het goed begrepen heb, zou de volgende code wel moeten kloppen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(isset($_POST['submit'])) {
  $sql = "SELECT * FROM products WHERE categorie='".$_POST['categorie']."'";
  $resultaat = mysql_query($sql) OR die ("Kon geen verbinding maken met de database.");
  $aantalrij = mysql_num_rows($resultaat); //telt aantal rijen

  echo "<select name='Product'>";

  while( $row = mysql_fetch_assoc($resultaat) ) {
    $pn = $row['Product'];
    echo "<option value='$pn' />$pn";
  }

  echo "</select>";
}
Sorry werkt wel, was het nog een keer door aan het lezen en kwam er achter dat je Product met een hoofdletter had geschreven en dat verandert in een kleine letter en werkt perfect, iig bedankt.

  • Gertjan
  • Registratie: Oktober 2001
  • Laatst online: 07-02 20:23

Gertjan

mmmm, beer...

Tundreq schreef op dinsdag 19 juli 2005 @ 12:15:
[...]

Sorry werkt wel, was het nog een keer door aan het lezen en kwam er achter dat je Product met een hoofdletter had geschreven en dat verandert in een kleine letter en werkt perfect, iig bedankt.
Graag gedaan, maar zoek inderdaad even op internet op hoe het normaliseren van een database werkt, want volgens mij steekt je model niet helemaal lekker in elkaar :).

  • Matthis
  • Registratie: Juli 2004
  • Laatst online: 21:44
Tundreq schreef op dinsdag 19 juli 2005 @ 11:45:
PHP:
1
  $sql = "SELECT * FROM products WHERE categorie='".$_POST['categorie']."'";
Dit heeft wel niks met je probleem op zich te maken, maar aangezien je een beginner bent zou ik je er toch willen op attent maken dat je code niet zo heel veilig is: er is namelijk een (groot) risico op SQL-injection aanwezig. Dit houdt in dat een kwaadwillige gebruiker met je query kan gaan knoeien omdat $_POST['categorie'] niet gecontroleerd wordt. Neem eens een kijkje in de PHP manual en op http://phpsec.org/projects/guide/3.html#3.2 .
Pagina: 1