Avatar billede rzj Nybegynder
04. februar 2003 - 14:55 Der er 18 kommentarer og
1 løsning

array i cookie med $_POST

Hej E's

Jeg kan simpelthen ikke forstå det:

<?
function saveData(){
$value = $_POST['report']; //report er værdi af navne-attribut på formular
setcookie("data", $value, time()+3600);
}
if(isset($_POST['report'])){
savedata();
}
echo '<form action="'.$_SERVER['PHP_SELF'].'" name="report" method="post">
<input type="text" name="foo" />
<input type="submit" name="action" value="send" /></form>';

echo '<br /><br />';
print_r($_COOKIE["data"]); //dette burde vise arrayet i cookie, men intet sker??
?>

Er der nogle der har lyst til at fortælle mig hvorfor ovenstående ikke virker?
Hvis det er fordi man ikke kan komme arrays i cookies, er der så en smart mand der vil forstælle mig hvordan jeg så gemmer oplysninger midlertidigt på klient?
Læg mærke til at jeg ikke altid kender antallet og værdi af name-attributter i input-elementer, da dette genereres dynamisk og kan ændres gennem admin-interface.
Jeg skal altså sådan set "bare" have gemt alt data i et associativt array og "state" skal holdes gennem flere skærmbilleder (derfor cookie/session brug).
/raz
Avatar billede rzj Nybegynder
04. februar 2003 - 14:57 #1
function saveData() vs. savedata() er selvfølgeligt en slå-fejl.
savedata() er naturligvis saveData(), men det ingen forskel...
Avatar billede moefelt Nybegynder
04. februar 2003 - 15:00 #2
report indeholder som sådan ikke alle variabler der bliver postet. Du skal bruge noget lidt andet. 2 sec.
Avatar billede moefelt Nybegynder
04. februar 2003 - 15:04 #3
$value = array(@each($_POST))
Avatar billede moefelt Nybegynder
04. februar 2003 - 15:06 #4
ahh ik helt den skal lige støbes til... ;-)
Avatar billede fangel Nybegynder
04. februar 2003 - 16:06 #5
nu er det jo sådan at en side skal reloades før du kan læse fra den... kan det være noget med det? ved jo ik' om du reloader for at se om det virker...

prøv at se dette ex...

<?php
if(setcookie("data","test")){
  echo "cookien blev sat... reload siden for at se cookien...";
}
if(isset($_COOKIE['data'])){
  echo "der en en cookie ved navn <i>data</i> med indholdet: " . $_COOKIE['data'];
}
?>

gem filer og prøv at leg lidt med den... det er korrekt at man skal reloade siden før man kan læse fra den...

hvis du vil have forklaringen står jeg gerne klar til at skrive den...

Morten
Avatar billede moefelt Nybegynder
04. februar 2003 - 16:17 #6
dea_pg << siden reloades jo når der submittes.
Avatar billede fangel Nybegynder
04. februar 2003 - 16:25 #7
skal siden reloades EFTER cookien er blevet sat... her bliver cookien sat, og så bliver siden vist... det er ikke nok... den skal reloade efter setcookie() er blevet udført...

Morten
Avatar billede rzj Nybegynder
04. februar 2003 - 17:03 #8
jeg bliver nødt til at afvise, da det ikke virker.
Er der nogen der har en ide til hvordan jeg opsamler formular data i et array og derefter smider det i en session el. cookie?
/raz
Avatar billede fangel Nybegynder
04. februar 2003 - 17:13 #9
det er fordi du ikke kan lave det trick med $_POST['navn-på-formen'] jeg har lige testet...

<?
function saveData(){
$value = $_POST['foo']; //report er værdi af navne-attribut på formular
setcookie("data", $value, time()+3600);
}
if(isset($_POST['foo'])){
saveData();
}
echo '<form action="'.$_SERVER['PHP_SELF'].'" name="report" method="post">
<input type="text" name="foo" />
<input type="submit" name="action" value="send" /></form>';

echo '<br /><br />';
print_r($_COOKIE["data"]); //dette burde vise arrayet i cookie, men intet sker??
?>

dette virker...

men siden skal først reloades... det er ikke nok at sætte setcookie på en side, og så længere nede på side kalde den med _COOKIE... serveren ved jo ikke at der ligger en cookie endnu...

det virker altså... bare ikke med _POST['report'] med med _POST['foo']

Morten
Avatar billede miraculix Nybegynder
04. februar 2003 - 17:22 #10
Hvorfor kom du egentlig på det med arrays? Værdien af et formularfelt er vel ikke et array?
Eller vil du gemme alle formularfelter i en cookie?
Avatar billede rzj Nybegynder
04. februar 2003 - 18:58 #11
dea_pg>> Ok. Jeg vidste godt at man kunne komme de enkelte inputs i cookies
miraculix>> JA ! Og jeg vil komme dem i et array og derefter i en cookie.

Det drejer sig om at man skal igennem flere forskellige skærmbilleder inden man tilsidst gennemlæser sine data og godkender. Når man går videre til næste skærmbillede gemme data i cookie. Det er fordi det skal være muligt at gå tilbage undervejs og ændre i data osv. Desuden finder jeg det ganske fixt ikke at belaste db med det og forskellige andre detaljer osv.....

Nogle der ved hvordan, dette kan gøres på en "clever" måde?
Avatar billede rzj Nybegynder
04. februar 2003 - 19:16 #12
->mhmh, det er vel noget med at lave en løkke der løber $_POST[] igennem!
Men hvordan bibeholdes associeringen (keys)?
/raz
Avatar billede fangel Nybegynder
04. februar 2003 - 19:32 #13
du kan bruge en tilpas vild løkke... ser lige om jeg kan lave en...

Morten
Avatar billede fangel Nybegynder
04. februar 2003 - 20:00 #14
nu har jeg stykket disse 2 funktioner sammen...

function pak($arr){
  $pakket = "";
  foreach($arr as $k => $v){
    $pakket = $pakket . "$k|$v||";
  }
  return $pakket;
}

function pak_ud($str){
  $arr1 = explode("||",$str);
  for($i=0;$i<count($arr1)-1;$i++){
    $arr2 = explode("|",$arr1[$i]);
    $final_arr[$arr2[0]] = $arr2[1];
  }
  return $final_arr;
}

så burde du kunne lave en

setcookie("data",pak($_POST),time()+3600);

og når du skal bruge arrayet igen

$arr = pak_ud($_COOKIE['data']);

så vil du kunne bruge $arr['foo'] som om det var $_POST['foo'] på den side hvor den var blevet submitted...

men ville måske også kunne have brugt serialize() og unserialize() men dem har je aldrig leget med... men jeg ved at de to funktioner som jeg har lavet virker...

Morten
Avatar billede fangel Nybegynder
04. februar 2003 - 20:03 #15
kan også ses her... kildekode nederst...

http://mfa.ath.cx/array_test.php
Avatar billede miraculix Nybegynder
04. februar 2003 - 20:14 #16
rzj -> Jeg ville ikke bruge en cookie, men derimod bruge sessions.
Cookies er ikke stabile, de har begrænsning på mængden af data de kan indeholder og kræver at du pakker arrays ind og ud.

Som sessionsvariable kan du uden videre gemme brugerens data (der så gemmes på serveren) og du har mulighed for at få systemet til at virke selvom brugeren har slået cookies fra.
Avatar billede miraculix Nybegynder
04. februar 2003 - 20:22 #17
Lige en sidste ting.
Hvis du vælger at bruge cookies kan du sætte mere end een. (Cookies er faktiskt lavet til at virke efter formen "name=value"...
så hvorfor ikke lave:
foreach ( $_POST as $key => $value ) {
    setcookie($key, $value, time() + 3600 );
}

Senere kan de jo så læses med $_COOKIE[$key]...

Mvh
Avatar billede miraculix Nybegynder
04. februar 2003 - 20:26 #18
Du kan faktisk også gemme arrays, men det bliver ikke nemmere at have med at gøre af den grund.

Se mere om cookies i php her:
http://www.php.net/manual/en/function.setcookie.php
Avatar billede rzj Nybegynder
05. februar 2003 - 09:12 #19
Jeg er nået frem til flg:
1. Man kan ikke umiddelbart lave generiske formularer - altså formularer hvor man IKKE kender mængden af elementer i formularen.
miraculix>> Det er netop det der er min pointe ved at lagre i array i session/cookie. Hvis jeg altid kender mængden af input-elementer i formularen så kender jeg også antallet af vars. der skal lægges i cookies, og så kan jeg bare gemme dem i hver sin cookie - I know. Men hvis jeg nu ikke kender antallet så er det da ret 'clever' at smække dem i et associativt array - og så smække dem i db. Forestil Jer at jeg giver mulighed for at brugere kan vælge amter på Sjælland. Nu vil admin så gerne udvide til at man også kan udfylde felter for amter i Jylland - ahaaaaaa.
2. dea_pg>>At jeg må afprøve dine meget ihærdige forslag - det ser godt ud...
3. At hvis det ikke virker, så må jeg inddele mine formularer på en sådan måde så jeg gemmer en cookie for hvert skærmbillede og så hardcoder de felter der skal gemmes.
Ja, ja da, der kan man bare se...
/raz
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