Avatar billede steenolsen1 Nybegynder
23. september 2005 - 08:17 Der er 29 kommentarer

Lave et array

Hej,

det med arrays fatter jeg simpelthen bare ikke, og nu bliver jeg nødt til at spørge...

Jeg har to tabeller - varer og varegrupper. I et administrationsmodul, opdateres tabellen varer, hvor der bl.a. skal kunne skiftes varegruppe for den valgte vare. Opdateringen foregår ved, at jeg udskriver alle varerne til skærmen, og ud for hver vare, skal der så være en dropdown (<select>), hvorfra eventuel ny varegruppe kan vælges.

Hvis jeg har eks. 600 varer, vil jeg - som jeg programmerer i dag - skulle lave 601 forespørgsler til databasen (1 der henter varerne fra "varer", og en for hver record, der henter "varegrupper". Dette kan jeg vel korte ned til to queries - en til varegrupper og en til varer.

Jeg kunne derfor godt tænke mig at få at vide, hvordan jeg kan lave et array, hvori jeg lægger varegruppeid og varegruppenavn, så jeg kan lave en dropdown (select) i den EFTERFØLGENDE udskrift af varere til skærmen.
Avatar billede dmdisco Nybegynder
23. september 2005 - 08:41 #1
$result = mysql_query("SELECT * FROM varegrupper") or die (mysql_error());
while ($row = mysql_fetch_array($result)) {
    $option .= "<option value=\"".$row[varegruppeid]."\">".$row[varegruppeid]."</option>\n";
}

så har du din dropdown data i variablen $option
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 08:48 #2
Ja - den er jeg godt med på, og det er sådan jeg gør idag. Men på denne måde, skal jeg lave alt for mange forespørgsler, hvilket vil sænke sidens hastighed.

Jeg vil gerne gøre sådan her:
1) Lav en forespørgsel i varegrupper, og læg records i et array (varegruppeid og varegruppenavn).
2) Lav en forespørgsel i varer, og udskriv til skærm

Der kommer noget tables-værk ind i udskrvningen, men simplificeret, skal det se sådan her ud:

$q_varer = $("SELECT * FROM varer ORDER BY varenavn ASC");
while($varer = mysql_fetch_assoc($q_varer)) {
  echo '<tr>';
  echo '<td>'.$varer[varenavn].'</td>';
  echo '<td>* * * <select>...</select></td>';
  echo '</tr>';
}

Dermed kan du se, at jeg med din løsning bliver nødt til at forespørge en gang for hver record - alt for tungt :-)
Avatar billede dmdisco Nybegynder
23. september 2005 - 08:54 #3
det skal du da ikke du laver den 1 gang og bruger variablen resten af vejen ned

$result = mysql_query("SELECT * FROM varegrupper") or die (mysql_error());
while ($row = mysql_fetch_array($result)) {
    $option .= "<option value=\"".$row[varegruppeid]."\">".$row[varegruppeid]."</option>\n";
}

$q_varer = $("SELECT * FROM varer ORDER BY varenavn ASC");
while($varer = mysql_fetch_assoc($q_varer)) {
  echo '<tr>';
  echo '<td>'.$varer[varenavn].'</td>';
  echo '<td>* * * <select>$option</select></td>';
  echo '</tr>';
}
Avatar billede dmdisco Nybegynder
23. september 2005 - 08:55 #4
det er 2 kald og 2 while løkker
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 09:18 #5
Ahhhh... sorry - havde liiige overset $option .=

Smart nok :-) Og jo egentlig simpelt, når man ser det....

