PHP: indre loop i embedded loop fejler.
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
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="
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
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 )
?>
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
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 )
?>
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
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.
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
Re: PHP: indre loop i embedded loop fejler.
kør en foreach på $_POST superglobalen i stedet.
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?
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
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...
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
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.