[PHP] Array wordt niet goed uitgelezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een webshop en gebruik voor de cart een systeem met session-vars. Als er bijvoorbeeld twee producten besteld zijn, is $order het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Array
(
    [0] => Array
        (
            [0] => 29
            [1] => 1
        )

    [1] => Array
        (
            [0] => 42
            [1] => 4
        )

)

Dat betekent dus: van product-ID 29 is er 1 stuk besteld, van product-ID 42 zijn er 4 besteld.

Nou doet het volgende zich voor. Als ik een lege cart heb en ik bestel product 29, is de array:
code:
1
2
3
4
5
6
7
8
9
Array
(
    [0] => Array
        (
            [0] => 29
            [1] => 1
        )

)

Bestel ik vervolgens product 42 (4 maal), dan wordt de array zoals aan het begin van de post afgebeeld. Ook het weergeven van de array verloopt goed. Verwijder ik nu het eerste product in de array, dan wordt het laatste product niet weergegeven, terwijl het nog wel in de array staat.

Heb ik dus:
Product A
Product B
Product C
Product D
Product E
en ik verwijder product A, dan hou ik over:
Product B
Product C
Product D
, maar staat product E nog wel in de array.

De code die ik gebruik voor het weergeven van de cart is:
PHP:
1
2
3
4
5
6
7
8
9
10
function ShowItem($id, $quantity) {
  $result = @mysql_query("SELECT * FROM shopitems WHERE ID='".$id."' ORDER BY name ASC");
  while($info = @mysql_fetch_array($result)) {
    // Print nieuwe rij in tabel
  }
}

for($i = 0; $i < sizeof($_SESSION["order"]); $i++) {
  ShowItem($_SESSION["order"][$i][0], $_SESSION["order"][$i][1]);
}


De code die ik gebruik voor het toevoegen van een product is:
PHP:
1
2
$neworder = array(array(round($_GET["id"]), $_GET["quantity"]));
$_SESSION["order"] = array_merge($_SESSION["order"], $neworder);


De code die ik gebruik voor het verwijderen van een product is:
PHP:
1
unset($_SESSION["order"][$i]);


Dus alles gaat goed, behalve als het eerste product ($_SESSION["order"][0]) wordt verwijderd, dan laat hij het laatste product ($_SESSION["order"][sizeof($_SESSION["order"])-1]) niet zien. Kan iemand me helpen?

<div style="color: red">spam dus</div>

^^ Sorry, zo was het niet bedoeld, vandaar dat het er ook in kleine letters stond. Ik dacht dat het wel van pas zou kunnen komen als mensen even wat dingen zelf wilden uitproberen)

[ Voor 20% gewijzigd door Verwijderd op 15-01-2004 17:43 ]


Acties:
  • 0 Henk 'm!

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
mag ik weten waarom je je shoppingcart in een sessievar zet en niet in een database?? wat gebeurt er nu wanneer:
- een bezoeker sessies uit heeft staan??
- er 1000 mensen tegelijk een shoppingcart aanmaken?? (hint: geheugen)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik denk niet dat sessies zo veel geheugen innemen hoor. Dit wordt allemaal ook in aparte bestanden opgeslagen en aan de hand van de SESS_ID weer uitgelezen. Sessies kunnen niet door de gebruiker worden uitgeschakeld. Wel kan die cookies uitschakelen waardoor het moeilijker wordt om een sessie te behouden. Wat PHP dan doet is de sessie ID met de url meegeven, wat je zelf ook kunt doen voor de zekerheid.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Wat je moet gebruiken is een foreach lus. Wat er fout gaat is dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$order[0] = 0;
$order[1] = 1;
$order[2] = 2;
$order[3] = 3;

unset($order[0]);

// bedenk dat de andere entries hun key behouden:
// $order bestaat nu uit:
// $order[1] = 1;
// $order[2] = 2;
// $order[3] = 3;

for ( $i = 0; $i < sizeof($order); $i++ )
{
  print $order[$i];
  // als $i == 0 dan wordt er niets geprint, probeer eens error_reporting(E_ALL) te zetten
  // $i komt nooit bij 3 omdat sizeof($order) == 3 en $i < sizeof($order)
  // dus $order[3] wordt nooit uitgeprint, snappie :)
}

Dat is dus even uitgelegd wat er hier fout gaat:
PHP:
1
2
3
4
5
6
7
8
9
10
function ShowItem($id, $quantity) {
  $result = @mysql_query("SELECT * FROM shopitems WHERE ID='".$id."' ORDER BY name ASC");
  while($info = @mysql_fetch_array($result)) {
    // Print nieuwe rij in tabel
  }
}

for($i = 0; $i < sizeof($_SESSION["order"]); $i++) {
  ShowItem($_SESSION["order"][$i][0], $_SESSION["order"][$i][1]);
}

Het eerste item heb je verwijderd dus als $i == 0 wordt er niets uitgeprint.
Wat ik zou doen verder is overigens:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function ShowItem($item) 
{
  $result = @mysql_query("SELECT * FROM shopitems WHERE ID='" . $item[0] . "' ORDER BY name ASC");
  while($info = @mysql_fetch_array($result)) 
  {
    // Print nieuwe rij in tabel 
    // mbv. $item[1]
  }
}

foreach ( $_SESSION["order"] as $item ) 
{
  ShowItem($item);
}

[ Voor 54% gewijzigd door Michali op 15-01-2004 16:09 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah, wat ik raar vond is dat als ik $array[0] weghaalde, $array[1] in 0 veranderde, 2 in 1 etc. Dus 0 bleef wel degelijk bestaan. Maar mbv de oplossing van Michali werkt het nu, bedankt! :)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op 15 januari 2004 @ 18:03:
Ah, wat ik raar vond is dat als ik $array[0] weghaalde, $array[1] in 0 veranderde, 2 in 1 etc. Dus 0 bleef wel degelijk bestaan. Maar mbv de oplossing van Michali werkt het nu, bedankt! :)
Dat gebeurt echt niet vanzelf hoor. Dat moet echt door de code zelf gebeuren. Mischien dat je ergens tussendoor nog een handeling op de code uitvoerd. Ik heb het even getest:
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
<?php

$array = array(1, 2, 3, 4);

print_r($array);

/* Output:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
) */

unset($array[0]);

print_r($array);

/* Output:
Array
(
    [1] => 2
    [2] => 3
    [3] => 4
) */

?>

Noushka's Magnificent Dream | Unity

Pagina: 1