Til gengæld har jeg så næste problem nu. Normalt laver jeg noget a la nedenstående, som sætter dropdown'en til at have valgt den varegruppe som er valgt i forvejen:
if($varer[varegruppeid] == $row[varegruppeid]) {
  echo '<option value="'.$row[varegruppeid].'" selected>'.$varer[varenavn].'</option>';
} else {
  echo '<option value="'.$row[varegruppeid].'">'.$varer[varenavn].'</option>';

Hvordan kan jeg lige klare det?
Avatar billede dmdisco Nybegynder
23. september 2005 - 09:30 #6
hmm tja du kan enten lave en ekstra <option value="$row[varegruppeid]">ingen ændring</option> eller også skal du bruge et array men så skal du også lave en ekstra while løkke hver gang
Avatar billede dmdisco Nybegynder
23. september 2005 - 09:31 #7
$option = array();
while ($row = mysql_fetch_array($result)) {
    $option[] = $row[varegruppeid];
}
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 09:41 #8
Hmmm. Okay - så er jeg nærmest tilbage hvor jeg startede :-|

Hvad nu, hvis man lavede endnu et array før whileløkken, hvor man hentede vareid og varegruppeid fra *varer*, og så matchede dem med forespørgslen i whileløkken? Jeg kan ikke finde ud af det med arrays, men hvis man kunne registrere vareid og varegruppeid i en ny array, kan man vel godt matche, og hvis det så matcher udskrive det ene, eller det andet....?
Avatar billede dmdisco Nybegynder
23. september 2005 - 10:07 #9
hmm det burde vel virke at lave en str_replace()

$option_sel = str_replace("<option value=\"".$varer[varegruppeid]."\">", "<option value=\"".$varer[varegruppeid]."\" SELECTED>", $option)

har dog aldrig prøvet det sådan ser også lidt sært ud men måske virker det
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 10:11 #10
Øhh.... ja, det ser lidt sært ud :-)

Jeg kan ikke lige helt fange, hvordan sammenhængen er med dette og så den eksisterende kode. Kan du uddybe eksemplet?
Avatar billede dmdisco Nybegynder
23. september 2005 - 10:14 #11
det sted du vil have at option tagget skal være SELECTED ændre du bare med str_replace()

$result = mysql_query("SELECT * FROM varegrupper") or die (mysql_error());
while ($row = mysql_fetch_array($result)) {
    $option .= "<option value=\"".$row[varegruppeid]."\">".$row[varegruppeid]."</option>\n"; // skal den ikke skrive et gruppe navn i option tagget?
}

$q_varer = $("SELECT * FROM varer ORDER BY varenavn ASC");
while($varer = mysql_fetch_assoc($q_varer)) {
$option_sel = str_replace("<option value=\"".$varer[varegruppeid]."\">", "<option value=\"".$varer[varegruppeid]."\" SELECTED>", $option)

  echo '<tr>';
  echo '<td>'.$varer[varenavn].'</td>';
  echo '<td>* * * <select>$option_sel</select></td>';
  echo '</tr>';
}
Avatar billede dmdisco Nybegynder
23. september 2005 - 10:18 #12
hov mangler lige et ;
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 10:28 #13
Smart nok. Kan godt se tanken, men jeg mangler på en eller anden måde, at tjekke om kriterierne for str_replace er opfyldt, gør jeg ikke.

Det virker ikke, men jeg synes heller ikke at vi får tjekket om de to variabler er ens
Avatar billede dmdisco Nybegynder
23. september 2005 - 10:32 #14
variablen $varer[varegruppeid] og $row[varegruppeid] burde jo være ens da det er et id nummer
$option burde se nogenlunde sådan her ud:

<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>

og <option value=\"".$varer[varegruppeid]."\"> burde se sådan her ud
<option value="2">2</option>
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 10:40 #15
Hvis jeg får vist kildekoden, får jeg følgende output:

<select name="parent_kat" class="no_border">
<option value="58">Cd´er</option>
<option value="70">Figurer</option>
</select>
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 10:41 #16
Og det gælder ALLE records.
Avatar billede dmdisco Nybegynder
23. september 2005 - 10:42 #17
ja og hvis $varer[varegruppeid] eks indeholder 58 så burde str_replace() jo ændre den linie til en option der er selected ikk
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 10:57 #18
Det var i hvert fald det jeg gerne ville have den til at gøre. Men det gør den desværre ikke...

Nu har jeg ikke lige lavet en konstruktion a la den du foreslår før, men umiddelbart kan jeg ikke se, at vi tjekker om der skal udskrives det ene med det andet.

I min eksempel ovenfor, er der to værdier - 58 og  70. Hvor i koden tjekker vi, om $varer[varegruppeid] == 58 eller 70?
Avatar billede dmdisco Nybegynder
23. september 2005 - 11:00 #19
det gør du hellere ikke for før det bliver udskrevet laver du en ny variabel hvor du ændre det tag som har et bestemt id nummer til selected og resten forbliver som normale og derefter udskriver du den nye variabel ($option_sel) en god ide vil være at unset($option_sel) efter du har udskrevet den for ellers vil den ændre den næste hvis den ikke finder et id der passer
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 11:05 #20
Har tilføjet unset...

Jamen, så kan det vel kun være fordi jeg måske har indsat koden det forkerte sted. $option_sel.... står i whileløkken.

Skal jeg eventuelt prøve at poste hele koden?
Avatar billede dmdisco Nybegynder
23. september 2005 - 11:06 #21
prøv bare at poste den bid af det fra mysql query til den sidste del af udskrivningen
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 11:14 #22
// Laver dropdown til valg af hovedgruppe
$q_hovedkat = mysql_query("SELECT * FROM kategorier WHERE parent_kat = '0' AND shopid = '$_SESSION[shopid]'");
while($hovedkat = mysql_fetch_assoc($q_hovedkat)) {
    $option .= '<option value="'.$hovedkat[kat_id].'">'.$hovedkat[kat_navn].'</option>';
}

