• Reset your password

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log in
Hjem
Linuxin 2025

Breadcrumb

  • Hjem
  • forums
  • PHP: indre loop i embedded loop fejler.

Hvad kan du med 100% sikkerhed sige, at du har stemt?

Valgmuligheder
Af Jacques | 25.05.2008 21:49

PHP: indre loop i embedded loop fejler.

Programmering

Hej,



Jeg har et problem med en embedded FOR-loop struktur der driller, håber I kan hjælpe.



Jeg er ved at lave en shoppingcart og har et problem med at opsamle al data fra en dynamisk generet form.



En bruger kan vælge et antal option dropdown's ved oprettelse af et givent produkt. Han vælger antal af blokke/option sæt ved at sætte $_SESSION['optionsets'] og antallet af "option/stock/price" produkt linjer i hver blok ved at sætte $_SESSION['options'] - begge med numeriske værdier. Det ser således ud når det køres:



FORMEN

<?php

for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {

echo "

Set Title:



";

for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {

echo "Option:

Stock:

Price:
";

}

echo "
";

}



?>

Det forsøges så hentet med:

<?php

for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr)

{

$getoptiontitles[$nr] = strip_tags(mysql_real_escape_string($_POST["option_title$nr"]));

for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1)

{

$getoptionname[$nr1] = strip_tags(mysql_real_escape_string($_POST["option_name$nr"]));

$getoptionstock[$nr1] = strip_tags(mysql_real_escape_string($_POST["stock$nr"]));

$getoptionprice[$nr1] = strip_tags(mysql_real_escape_string($_POST["price$nr"]));

}

}

?>



hver af de tre typer af produktfelter gemmes i hver deres array.



For at tage et konkret eksempel, har jeg valgt at sætte de to session parametre til 2 og 2, og har valgt at kalde blokkene "AA" og "BB "og har indtastet værdier fra 1 - 12 i alle option linjerne. Det ser således ud: http://www.sitepoint.com/forums/attachment.php?attachmentid=49965&d=121…



Mit problem er, at 1-2-3 og 7-8-9 skrives over. Hvorfor sker det? Det er muligt at årsagen er simpel, men jeg har stirret mig selv blind på dette for længe siden.



Udskrivningen af arrays'ne ser således ud:

<?php

Array ( [1] => AA )



Array ( [1] => 4 )

Array ( [1] => 5 )

Array ( [1] => 6 )



Array ( [1] => 4 [2] => 4 )

Array ( [1] => 5 [2] => 5 )

Array ( [1] => 6 [2] => 6 )





Array ( [1] => AA [2] => BB )



Array ( [1] => 10 [2] => 4 )

Array ( [1] => 11 [2] => 5 )

Array ( [1] => 12 [2] => 6 )



Array ( [1] => 10 [2] => 10 )

Array ( [1] => 11 [2] => 11 )

Array ( [1] => 12 [2] => 12 )

?>

Titlerne gemmes fint som Array ( [1] => AA [2] => BB )



Hvordan kringler jeg den her? Hvad gør jeg galt?

  • Log in to post comments

Kommentarer14

17 år siden

Permalink

Indsendt af dk_zero-cool den 25. maj 2008 kl. 23:18

Permalink

Re: PHP: indre loop i embedded loop fejler.

Inden jeg forsøger at tage et kik på det, så skal jeg lige vide om du har skrevet HELE koden til den første del "FORMEN", eller om der mangler noget.

For sådan som den ser ud lige nu, så mangler der en afslutning på den første loop



Og så har html fejl i en af linierne, hvor du skriver "labelclass=" istedet for "label class="

  • Log in to post comments

17 år siden

Permalink

Indsendt af skou den 26. maj 2008 kl. 13:35

Permalink

Re: PHP: indre loop i embedded loop fejler.

Så vidt jeg kan se, så drejer det sig om en simpel fejl...

I andet loop, i begge kodeudsnit, bruger du $nr, hvilket nok skulle være $nr1.

Måske skulle du vælge nogle bedre navne til dine variable så det er nemmere at holde styr på.



/Skou

  • Log in to post comments

17 år siden

Permalink

Indsendt af Jacques den 26. maj 2008 kl. 15:14

Permalink

Re: PHP: indre loop i embedded loop fejler.

Tak for svarene.



@Dk_zero_cool:



Jeg har har med vilje skåret koden ind til kun at omfatte det logisk relevante for at holde totalmængden nede, det andet bliver hurtigt noget møg for folk at kigge på og kode paste'ing ser i forvejen ikke alt for fedt ud herinde...



@Skou:



Det er ikke det. Jeg har prøvet at lege med indekseringen allerede, men det giver bare et andet uønsket resultat. Logikken funker perfekt med udskrivningen af formen, bare ikke opsamlingen.



Det resultat jeg er på udkig efter ville nok se noget nær således ud i print_r()

<?php

Array ( [1] => AA )



Array ( [1] => 1 )

Array ( [1] => 2 )

Array ( [1] => 3 )



Array ( [1] => 1 [2] => 4 )

Array ( [1] => 2 [2] => 5 )

Array ( [1] => 3 [2] => 6 )



Array ( [1] => AA [2] => BB )



Array ( [1] => 7 )

Array ( [1] => 8 )

Array ( [1] => 9 )



Array ( [1] => 7 [2] => 10 )

Array ( [1] => 8 [2] => 11 )

Array ( [1] => 9 [2] => 12 )



?>

  • Log in to post comments

17 år siden

Permalink

Indsendt af skou den 26. maj 2008 kl. 15:29

Permalink

Re: PHP: indre loop i embedded loop fejler.

Nu har jeg undersøgt det nærmere...

Og problemet er at du laver en form med identiske navne.



ligger inde i 2 loops, ergo skal du have 2 nummereringer på. Så noget i stil med:



skulle virke...



Eksempel:



<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {

print_r($_POST);

}



echo "\n";

for ($nr = 1; $nr <= 2; ++$nr) {

echo "

\nSet Title:\n\n

\n

\n";

for ($nr1 = 1; $nr1 <= 2; ++$nr1) {

echo "Option:\n\n";

echo "Stock:\n\n";

echo "Price:\n\n
\n";

}

echo "
\n";

}



echo "";

echo "";

?>





/Skou

  • Log in to post comments

17 år siden

Permalink

Indsendt af Jacques den 26. maj 2008 kl. 20:07

In reply to Re: PHP: indre loop i embedded loop fejler. by skou

Permalink

Re: Re: PHP: indre loop i embedded loop fejler.

Det ser ikke helt sådan ud, for eksempelvis $nr$nr1 giver "11" og "22" og det må da give en undefined index når felterne forsøges hentet og jeg mener at validering failer hvis man smider klammer omkring...



UPDATE: Det failede, men med undefined index 1 og 2?:

<?php

Array ( [1] => AA )





Notice: Undefined index: option_name1 in /home/arioch/public_html/formprocessor.php on line 268

Array ( [1] => )

Array ( [1] => 5 )

Array ( [1] => 6 )





Notice: Undefined index: option_name1 in /home/arioch/public_html/formprocessor.php on line 268

Array ( [1] => [2] => )

Array ( [1] => 5 [2] => 5 )

Array ( [1] => 6 [2] => 6 )





Array ( [1] => AA [2] => BB )





Notice: Undefined index: option_name2 in /home/arioch/public_html/formprocessor.php on line 268

Array ( [1] => [2] => )

Array ( [1] => 11 [2] => 5 )

Array ( [1] => 12 [2] => 6 )





Notice: Undefined index: option_name2 in /home/arioch/public_html/formprocessor.php on line 268

Array ( [1] => [2] => )

Array ( [1] => 11 [2] => 11 )

Array ( [1] => 12 [2] => 12 )

?>

  • Log in to post comments

17 år siden

Permalink

Indsendt af skou den 26. maj 2008 kl. 22:31

Permalink

Re: PHP: indre loop i embedded loop fejler.

Jeg forstår ikke hvad det er du gør...



Virker følgende ikke som du ønsker?



<?php

for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {

echo "

Set Title:



";

for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {

echo "Option:\n";

echo "\n";

echo "Stock:\n";

echo "\n";

echo "Price:\n";

echo "\n";

echo "
\n";

}

echo "
";

}

?>



og



<?php

for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {

$getoptiontitles[$nr] = strip_tags(mysql_real_escape_string($_POST["option_title$nr"]));

for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {

$getoptionname[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["option_name$nr$nr1"]));

$getoptionstock[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["stock$nr$nr1"]));

$getoptionprice[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["price$nr$nr1"]));

}

}

?>





/Skou

  • Log in to post comments

17 år siden

Permalink

Indsendt af Jacques den 27. maj 2008 kl. 18:30

In reply to Re: PHP: indre loop i embedded loop fejler. by skou

Permalink

Re: Re: PHP: indre loop i embedded loop fejler.

Ahhh jo, ok. Blev lige ramt af "klammeforvirring", hvilket så lige warpede resultatet.



print_r() af de 4 arrays giver:

<?php

Array ( [1] => AA )



option

Array ( [1] => Array ( [1] => 1 ) )

stock

