Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ostoskorin _kokonaan_ tyhjennys

Sivun loppuun

Clacier [07.09.2010 18:12:18]

#

https://www.ohjelmointiputka.net/koodivinkit/25190-php-ostoskoriskripti

Olen jatkanut tätä koodia aika pitkälle. Ostoskorista lähetetään tiedot send.php:seen, joka lähettää tilauksen vastaanottajalle sekä adminille sähköpostiviestin. Enää yksi ongelma, millaisella koodilla saisi koko ostoskorin tyhjennettyä kerralla? Olisi todella tärkeä..

Macro [07.09.2010 18:20:40]

#

Etkös kysynyt sitä jo aikaisemmin? Haulla hakusanalla "ostoskori" ainakin minä löysin aiheesta keskustelua.

-tossu- [07.09.2010 18:24:57]

#

Clacier kirjoitti:

Enää yksi ongelma, millaisella koodilla saisi koko ostoskorin tyhjennettyä kerralla?

Käymällä kaikki keksit läpi ja poistamalle tuotteisiin liittyvät. En ole kokeillut seuraavaa koodia.

<?php
$keksit = array_keys ($_COOKIE);
foreach ($keksit as $tuote) {
	if (substr ($tuote, 0, 5) == "tuote")
		setcookie ($tuote, "", 10);
}
?>

Edit: Nolla ei ollut hyvä vanhenemisaika koska sillä on erityismerkitys.

Clacier [07.09.2010 18:25:12]

#

Kysyin, mutta sain yhden vastauksen Metabolixilta, jonka mukaan olisi helpompaa tallentaa ostokset yhteen evästeeseen eikä montaa useaa evästettä. Niin varmaan olisi, mutta ei riitä taito / aika enää tässä vaiheessa skriptiä ruveta muokkaamaan tuota evästesysteemiä.

e: -tossu-, ei toiminut. :(
e2: ei vieläkään. Hmm, outoa, tuon ja monen muun skriptin olisi pitänyt kyllä toimia omastakin mielestäni.

-tossu- [07.09.2010 18:30:16]

#

Tein pienen muutoksen, kokeile nyt.

Edit: Kyllä tuon pitäisi toimia, tuleeko edes mitään virheitä?

Clacier [07.09.2010 18:35:09]

#

Ei, ei tule mitään virhettä. Kokeilin myös ihan piruuttani sellaista floodihelvettiä, joka ei myöskään toiminut. Silläkään ei tullut mitään virhettä.

Kys. floodihelvetti:

<?php
       $poistaID = "1";
        $tiedot = explode("=",$_COOKIE['tuote'.$poistaID]);
        $id = $tiedot[0];
        $maara = $tiedot[1];
	setcookie('tuote'.$id,'',time() - 60*60*24);

        $poistaID2 = "2";
        $tiedot2 = explode("=",$_COOKIE['tuote'.$poistaID2]);
        $id2 = $tiedot[2];
        $maara2 = $tiedot[2];
	setcookie('tuote'.$id2,'',time() - 60*60*24);

        $poistaID3 = "3";
        $tiedot3 = explode("=",$_COOKIE['tuote'.$poistaID3]);
        $id3 = $tiedot[3];
        $maara3 = $tiedot[3];
	setcookie('tuote'.$id3,'',time() - 60*60*24);

        $poistaID4 = "4";
        $tiedot4 = explode("=",$_COOKIE['tuote'.$poistaID4]);
        $id4 = $tiedot[4];
        $maara4 = $tiedot[4];
	setcookie('tuote'.$id4,'',time() - 60*60*24);
?>

-tossu- [07.09.2010 18:43:42]

#

Clacier kirjoitti:

Ei, ei tule mitään virhettä.

Onhan kaikki virheilmoitukset päällä? Laita tämä aivan koodin alkuun.

<?php
ini_set ("display_errors", 1);
ini_set ("error_reporting", E_ALL | E_STRICT);
?>

Clacier [07.09.2010 18:47:16]

#

laitoin tuon päälle. Tuli muutama error, joka ei tosin koskenut noita keksejä millään tavalla, valitti ilmeisesti date functiosta.

Strict Standards: strtotime() [function.strtotime]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Helsinki' for 'EEST/3.0/DST' instead in /home/u3639/public_html/ostoskori/send.php on line 43

Metabolix [07.09.2010 18:56:05]

#

Mikäli tulkitsin koodivinkkiä oikein, seuraavan pitäisi toimia:

<?php
foreach ($_COOKIE as $key => $val) {
  if (substr($key, 0, 5) == "tuote") {
    setcookie($key, "", 1);
    unset($_COOKIE[$key]);
  }
}

Yksi potentiaalinen "vika" aiemmissa yrityksissä on ollut se vika, että setcookie ei muuta $_COOKIE-taulukon sisältöä, minkä vuoksi muutokset näkyvät vasta seuraavalla sivunlatauksella.

(Edit: Muista lisäksi asettaa sama polku kaikille evästeille, jos systeemisi on useassa eri hakemistossa!)

Kuitenkin suosittelen edelleen yhden ainoan evästeen käyttöä:

<?php
// Tallennus: muutetaan $kori tekstiksi ja laitetaan yhteen evästeeseen.
function ostoskori_aseta($kori) {
  $data = serialize($kori);
  setcookie("ostoskori", $data, time() + 24 * 60 * 60);
  $_COOKIE["ostoskori"] = $data;
}

// Tyhjennys: tallennetaan tyhjä kori (tyhjä taulukko).
function ostoskori_tyhjenna() {
  ostoskori_aseta(array());
}

// Haku: luetaan eväste ja muutetaan tekstistä takaisin taulukoksi.
function ostoskori_hae() {
  $data = @$_COOKIE["ostoskori"];
  $data = @unserialize($data);
  // Jos data on viallista (tai puuttuu), palautetaan tyhjä kori.
  if (!is_array($data)) {
    $data = array();
  }
  return $data;
}

// Määrän haku: haetaan kori ja palautetaan sieltä yksi arvo.
function ostoskori_hae_maara($id) {
  $kori = ostoskori_hae();
  return intval(@$kori[$id]);
}

// Määrän asetus: haetaan kori, muutetaan yksi arvo ja tallennetaan uudestaan.
function ostoskori_aseta_maara($id, $maara) {
  $id = intval($id);
  $maara = intval($maara);

  $kori = ostoskori_hae();
  if ($maara == 0) {
    unset($kori[$id]);
  } else {
    $kori[$id] = $maara;
  }
  ostoskori_aseta($kori);
}

// Esimerkki: lisätään tyhjään koriin tuotteita.
if (count(ostoskori_hae()) == 0) {
  ostoskori_aseta_maara(1, 10);
  ostoskori_aseta_maara(2, 10);
  ostoskori_aseta_maara(3, 15);
}

// Esimerkki: käydään kori läpi.
foreach (ostoskori_hae() as $id => $maara) {
  echo "Tuotetta $id on korissa $maara. Lisätään yksi.\n";

  // Esimerkki: muutetaan tuotteen määrää.
  ostoskori_aseta_maara($id, $maara + 1);

  // Esimerkki: haetaan tietyn tuotteen määrä.
  $maara = ostoskori_hae_maara($id);
  echo "Nyt tuotetta $id on korissa $maara.\n";
}

// Esimerkki: tyhjennetään kori.
ostoskori_tyhjenna();

Koodi on taas vedetty pohjattomasta hatusta täysin kokeilematta, mutta ainakin aiemmin hattu on osoittautunut aika luotettavaksi.

Clacier [07.09.2010 19:00:33]

#

<?php
foreach ($_COOKIE as $key => $val) {
  if (substr($key, 0, 5) == "tuote") {
    setcookie($key, "", 1);
    unset($_COOKIE[$key]);
  }
}

Tuokaan ei toiminut. Alempi koodi varmaan toimisi mutta ei ainakaan "heittämällä" sopisi tuohon vanhaan useamman keksin versioon. Ja vaikka sopisikin, en varmaan osaisi "asentaa" ilman ongelmia. Kai se on siskon laukkufirmalle pettymys tuotettava ja antaa homma jollekkin oikealle koodarille =D :(

Metabolix [07.09.2010 19:09:39]

#

Clacier kirjoitti:

Alempi koodi varmaan toimisi mutta ei ainakaan "heittämällä" sopisi tuohon vanhaan useamman keksin versioon.

Sen verran vaivaa kannattaisi kyllä nähdä. Homman ei todellakaan pitäisi olla suuri: muutettavat kohdat löytyvät hakusanalla $_COOKIE, ja luultavasti kaikki tarvittavat toiminnot on jo esitetty koodissani.

(Tässä tulee ilmi myös yksi tuon kyseisen koodivinkin pahimmista ongelmista: keksejä sorkitaan suoraan useasta paikasta sen sijaan, että olisi muutama selkeä funktio asian hoitamiseen. Funktioihin perustuvaa versiota olisi helpompi korjailla, ja käyttökin olisi helpompaa, kun olisi selvä rajapinta toimintoihin.)

Clacier [07.09.2010 19:17:22]

#

Metabolix kirjoitti:

Clacier kirjoitti:

Alempi koodi varmaan toimisi mutta ei ainakaan "heittämällä" sopisi tuohon vanhaan useamman keksin versioon.

Sen verran vaivaa kannattaisi kyllä nähdä. Homman ei todellakaan pitäisi olla suuri: muutettavat kohdat löytyvät hakusanalla $_COOKIE, ja luultavasti kaikki tarvittavat toiminnot on jo esitetty koodissani.

Mielummin odotan löytäväni paremman ostoskoriskriptin, en tiedä mitään noista cookieista tai niiden käsittelystä. Ihan sama, kiitos kuitenkin vaivannäöstä useampaankin kertaan Meta :)

Triton [08.09.2010 12:05:02]

#

Metabolix kirjoitti:

(Tässä tulee ilmi myös yksi tuon kyseisen koodivinkin pahimmista ongelmista: keksejä sorkitaan suoraan useasta paikasta sen sijaan, että olisi muutama selkeä funktio asian hoitamiseen. Funktioihin perustuvaa versiota olisi helpompi korjailla, ja käyttökin olisi helpompaa, kun olisi selvä rajapinta toimintoihin.)

Arvaa hävittääkö tuollaisen koodin pitäminen vinkeissä? :DD
Täytyisi varmaan koodata toikin täysin uusiks heti kun kerkee...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta