Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP ostoskori, cookie ongelma

Sivun loppuun

Clacier [01.07.2010 19:33:25]

#

Hei. Olen tehnyt tämän ( https://www.ohjelmointiputka.net/koodivinkit/25190-php-ostoskoriskripti ) koodin pohjalta suhteellisen pitkälle tehdyn hyvän ostoskorikoodin, mutta nyt tuli ongelma.

Eli tein nyt sellaisen että formilla lähetetään ostajan tiedot send.php:seen joka sitten lähettää adminille s-postin ostoksesta yms. tallentaa ostajan tiedot.

Sinne pitäisi nyt siis saada koodinpätkä, joka poistaa kaikki nuo tuotteet ostoskorista oston yhteydessä. Kyseisessä koodissa yksi tietty tuote poistetaan tällaisella koodilla:

    <?php
if (isset($_GET['poista']) && $_GET['poista'] == true) {
        //Vastaanotetaan GET-taulukon kautta lähetetty tuotteen id
        $poistaID = $_GET['tuoteID'];
        /* Luetaan edellä vastaanotetun id:n avulla oikeaa evästettä ja pilkotaan sen tiedot
        omiin muuttujiin  */
        $tiedot = explode("=",$_COOKIE['tuote'.$poistaID]);
        $id = $tiedot[0];
        $maara = $tiedot[1];

        /* Selvitetään onko tuotteita ostoskorissa enemmän kuin yksi, jotta tiedetään
        poistetaanko koko eväste vai päivitetäänkö määrä-tieto  */
        if ($maara > 1) {
            //Vähennetään tuotteen määrää yhdellä ja päiviteen eväste luomalla uusi...
            $maara--;
            setcookie('tuote'.$id,$id.'='.$maara,time() + 60*60*24);
        }
        else {
            //Tuotteiden ollessa vain yksi, koko eväste poistetaan
            setcookie('tuote'.$id,'',time() - 60*60*24);
        }
?>

mutta miten kaikki keksit saisi poistettua kerralla eikä ainoastaan yhden tuotteen?

Macro [01.07.2010 19:38:05]

#

<?php
foreach($_COOKIE as $cookie) {
   setcookie($cookie, time() - 60 * 60 * 24);
   // Tai, jollei $cookie toimi setcookie-funktiossaa, niin koita $_COOKIE[$cookie]
}

Käy läpi koko $_COOKIE taulun ja poistaa kaikki cookiet. En testannut, mutta sanoisin sen olevan näin.

Clacier [01.07.2010 19:44:18]

#

uuh. no nyt send.php sisältö:

<?php
$mail = $_POST['email'];
$etunimi = $_POST['etunimi'];
$sukunimi = $_POST['sukunimi'];
$katu = $_POST['katu'];
$postinro = $_POST['postinro'];
$postitoimipk = $_POST['postitoimpk'];
$puhelin = $_POST['puh'];
$yhteensa = $_POST['yhteensa'];
$to = $mail;
$subject = "tilauksesi";
$message = "tilaajalle lähetettävä sähköposti tähän";
mail($to, $subject, $message);
foreach($_COOKIE as $cookie) {
   setcookie($cookie, time() - 60 * 60 * 24)
}
header("location: /?id=ostoskori&subid=tilausvastaanotettu");
?>

ja sain vastauksena koodia ajettaessa:

Parse error: syntax error, unexpected '}' in /home/u3639/public_html/ostoskori/send.php on line 16

Macro [01.07.2010 19:47:30]

#

Sulta puuttuu tuolta 4. vikalta riviltä puolipiste (;).

Clacier [01.07.2010 19:48:44]

#

Joo, se puuttui ensin tuosta sunkin viestistä.. Mutta puolipisteen lisättyä tuli uusi errori:


Warning: Cookie names can not contain any of the following '=,; \t\r\n\013\014' in /home/u3639/public_html/ostoskori/send.php on line 28

Warning: Cookie names can not contain any of the following '=,; \t\r\n\013\014' in /home/u3639/public_html/ostoskori/send.php on line 28

Warning: Cookie names can not contain any of the following '=,; \t\r\n\013\014' in /home/u3639/public_html/ostoskori/send.php on line 28

Warning: Cannot modify header information - headers already sent by (output started at /home/u3639/public_html/ostoskori/send.php:28) in /home/u3639/public_html/ostoskori/send.php on line 30

Örhm..Kuulostaa siltä että se liittyy tuohon ostajalle lähetettävään sähköpostiviestiin jossa on tällaista:

<?php
$message = "Hei $etunimi $sukunimi .. \n
Olemme bla bla \n

jne \n";
?>

Macro [01.07.2010 19:50:57]

#

Niin, siinähän se lukee. Evästeen nimi ei voi sisältää merkkejä mitkä virheissä 1-3 mainittiin. Viimeinen johtuu siitä, että tekstiä on tulostettu ennen header-funktiota.

Joo, se puuttui. Pythonissa kun ei käytetä niitä, niin eipä muistunut mieleen. Kumminkin kannattaisi jättää koodit kopioimatta, sillä opit parhaiten kirjoittamalle ne itse muistista.

Clacier [01.07.2010 19:54:25]

#

Hmm.. Eli en pysty poistaa noita ostoskorin keksejä? :d se siitä skriptistä sitten

Macro [01.07.2010 19:55:53]

#

Tai sitten muutat niiden cookieiden nimiä?

Clacier [01.07.2010 19:57:03]

#

Miten se sitten osaa poistaa yhden "rivin" (vai miksikä kutsutaankaan) tuossa aloitusviestissä lukevassa koodinpätkässä?

pistemies [01.07.2010 21:12:43]

#

Mailia laiteltaessa ei tarvitse kirjoitella erikseen rivinvaihto-merkkei.
Rivinvaihdot toimii näin:

<?php
$message = "Hei $etunimi $sukunimi ..
Olemme bla bla

jne

riviä vaihdoin ja toimii";
?>

Macro [01.07.2010 21:14:31]

#

Pekka Mansikka kirjoitti:

Mailia laiteltaessa ei tarvitse kirjoitella erikseen rivinvaihto-merkkei.
Rivinvaihdot toimii näin:

<?php
$message = "Hei $etunimi $sukunimi ..
Olemme bla bla

jne

riviä vaihdoin ja toimii";
?>

Niin, jos viesti lähetetään text/plain-muodossa. Jos se lähetetään HTML-muotoisena, vaaditaan rivinvaihdoksi <br>.

PHP-kooditagi on koodiphp eikä koodi.

Clacier [01.07.2010 21:37:39]

#

no kummassa muodossa seuraava koodinpätkä sen lähettää?

<?
$to = $mail;
$subject = "tilauksesi";
$message = "tilaajalle lähetettävä sähköposti tähän";
mail($to, $subject, $message);
?>

Clacier [01.07.2010 23:45:46]

#

miksi seuraava koodinpätkä(t) toimi? eli sähköposti ei lähde, menee kyllä oikeaan headeriin ja error viestit toimii. kyseinen skripti toimi ennen noita varmistus viestejä..

## send.php
<form method="post" action="bot.php">
<input type="hidden" name="yhteensa" value="<? echo $yht2; ?>">
<table cellspacing="0" width="70%" style="border: solid 0px black;">
<tr><td class="vari1">Etunimi</td><td class="vari1"><input type="text" name="etunimi" maxlenght="15" value=""></td></tr>
<tr><td class="vari1">Sukunimi</td><td class="vari1"><input type="text" name="sukunimi" maxlenght="20" value=""></td></tr>
<tr><td class="vari1">Katuosoite</td><td class="vari1"><input type="text" name="katu" maxlenght="25" value=""></td></tr>
<tr><td class="vari1">Postinumero</td><td class="vari1"><input type="text" name="postinro" maxlenght="15" value=""></td></tr>
<tr><td class="vari1">Postitoimipaikka</td><td class="vari1"><input type="text" name="postitoimpk" maxlenght="25" value=""></td></tr>
<tr><td class="vari1">Puhelinnumero</td><td class="vari1"><input type="text" name="puh" maxlenght="15" value=""></td></tr>
<tr><td class="vari1">E-mail</td><td class="vari1"><input type="text" name="email" maxlenght="25" value=""></td></tr>
<tr><td class="vari1"><input type="reset" class="amr" value="Tyhjennä"></td><td class="vari1"><input type="submit" class="amr" name="submit" value="Lähetä tilaus"></td></tr>
</table></form>

ja

## bot.php
<?php
$mail = $_POST['email'];
$etunimi = $_POST['etunimi'];
$sukunimi = $_POST['sukunimi'];
$katu = $_POST['katu'];
$postinro = $_POST['postinro'];
$postitoimipk = $_POST['postitoimpk'];
$puhelin = $_POST['puh'];
$yhteensa = $_POST['yhteensa'];
if ($etunimi == "") {
die(header("location: /?id=ostoskori&subid=virhe&virhe=Etunimi"));
}else if ($sukunimi == "") {
die(header("location: /?id=ostoskori&subid=virhe&virhe=Sukunimi"));
}else if ($katu == ""){
die(header("location: /?id=ostoskori&subid=virhe&virhe=Katuosoite"));
}else if ($postinro == "") {
die(header("location: /?id=ostoskori&subid=virhe&virhe=Postinumero"));
} else if ($postitoimipk == "") {
die(header("location: /?id=ostoskori&subid=virhe&virhe=Postitoimipaikka"));
} else if ($mail == "") {
die(header("location: /?id=ostoskori&subid=virhe&virhe=S%E4hk%F6posti"));
}
$mail = $_POST['email'];
$to = $mail;
$subject = "tilauksesi";
$message = "jee";
mail($to, $subject, $message);
header("location: /?id=ostoskori&subid=tilausvastaanotettu");
?>

Triton [02.07.2010 00:03:21]

#

Clacier kirjoitti:

Hei. Olen tehnyt tämän ( https://www.ohjelmointiputka.net/koodivinkit/25190-php-ostoskoriskripti ) koodin pohjalta

Ikävää, että olet joutunut tekemäni purkan uhriksi, varsinkin kun olen koko ostoskoriskriptiä uusimassa...

Clacier [02.07.2010 00:06:14]

#

Koodi on toki purkkaa, mutta käyttökelpoista. Varsinkin kuin olen sitä suhteellisen paljon muokannut..

Tarvisin silti vieläkin apuja tuohon edelliseen ja sitä edelliseen viestiini, kaikkien keksien kerralla poistamiseen ja s-posti ongelmaan..

Triton [02.07.2010 00:28:07]

#

Kaikki evästeet saa helposti poistettua ainakin näin:

<?php

foreach ($_COOKIE as $name => $value)
	setcookie($name, $value, time()-aika);

?>

Edit.

Macron esimerkki ei toiminut, koska täytyy ottaa huomioon, että $_COOKIE-taulukko on assosiatiivinen. Sen lisäksi täytyy huomata, että setcookie-funktio vaatii evästeet nimen ja arvon erikseen...

Tohon s-posti-ongelmaan en muuta osaa sano kuin, että onhan sulla smtp-servu?

Edit. Testasin skriptiä ja se toimi omalla serverilläni, joten näin ollen uskon tuon smtp-serverin puuttumiseen täysin.

punppis [02.07.2010 02:00:25]

#

Ihan turha sille cookielle on mitään arvoa laittaa, kun se poistetaan kuitenkin. Myös tuo time() on tuolla ihan turha. Itse poistan cookiet ainakin näin:

<?php
setcookie($cookien_nimi, "", 0);
?>

Triton [02.07.2010 02:22:45]

#

Niin no tuosta arvosta ja ajasta en tiedä, mutta ainakin se evästeen nimi täytyy tietää...

Triton [02.07.2010 03:27:39]

#

Tässä nyt olisi toinen tapa hoitaa kaikkien evästeiden poistaminen:

<?php

		foreach (array_keys($_COOKIE) as $name)
			setcookie($name, "", 0);


?>

Clacier [02.07.2010 03:50:23]

#

Triton kirjoitti:

Tohon s-posti-ongelmaan en muuta osaa sano kuin, että onhan sulla smtp-servu?

Edit. Testasin skriptiä ja se toimi omalla serverilläni, joten näin ollen uskon tuon smtp-serverin puuttumiseen täysin.

Hmm. Mulla oli se käytössä pari tuntia ja hyvin toimi kunnes lisäsin noi tyhjän lomakkeen estot... :O

Triton [02.07.2010 11:33:51]

#

Clacier kirjoitti:

Hmm. Mulla oli se käytössä pari tuntia ja hyvin toimi kunnes lisäsin noi tyhjän lomakkeen estot... :O

Kyllä sulla täytyy muutakin olla pielessä. MBNetissä toimi aivan täysin pelkästään noin...


Sivun alkuun

Vastaus

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

Tietoa sivustosta