Array ( [1] => Array ( [1] => 2 ) )

price

Array ( [1] => Array ( [1] => 3 ) )

option

Array ( [1] => Array ( [1] => 1 [2] => 4 ) )

stock

Array ( [1] => Array ( [1] => 2 [2] => 5 ) )

price

Array ( [1] => Array ( [1] => 3 [2] => 6 ) )

option

Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) )

stock

Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) )

price

Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) )



Array ( [1] => AA [2] => BB )



option

Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) [2] => Array ( [1] => 10 ) )

stock

Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) [2] => Array ( [1] => 11 ) )

price

Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) [2] => Array ( [1] => 12 ) )

option

Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) [2] => Array ( [1] => 10 [2] => 13 ) )

stock

Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) [2] => Array ( [1] => 11 [2] => 14 ) )

price

Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) [2] => Array ( [1] => 12 [2] => 15 ) )

option

Array ( [1] => Array ( [1] => 1 [2] => 4 [3] => 7 ) [2] => Array ( [1] => 10 [2] => 13 [3] => 16 ) )

stock

Array ( [1] => Array ( [1] => 2 [2] => 5 [3] => 8 ) [2] => Array ( [1] => 11 [2] => 14 [3] => 17 ) )

price

Array ( [1] => Array ( [1] => 3 [2] => 6 [3] => 9 ) [2] => Array ( [1] => 12 [2] => 15 [3] => 18 ) )

?>

Læren må så være, at for hvert antal lag i et embedded loop, skal man altså slæbe indekseringsvariablen med sig og påføre dem bag på navnestrengen i rækkefølgen yderste loop først til inderste.



Jeg bliver bare lidt nysgerrig, for der laves jo et multidimensional array, men det uden at countervariablerne er adskilt via [$nr][$nr1]? $nr$nr1 burde jo for PHP bare være et enkelt nr. Hvordan fatter PHP at der skal være et multidimensionelt array uden brug af klammerne omkring hver af countervariablerne?



Jeg har fra anden side også fået foreslået at bruge klammer omkring countervariablerne i navngivningen af selve formfelterne for derigennem at kunne benytte $_POST array'et til at parkere det hele i og så tilgå via $_POST['option_title'][$nr] og $_POST['option_name'][$nr][$nr1]., men så vidt jeg ved, failer valideringen af det.



Takker for arbejdet, sætter pris på din tid.

  • Log in to post comments

16 år 12 måneder siden

Permalink

Indsendt af skou den 28. maj 2008 kl. 09:24

In reply to Re: Re: PHP: indre loop i embedded loop fejler. by Jacques

Permalink

Re: PHP: indre loop i embedded loop fejler.



Læren må så være, at for hvert antal lag i et embedded loop, skal man altså slæbe indekseringsvariablen med sig og påføre dem bag på navnestrengen i rækkefølgen yderste loop først til inderste.



Ja, hver enkel variabel (input felt) skal jo være unik. Hvis der er flere variable med samme navn, er det kun den sidste der bliver registreret af PHP.





Jeg bliver bare lidt nysgerrig, for der laves jo et multidimensional array, men det uden at countervariablerne er adskilt via [$nr][$nr1]?



Nej, i dette tilfælde bliver der ikke lavet et multidimensionelt array. Variablerne hedder noget i stil med:

$nr$nr1

F.eks.: option_name21





$nr$nr1 burde jo for PHP bare være et enkelt nr. Hvordan fatter PHP at der skal være et multidimensionelt array uden brug af klammerne omkring hver af countervariablerne?



PHP opfatter ikke de navne (input name) som arrays da der ikke bliver brugt klammer i navnet.

Hvis du i stedet brugte:

[$nr][$nr1]

vil PHP tolke dem som arrays. Og dette er nok i virkeligheden bedre da der kan opstå fejl med den anden løsning.

Forestil dig at begge dine løkker kører til 11. Så vil du få to identiske variable nemlig option_name111, men hvis du derimod brugte klammer ville disse være adskilt. Henholdsvis option_name[1][11] og option_name[11][1].





Jeg har fra anden side også fået foreslået at bruge klammer omkring countervariablerne i navngivningen af selve formfelterne for derigennem at kunne benytte $_POST array'et til at parkere det hele i og så tilgå via $_POST['option_title'][$nr] og $_POST['option_name'][$nr][$nr1]., men så vidt jeg ved, failer valideringen af det.



Så laver du et eller andet galt...?



Prøv at se på følgende eksempel:



<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {

echo nl2br(print_r($_POST, true));

}



echo "\n";

for ($i = 0; $i <= 5; ++$i) {

for ($j = 0; $j <= 5; ++$j) {

echo "\n";

}

echo "
\n";

}