// Henter varegrupper
if(!isset($_GET[kat_id])) {
    // Henter alle hovedkategorier
    $q_kategorier = mysql_query("SELECT * FROM kategorier WHERE parent_kat != '0' AND shopid = '$_SESSION[shopid]' ORDER BY parent_kat ASC");
} else {
    // Henter valgte kategori
    $q_kategorier = mysql_query("SELECT * FROM kategorier WHERE kat_id = '$_GET[kat_id]' AND shopid = '$_SESSION[shopid]'");
}
$flag = 1;
while($kategorier = mysql_fetch_assoc($q_kategorier)) {
    $option_sel = str_replace("<option value=\"".$hovedkat[kat_id]."\">", "<option value=\"".$hovedkat[kat_id]."\" selected>", $option);
    $antal = $flag%2;
    if($antal == 1) {
        $trcolor = "#cccccc";
    } else {
        $trcolor = "#ffffff";
    }
    // Medsender kat_id
    echo '<input type="hidden" name="kat_id" value="'.$kategorier[kat_id].'" />';
    echo '<tr bgcolor="'.$trcolor.'">';
    echo '<td>'.$kategorier[kat_id].'</td>';
    echo '<td><select name="parent_kat"';
    if($antal == 1) {
        echo ' class="no_border1">';
    } else {
        echo ' class="no_border">';
    }
    echo $option_sel;
    unset($option_sel);
    echo '</select>';
    echo '</td>';
    echo '<td><input type="text" name="kat_navn" value="'.$kategorier[kat_navn].'" size="40" maxlength="100"';
    if($antal == 1) {
        echo ' class="no_border1"';
    } else {
        echo ' class="no_border"';
    }
    echo ' /></td>';
    echo '<td><input type="submit" name="opdater_kat" value="Opdater" class="button_ok" /> <input type="reset" value="Fortryd" class="button_fortryd" /> <input type="submit" name="slet_kat" value="Slet gruppe" class="button_slet" /></td>';
    echo '</tr>';
    $flag++;
}
Avatar billede dmdisco Nybegynder
23. september 2005 - 11:54 #23
ændre
$flag = 1;
while($kategorier = mysql_fetch_assoc($q_kategorier)) {
    $option_sel = str_replace("<option value=\"".$hovedkat[kat_id]."\">", "<option value=\"".$hovedkat[kat_id]."\" selected>", $option);

til

$flag = 1;
while($kategorier = mysql_fetch_assoc($q_kategorier)) {
    $option_sel = str_replace("<option value=\"".$q_kategorier[kat_id]."\">", "<option value=\"".$q_kategorier[kat_id]."\" selected>", $option);
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 12:02 #24
Desværre - virker ikke...

Hvis jeg prøver at udskrive
echo "<option value=\"".$q_kategorier[kat_id]."\">", "<option value=\"".$q_kategorier[kat_id]."\" selected>", $option;

resulterer det i følgende GENTAGNE udskrift for hver record:
Du arbejder i øjeblikket med KRYSTALLAGERET. Skift til Sliklageret
Forside

Butikken
Varer
Åbn butikken

Administration
Hovedkategorier
Kategorier
Alle varer
ID Hovedkategori Kategorinavn  Cd´erFigurer
3 Cd´erFigurer   
Cd´erFigurer 8 Cd´erFigurer   
Cd´erFigurer 6 Cd´erFigurer   
Cd´erFigurer 9 Cd´erFigurer   
Cd´erFigurer 10 Cd´erFigurer   
Cd´erFigurer 11 Cd´erFigurer   
Cd´erFigurer 12 Cd´erFigurer   
Cd´erFigurer 13 Cd´erFigurer   
Cd´erFigurer 14 Cd´erFigurer   
Cd´erFigurer 15 Cd´erFigurer   
Cd´erFigurer 16 Cd´erFigurer   
Cd´erFigurer 17 Cd´erFigurer   
Cd´erFigurer 18 Cd´erFigurer   
Cd´erFigurer 19 Cd´erFigurer   
Cd´erFigurer 20 Cd´erFigurer   
Cd´erFigurer 21 Cd´erFigurer   
Cd´erFigurer 22 Cd´erFigurer   
Cd´erFigurer 23 Cd´erFigurer   
Cd´erFigurer 24 Cd´erFigurer   
Cd´erFigurer 25 Cd´erFigurer   
Cd´erFigurer 26 Cd´erFigurer   
Cd´erFigurer 27 Cd´erFigurer
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 12:03 #25
Ups fik lidt for meget med... Men du kan forhåbentlig se, hvad jeg mener?
Avatar billede dmdisco Nybegynder
23. september 2005 - 12:13 #26
nej ikke helt
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 12:32 #27
Okay - prøver lige igen.

Hvis jeg udskriver alle records med følgende:
$option_sel = str_replace("<option value=\"".$q_kategorier[kat_id]."\">", "<option value=\"".$q_kategorier[kat_id]."\" selected>", $option);

får jeg følgende resultat:
Cd´erFigurer 16 Cd´erFigurer   
Cd´erFigurer 17 Cd´erFigurer   
Cd´erFigurer 18 Cd´erFigurer   
Cd´erFigurer 19 Cd´erFigurer   
Cd´erFigurer 20 Cd´erFigurer   
Cd´erFigurer 21 Cd´erFigurer   
Cd´erFigurer 22 Cd´erFigurer   
Cd´erFigurer 23 Cd´erFigurer   
Cd´erFigurer 24 Cd´erFigurer   
Cd´erFigurer 25 Cd´erFigurer   
osv.

altså en udskrift af begge varekategorier.
Avatar billede dmdisco Nybegynder
23. september 2005 - 12:34 #28
øhh du burde gerne få en række option tags
Avatar billede steenolsen1 Nybegynder
23. september 2005 - 12:45 #29
Ja, men jeg har bare lige udskrevet det uden for en select, for at se, hvad det gav af indhold.

Jeg kunne godt have tænkt mig at konstatere, at der ville være forskel i udskrifterne, så de matchede varegrupperne.

Hvad gør vi tror du? Jeg slipper måske alligevel ikke for at lave en ny forespørgsel i whileløkken....?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester