[php] array laat alleen laatste entry zien in for loop

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
Goede morgen,

Kan iemand me wellicht helpen met het volgende probleem.

Voor het vullen van een aantal selectboxen haal ik data op uit mijn database.

Dit doe ik met:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // get all images from library

$query = "  SELECT      uplID, uplFilename 
            FROM        " . UPLOADS_TABLE . " 
            WHERE       uplMimetype LIKE '%image%' 
            ORDER BY    uplFilename
        ";
        $qres = mysql_query($query) or die("Database error<HR>" . mysql_error());
        $all_images = array();
        $y = 0;
         while ($qrow = mysql_fetch_array($qres)) {
               $all_images[] = $qrow['uplFilename'];
               $y++;
        }
        mysql_free_result($qres);


Vervolgens wordt via een while loop een aantal keer een selectbox gemaakt. (dit gebeurd via die loop omdat het aantal selectboxen (dropdown) dynamisch is.

De loop ziet er zo uit:

code:
1
2
3
// news
for($n = 0; $n < $custom_items; $n++) {
}


Die loop wordt 5 keer doorlopen (dus ik krijg 5 selectboxen) die gevuld worden met de data uit de database.

Dit ziet er zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
// images
for($x = 0; $x < count($all_images); $x++) {
                    
        $imgData = array(
            'FILENAME'  => stripslashes($all_images[$x]),
            'SELECTED'  => (($_POST['preview']) && ($_POST['image'.($n+1)] == stripslashes($all_images[$x]))) ? 'selected' : ''
                        );
                        
    //      echo stripslashes($all_images[$x]) . "<br>";
                                    
    $xtpl->assign("FILE", $imgData);
    $xtpl->parse("main.newsletter_form.news.images.file");
    }



De html code waar dit in komt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 <!- BEGIN: images ->
<tr valign="top">
    <td class="dark"><b>Afbeelding:</b></td>
    <td class="light">
        <select name="image{IMAGES.NUMBER}" style="width:200px;">
            <option value="0">(geen)</option>
            <!- BEGIN: file ->
            <option value="{FILE.FILENAME}" {FILE.SELECTED}>&nbsp;{FILE.FILENAME}</option>
            <!- END: file ->
        </select>   
    </td>
</tr>
<!- END: images ->


Wat nu het probleem is waar ik maar niet uit kom. Als ik de array $imgData in mn html plaats laat hij alleen de laatste entry uit de database zien.

Ik dacht dus dat mijn loop niet goed was. Daarom heb ik die "echo" ertussen geplaatst. Maar die laat wel alle entry's uit de database zien.

Dus mijn array wordt blijkbaar niet goed gevuld.
Ik hoop dat het verhaal een beetje duidelijk is en iemand een idee heeft waar ik de oplossing kan zoeken.

Alvast bedankt!

Groetjes!

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Deze regels moeten buiten de for-loop:

code:
1
2
$xtpl->assign("FILE", $imgData);
$xtpl->parse("main.newsletter_form.news.images.file");

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ow... dat alleen is niet genoeg, dit stuk is helemaal fout:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
// images
for($x = 0; $x < count($all_images); $x++) {
                    
        $imgData = array(
            'FILENAME'     => stripslashes($all_images[$x]),
            'SELECTED'    => (($_POST['preview']) && ($_POST['image'.($n+1)] == stripslashes($all_images[$x]))) ? 'selected' : ''
                        );
                        
    //        echo stripslashes($all_images[$x]) . "<br>";
                                    
    $xtpl->assign("FILE", $imgData);
    $xtpl->parse("main.newsletter_form.news.images.file");
    }


Moet zoiets zijn lijkt me:

PHP:
1
2
3
4
5
6
7
8
9
10
$imgData = array()
for ($x = 0; $x < count($all_images); ++$x) {
  $imgData[] = array(
    'FILENAME' => stripslashes($all_images[$x]),
    'SELECTED' => (($_POST['preview']) && ($_POST['image'. ($n + 1)] == stripslashes($all_images[$x]))) ? 'selected' : ''
  );
}

$xtpl->assign("FILE", $imgData);
$xtpl->parse("main.newsletter_form.news.images.file");

Acties:
  • 0 Henk 'm!

  • daaan
  • Registratie: Maart 2000
  • Laatst online: 04-09 13:13

daaan

Brandweer Zoutkamp

Wat HuHu dus laat zien met correcte code, is dat je $imgData array elke iteratie weer opnieuw geset wordt. Elke loop word de vorige waarde dus overschreven met de nieuwe waarde. Uiteindelijk heb je dan inderdaad alleen de laatste waarde over.

Door er $imgData[] van te maken geef je dat je ipv de hele variable, enkel een positie aan de array wilt toevoegen. Nu komt alles netjes in de array.

Overigens vrij basic PHP.

One's never alone with a rubber duck.


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
Dat ik er geen $imgData[] van maak los ik toch op door elke loop opnieuw de data te parsen.

Bij $imgData[] laat hij overigens geen enkele data meer zien.

[ Voor 8% gewijzigd door twisted2000 op 19-07-2009 12:51 ]


Acties:
  • 0 Henk 'm!

  • H004
  • Registratie: Maart 2006
  • Laatst online: 28-05 19:55
Dat komt denk ik omdat je view dan niet meer klopt met je controller.

Ik zou eerst de $imgData array vullen met alle benodigde informatie, en in mn view een foreach-loop zetten die itereert over $imgData en zo elke table-row parsen...

Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
Heb het gevonden. De fout zat niet in de php code, die klopte. In de html maak ik echter een fout.

code:
1
2
3
4
5
6
7
<!- BEGIN:  images ->

<!- BEGIN:  file ->

<!- END: file ->

<!- END: images ->


moet zijn

code:
1
2
3
4
5
6
7
<!-- BEGIN:  images -->

<!-- BEGIN:  file -->

<!-- END: file -->

<!-- END: images -->


Bedankt voor jullie hulp.
Pagina: 1