echo "";

echo "";

?>





Du kan læse mere om variable som modtages af PHP fra forms på http://www.php.net/manual/en/language.variables.external.php



/Skou

  • Log in to post comments

17 år siden

Permalink

Indsendt af dusted den 27. maj 2008 kl. 01:21

Permalink

Re: PHP: indre loop i embedded loop fejler.

kør en foreach på $_POST superglobalen i stedet.

  • Log in to post comments

16 år 12 måneder siden

Permalink

Indsendt af Jacques den 28. maj 2008 kl. 11:25

Permalink

Re: PHP: indre loop i embedded loop fejler.

Så din anbefaling vil altså være at bruge klammer omkring samtlige countervariabler påsat bag på feltnavnene i formen også og bruge omtalte $_POST løsning istedet, da det ikke vil validere fejl og dermed også undgå eventuelle logiske konflikter?

  • Log in to post comments

16 år 12 måneder siden

Permalink

Indsendt af skou den 28. maj 2008 kl. 11:40

Permalink

Re: PHP: indre loop i embedded loop fejler.

Om du bruger $_POST variablen direkte, eller først smider de enkelte værdier over i nye variable burde være under ordnet. Det bliver givet vis mere overskueligt hvis du bruger nogle seperate variable, i stedet for at skulle tilgå data gennem $_POST hver gang det skal bruges...



Ja, til den løsning som du leder efter vil jeg mene at det er lettere at bruge arrays...



/Skou

  • Log in to post comments

16 år 12 måneder siden

Permalink

Indsendt af Jacques den 28. maj 2008 kl. 19:11

Permalink

Re: PHP: indre loop i embedded loop fejler.

Jeg har nu gjort som jeg mener foreslået, men får en masse "undefined index"



Formen er:

<?php

for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {

echo "

Set Title:



";

for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {

echo "Option:

Stock:

Price:
";

}

echo "
";

}

}

?>

Opsamlingskoden er:

<?php

for ($nr = 1; $nr <= $_SESSION['optionsets']; ++$nr) {

$getoptiontitles[$nr] = strip_tags(mysql_real_escape_string($_POST["option_title[$nr]"]));

for ($nr1 = 1; $nr1 <= $_SESSION['options']; ++$nr1) {

$getoptionname[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["option_name[$nr][$nr1]"]));

$getoptionstock[$nr][$nr1] = strip_tags(mysql_real_escape_string($_POST["stock[$nr][$nr1]"]));

$getoptionprice[$nr][$nr1 ]= strip_tags(mysql_real_escape_string($_POST["price[$nr][$nr1]"]));

}

}

?>

Mine Arrays er nu tomme...

  • Log in to post comments

16 år 12 måneder siden

Permalink

Indsendt af skou den 28. maj 2008 kl. 22:32

Permalink

Mine Arrays er nu



Mine Arrays er nu tomme...



Jep, og det er fordi du tilgår dem forkert.



[1]'/>



registrerer PHP som



<?php

$_POST[""][1]

?>





/Skou

  • Log in to post comments

16 år 12 måneder siden

Permalink

Indsendt af Jacques den 29. maj 2008 kl. 10:51

Permalink

Re: PHP: indre loop i embedded loop fejler.

Oh right, ok. Counterne skal IKKE inkluderes med strengen i $_POSTS's eget klammesæt, men i selvstændige klammesæt følgende efter.



Takker.

  • Log in to post comments

Svar søges

Test 0
Den er go 0
Vil du have et sikrere og mere privat internet? Du skal blot installere Vivaldi-browseren med Proton VPN understøttelse! 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0

Seneste aktivitet

"Intet realistisk alternativ" - mig i r*ven 5
2 stk Jolla C2 sælges 2
Test 2
Det første forumindlæg efter installation af Forum-modulet 8
Vanilla OS 12
Nye forum-indlæg viser sig kun 1 gang 1
Vil alle forumindlæg vise sig to gange 1
Hjælp til remote terminal vindue? 3
PCLinuxOS 19
Kan ikke boote på installation 24
80-20 reglen 1
Skærmlys fader ud på min bærbare 8
32 bit distro på max 700mb der stadig understøttes 26
Har vi nogen Linux konsulenter i Slagelse området? 3
Virkelig 7
gnome-software? 3
Archer T2U AC600 Wireless Dual Band USB Adapter 26
En farverig APT 3.0 udgivelse imponerer med sine nye funktioner 2
Unix's fødsel 2
Linux Mint 13

Copyright © 2025 Company Name - All rights reserved

Developed & Designed by Alaa Haddad