Avatar billede kaktus Nybegynder
26. marts 2009 - 11:52 Der er 5 kommentarer

kurv vha. serialize og unserialize

Jeg vil gerne forstå / træne i serialize og unserialize....
Har derfor rodet med nedenstående.....(2 php filer)
Der kommer en fejl på side "Content.php" (kun ved første varevalg på index.php)...
Fejlen ses efterfølgende på content.php siden og lyder...
"Warning: Invalid argument supplied for foreach() in /home/www/eksperten.sluk.dk/shop1/content.php on line 22"
Er der et kvik hovede der kan hjælpe med at få disse to filer til at "spille sammen"?
Kan ses live her http://eksperten.sluk.dk


index.php----------------------------------------------------------------------------------
<?php session_start(); ?>
<html>
<head>
<title>Storing an array with a session</title>
</head>
<body>
<h1>Product Choice Page</h1>
<?php
if (isset($_POST['form_products'])) {

if (!empty($_SESSION['products'])) {
    $products = array_unique(
    array_merge(unserialize($_SESSION['products']), $_POST['form_products']));
}

if (!isset($_SESSION["products"])) { //Hvis sessionen ikke findes(ved første POST)
    $_SESSION['products'] = array();// så opretter den en products SESSION(array)

 
 
$_SESSION['products'] = serialize($products);
print "<p>Your products have been registered!</p>";
}
?>
<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
<P>Select some products:<br>
<select name="form_products" multiple size="8">
<option>Sonic Screwdriver</option>
<option>Hal 2000</option>
<option>Tardis</option>
<option>ORAC</option>
<option>Cat</option>
<option>Mercedes</option>
<option>Train</option>
<option>Transporter bracelet</option>
</select>
<br /><br />
<input type="submit" value="choose">
</form>
<br /><br />
<a href="content.php">content page</a>
</body>
</html>


content.php------------------------------------------------------

<?php session_start(); ?>
<html>
<head>
<title>Accessing session variables</title>
</head>
<body>
<h1> Content Page</h1>

<?php
if(isset($_POST['reset'])){   
    session_unset();}
   
   
   
echo "<form method=\"post\" action=\"".$_SERVER['PHP_SELF']."\">";   
echo "<input type=\"submit\" name=\"reset\" value=\"  Empty session  \"  />";
echo "</form>";


if (isset($_SESSION['products'])) {
  echo "<b>Your cart:</b><ol>\n";
  foreach (unserialize($_SESSION['products']) as $p) {
      echo "<li>$p";
  }
  echo "</ol>";
}
?>


<a href="index.php">Back to product choice page</a>
</body>
</html>
Avatar billede j4k0b Nybegynder
26. marts 2009 - 15:07 #1
Som du sikkert selv har set så opstår fejlen her:

foreach (unserialize($_SESSION['products']) as $p) {


Resultatet af unserialize($_SESSION['products']) giver enten et tomt array, eller en anden datatype end array. Det giver fejl hvis man itererer et array med foreach hvis array'et er tomt.

Et hurtigt fix kunne være at tjekke om array'et er tomt før du bruger foreach:


if (isset($_SESSION['products'])) {
  echo "<b>Your cart:</b><ol>\n";
  $products = unserialize($_SESSION['products']);
  if(count($products)) {
    foreach ($products as $p) {
      echo "<li>$p";
    }
  }
  echo "</ol>";
}
Avatar billede kaktus Nybegynder
26. marts 2009 - 16:11 #2
Hejsa.....tak for indlæg j4k0b

Dit forslag lyder logisk og er tilføjet i stedet for original kode...

Desværre løste det kun problemet så det nu ikke kommer nogen fejlmeddelelse, MEN første post tilføjes tilsyneladende (stadig) ikke session array
huuumm mystisk
Avatar billede kaktus Nybegynder
26. marts 2009 - 16:41 #3
SÅDAN i index.php..... :-)

følgende MANGLEDE
$products = array($_POST['form_products']);



<?php
if (isset($_POST['form_products'])) {
   
    if (!empty($_SESSION['products'])) {
    $products = array_unique(
    array_merge(unserialize($_SESSION['products']), $_POST['form_products']));
    }else{
    $products = array($_POST['form_products']);
    } 
   
    $_SESSION['products'] = serialize($products);
    print "<p>Your products have been registered!</p>";
   
}
?>
Avatar billede kaktus Nybegynder
26. marts 2009 - 16:45 #4
EN helt anden ting......
hvorfor giver print_r($_SESSION['products']);....følgende
a:1:{i:0;s:8:"Hal 2000";}

Jeg plejer at få lignende...
Array
(
    [3] => 1
)
Avatar billede j4k0b Nybegynder
26. marts 2009 - 16:48 #5
Fordi værdien af $_SESSION['products'] har været en tur igennem serialize().

Som du kan se af dokumentationen returnerer serialize() en streng; det er denne streng du ser: http://dk2.php.net/serialize
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

IT-JOB