Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa korpom i session

[es] :: PHP :: Problem sa korpom i session

[ Pregleda: 2601 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nepoverljiv
student
Kragujevac, Srbija

Član broj: 226360
Poruke: 131
*.dynamic.sbb.rs.



+2 Profil

icon Problem sa korpom i session09.12.2012. u 17:27 - pre 138 meseci
Pozdrav,

Imam skripticu koju koristim da bi mogao artikle da ubacujem na sajtu u korpu za narucivanje. Na jednom sajtu mi radi bez problema, a na drugom mi pravi problem, tj. ubacuje mi duplo artikle.

Fajl koji pozivam kada kliknem u korpu izgleda ovako


Code:

 <?php
session_start();   
$var=$_SERVER['REQUEST_URI']; //citanje url-a
            $id = substr(strrchr($var, "korpa?"),6 );//citanje prvog elementa posle znaka "?"
            $tbl_name="opis"; //ime tabele u bazi
             /*****UPIT i izvrsavanje upita******/

        $_SESSION['korpa']+=$row['cena'];     //suma u korpi se povecava za sumu proizvoda koji je izabran
        if($_SESSION['brproizvoda']==0)
        {
             $_SESSION['niz']=array($id);
             $_SESSION['brproizvoda']++;
        }
        else
        {
        array_push($_SESSION['niz'],$id);
        $_SESSION['brproizvoda']++;
        }
        redirect("javascript: history.go(-1)");
?>


A na glavnoj stranici ovako ocitavam sta ima u korpi:

Code:

$i=0;
                        $tbl_name="opis";
                        $query = count($_SESSION['niz']);
                        if($query==0)
                        {
                            echo "Vaša korpa je trenutno prazna. Da biste napunili korpu kliknite na link 'u korpu' ispod proizvoda koji želite da kupite.";
                        }
                        else
                        {
                            echo "
                               U Vašoj korpi se trenutno nalaze sledeći proizvodi:<br/><br/> 
                                ";
                            for($i=0;$i<=$query-1;$i++)
                            {
                                $br=$i+1;
                                connect();
                                $element=$_SESSION['niz'][$i];
                                $sql="SELECT * FROM $tbl_name WHERE id_opis=$element";
                                $subject_set=mysql_query($sql);
                                $subject=mysql_fetch_array($subject_set);
                                echo "   ".$br.". ";
                                echo $subject['name'];
                                echo " - <b>".$subject['cena']." RSD</b><br/>  "; 
                            }
                            echo "<p align=right><a href=index.php?=poruci class=basket>Poručite</a> &middot; <a href=includes/obrisi.php>Isprazni korpu</a></p>";
                        }  


Da li neko zna zasto mi duplirano upadaju artikli u korpu?
 
Odgovor na temu

Boyka
BPS

Član broj: 287185
Poruke: 338
*.dynamic.isp.telekom.rs.



+33 Profil

icon Re: Problem sa korpom i session11.12.2012. u 13:05 - pre 138 meseci
Proveri u tabeli kolonu id_opis, da li mozda ima dve iste vrednosti 1,1,2,2,3,3,4,4 itd... postavi id_opis kao kljuc
 
Odgovor na temu

nepoverljiv
student
Kragujevac, Srbija

Član broj: 226360
Poruke: 131
*.dynamic.sbb.rs.



+2 Profil

icon Re: Problem sa korpom i session12.12.2012. u 18:12 - pre 138 meseci
Sad sam provalio da ovaj kod ubaci dva puta u artikal svaki put kad se osvezi stranica. Znaci koliko puta pritisnem F5, duplo od toga cu imati artikala u korpi. Jel zna neko gde moze da bude problem. Ili ako neko zna neki drugi kod koji bi mogao da skinem sa neta, a da bude kratak i pouzdan?
 
Odgovor na temu

nesh
Đorđević Nebojša
Younify - Magento (PHP) development
Niš

Član broj: 668
Poruke: 127
*.dynamic.isp.telekom.rs.

Sajt: nesh-microblog.blogspot.c..


+2 Profil

icon Re: Problem sa korpom i session12.12.2012. u 19:17 - pre 138 meseci
O.O

Citat:
Code:
$id = substr(strrchr($var, "korpa?"),6 );//citanje prvog elementa posle znaka "?"


http://php.net/manual/en/reserved.variables.get.php

Citat:
Code:

$query = count($_SESSION['niz']);
for($i=0;$i<=$query-1;$i++)


http://php.net/manual/en/control-structures.foreach.php

I najgore

Citat:
Code:
$sql="SELECT * FROM $tbl_name WHERE id_opis=$element";


sta ce da se desi ako pozove kart sa:

(http) /moj-lepi-sajt.com/cart.php?id=1;SHOW%20TABLES;

pa onda

(http) /moj-lepi-sajt.com/cart.php?id=1;DROP%20TABLE%20foo;

?! (u najboljem slucaju SQL error...)

Citat:
Ili ako neko zna neki drugi kod koji bi mogao da skinem sa neta, a da bude kratak i pouzdan?


(moja standardna mantra posle code review sesije u firmi)
Nikada ne koristite kod za koji 100% ne znate kako radi, bez obzira odakle je dosao...
Nebojša Đorđević - nesh
http://younify.nl
 
Odgovor na temu

nepoverljiv
student
Kragujevac, Srbija

Član broj: 226360
Poruke: 131
*.dynamic.sbb.rs.



+2 Profil

icon Re: Problem sa korpom i session12.12.2012. u 19:35 - pre 138 meseci
Hvala, ali ne hvala. Nista nisam razumeo sta si hteo da kazes.
 
Odgovor na temu

nesh
Đorđević Nebojša
Younify - Magento (PHP) development
Niš

Član broj: 668
Poruke: 127
*.dynamic.isp.telekom.rs.

Sajt: nesh-microblog.blogspot.c..


+2 Profil

icon Re: Problem sa korpom i session12.12.2012. u 19:46 - pre 138 meseci
Ponekad je 'zgodno' procitati uputstvo za jezik koji se koristi ... tome sluze linkovi.

A sto se tice SQLa ... evo jos jedan

http://php.net/manual/en/security.database.sql-injection.php
Nebojša Đorđević - nesh
http://younify.nl
 
Odgovor na temu

nepoverljiv
student
Kragujevac, Srbija

Član broj: 226360
Poruke: 131
*.dynamic.sbb.rs.



+2 Profil

icon Re: Problem sa korpom i session12.12.2012. u 20:06 - pre 138 meseci
Sta rece, jel znas zasto duplira, zasto ubacuje duplo odmah cim se osvezi. Ako vecimas savete kako da naucim programski jezik koji koristim, onda ti je ovo macji kasalj da provalis zasto ne radi kako treba.
 
Odgovor na temu

Boyka
BPS

Član broj: 287185
Poruke: 338
*.dynamic.isp.telekom.rs.



+33 Profil

icon Re: Problem sa korpom i session14.12.2012. u 15:33 - pre 138 meseci
hmmm mozda je postback,

ubaci ovo kroz celu stranu html-a,
<?php
if (!strtoupper($_SERVER['REQUEST_METHOD']) == 'POST')
{
?>
<html>
</html>
<?php
}
?>
 
Odgovor na temu

Nemanja Avramović
Engineering Manager
MENU Technologies
Beograd, Srbija

Moderator
Član broj: 32202
Poruke: 4391
*.dynamic.isp.telekom.rs.

Sajt: https://avramovic.info


+46 Profil

icon Re: Problem sa korpom i session15.12.2012. u 09:51 - pre 138 meseci
Posle ubacivanja artikla u korpu redirektuj korisnika na neku drugu stranicu, tako da ako refreshuje neće ponovo izvršiti kod za ubacivanje artikla u korpu.

Inače, sve što je nesh rekao stoji - kod je prilično loše napisan.

Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
 
Odgovor na temu

plus_minus

Član broj: 289459
Poruke: 2242
*.dynamic.isp.telekom.rs.

Sajt: https://hardcoder.xyz


+2247 Profil

icon Re: Problem sa korpom i session15.12.2012. u 10:17 - pre 138 meseci
@nepoverljiv

Ne moraš ni da drugu stranicu, dovoljno ti je npr. samo

Code (php):

if(isset($_POST['add'])){

 $product = $products[$_POST['id']];

 $cart->add_item($product['id'],$_POST['qty'],$product['price'],$product['info']);

 header('Location:'.$_SERVER['REQUEST_URI']); # refresh/clear post

}
 


.. nakon bilo koje interakcije sa korpom, šta god to bilo, add_item/remove_item ili clear_cart ... ukoliko je kod dobro napisan, kao što reče Nemanja.
Onda kada korisnik poruči, tada ga redirektuješ na neku drugu stranicu, u svakom drugom slučaju, REQUEST_URI je trenutna lokacija i to mu dođe isto kao da si prvi put kliknuo na link gde se nalazi prazna korpa/forma, s' tim što to server automatski uradi. Nema post vrednosti, već, ukoliko nije prazna, ostaje samo ono što je u korpi.



about:networking
 
Odgovor na temu

nepoverljiv
student
Kragujevac, Srbija

Član broj: 226360
Poruke: 131
*.dynamic.sbb.rs.



+2 Profil

icon Re: Problem sa korpom i session15.12.2012. u 16:22 - pre 138 meseci
Citat:
Nemanja Avramović:
Posle ubacivanja artikla u korpu redirektuj korisnika na neku drugu stranicu, tako da ako refreshuje neće ponovo izvršiti kod za ubacivanje artikla u korpu.

Inače, sve što je nesh rekao stoji - kod je prilično loše napisan.


Redirektujem ga ja na index.php ali opet ista prica, ubaci duplo.

Ok kod je lose napisan, kako biste ga vi napisali?
 
Odgovor na temu

nepoverljiv
student
Kragujevac, Srbija

Član broj: 226360
Poruke: 131
*.dynamic.sbb.rs.



+2 Profil

icon Re: Problem sa korpom i session16.12.2012. u 21:47 - pre 138 meseci
Citat:
plus_minus:
@nepoverljiv

Ne moraš ni da drugu stranicu, dovoljno ti je npr. samo

Code (php):

if(isset($_POST['add'])){

 $product = $products[$_POST['id']];

 $cart->add_item($product['id'],$_POST['qty'],$product['price'],$product['info']);

 header('Location:'.$_SERVER['REQUEST_URI']); # refresh/clear post

}
 


.. nakon bilo koje interakcije sa korpom, šta god to bilo, add_item/remove_item ili clear_cart ... ukoliko je kod dobro napisan, kao što reče Nemanja.
Onda kada korisnik poruči, tada ga redirektuješ na neku drugu stranicu, u svakom drugom slučaju, REQUEST_URI je trenutna lokacija i to mu dođe isto kao da si prvi put kliknuo na link gde se nalazi prazna korpa/forma, s' tim što to server automatski uradi. Nema post vrednosti, već, ukoliko nije prazna, ostaje samo ono što je u korpi.




Kako da stavim link na dodaj u korpu, i gde ovo da stavim na stranicu?
 
Odgovor na temu

plus_minus

Član broj: 289459
Poruke: 2242
*.dynamic.isp.telekom.rs.

Sajt: https://hardcoder.xyz


+2247 Profil

icon Re: Problem sa korpom i session17.12.2012. u 00:18 - pre 138 meseci
Ne znam, ovo što si ubacio u code tag je katastrofalno, do neke mere, bar meni.
Tako da teško mogu da ti dam odgovor.

Međutim, nešto sam dobre volje ovih dana, pa ako studente, ovo ne može da ti pomogne, ništa neće.

I ne samo za tebe, ovo može da posluži svima koji čupaju kosu, a treba im,
al' ne umeju neko elegantno i efikasno rešenje da sklepaju. :) :D

U pitanju je Session/Object varijanta korpice za porudžbinu koja ne mora a može da radi bez sql-a.
To zavisi od tebe i odakle vučeš informacije o proizvodima.

Primer ispod, vuče sve iz jednog niza koji se nalazi na samom početku html/php skripte.

U zipovanom prilogu se nalaze 2 fajla (to je ustvari sve ovo u code tagu). Jedan je sama php/html skripta i drugi je klasa, to jest 'korpica' - object.

Raspakuj kod sebe u lokalu u nekom folderu pa vidi šta ti kaže nakon 'Dodaj u korpu' kada udariš refreš dugme. Da li se povećava Quantity ili ne.

Odgovor je - naravno da ne.

Ako ti se svidi i budeš želeo da pribegneš ovakvom rešenju (ne gine ti izrada css za sve ovo, jer je u primeru css minimalan) obrati pažnju na blok komentara koji stoji pri dnu same php skripte gde se izvršava sve.
To ne bilo loše da pridodaš onoj stranici koja je zadužena za - checkout.

Stranicu za checkout, nadam se imaš. Ako nemaš, napravićeš. Sve što ti treba, jednostavno izvučeš iz sesije i to je to. :)

_class_cart.php
Code (php):

<?php

     /* Session/Object CLASS - "Korpica" */

     class korpica {
          var $total = 0;
          var $itemcount = 0;
          var $items = array();
          var $itemprices = array();
          var $itemqtys = array();
          var $iteminfo = array();

          function cart() {}

          function get_contents(){
               $items = array();
               foreach($this->items as $tmp_item){
                    $item = FALSE;
                    $item['id'] = $tmp_item;
                    $item['qty'] = $this->itemqtys[$tmp_item];
                    $item['price'] = $this->itemprices[$tmp_item];
                    $item['info'] = $this->iteminfo[$tmp_item];
                    $item['subtotal'] = $item['qty'] * $item['price'];
                    $items[] = $item;
               }    return $items;
          }

          function add_item($itemid,$qty=1,$price = FALSE, $info = FALSE){

               if(!isset($price)){
                    $price = _get_price($itemid,$qty);
               }

               if(!isset($info)){
                    $info = _get_info($itemid);
               }

               if(!empty($this->itemqtys[$itemid])&&
                    $this->itemqtys[$itemid] > 0 ){
                    $this->itemqtys[$itemid] = $qty + $this->itemqtys[$itemid];
                    $this->_update_total();
               }

               else {
                    $this->items[]=$itemid;
                    $this->itemqtys[$itemid] = $qty;
                    $this->itemprices[$itemid] = $price;
                    $this->iteminfo[$itemid] = $info;
               }
               $this->_update_total();
          }

          function edit_item($itemid,$qty){

               if($qty < 1) {
                    $this->del_item($itemid);
               }

               else {
                    $this->itemqtys[$itemid] = $qty;
                    $this->itemprices[$itemid] = _get_price($itemid,$qty);
               }

               $this->_update_total();
          }

          function del_item($itemid){

               $ti = array();
               $this->itemqtys[$itemid] = 0;
               
               foreach($this->items as $item){
                    if($item != $itemid){
                         $ti[] = $item;
                    }
               }
               $this->items = $ti;
               $this->_update_total();
          }

          function empty_cart(){
               $this->total = 0;
               $this->itemcount = 0;
               $this->items = array();
               $this->itemprices = array();
               $this->itemqtys = array();
               $this->iteminfo = array();
          }

          function _update_total(){

               $this->itemcount = 0;
               $this->total = 0;

               if(sizeof($this->items > 0)){
                    foreach($this->items as $item) {
                         $this->total = $this->total + ($this->itemprices[$item] * $this->itemqtys[$item]);
                         $this->itemcount++;
                    }
               }
          }
     }
?>
 


add_to_cart.php
Code (php):

<?php
require_once '_class_cart.php';
if(!isset($_SESSION)){ session_start(); }

     
     $products=array(
         
          0=>array( "id"=>0, "info"=>'Proizvod 0', "price"=>1000),
         
          1=>array( "id"=>1, "info"=>'Proizvod 1', "price"=>1100),

          2=>array ("id"=>2, "info"=>'Proizvod 2', "price"=>1200),

          3=>array( "id"=>3, "info"=>'Proizvod 3', "price"=>1300),

          4=>array( "id"=>4, "info"=>'Proizvod 4', "price"=>1400)

     );
     
     $cart=0;
     $itemsIn=null;
     $uri=$_SERVER['REQUEST_URI'];
     define("currency", 'RSD');
     
     if(isset($_SESSION)){
     
          $cart=&$_SESSION['cartItems'];
         
          if(!is_object($cart)) $cart = new korpica();

          # Vreme koliko će dugo korpica
          # držati proizvode          
          # Sada kako je, 1800 sekundi.
         
          if(!isset($_SESSION['cTDstr'])) {
     
               if($cart->itemcount != 0)
               $_SESSION['cTDstr'] = time();
               
          }
          elseif(time() - $_SESSION['cTDstr'] > 1800){
         
               if($cart->itemcount > 0){
               
                    $cart->empty_cart();
                    usleep(654321);    
               }
               
               $_SESSION['cTDstr'] = time();
          }
     }
     
     if(isset($_POST['add'])){
     
          $product = $products[$_POST['id']];
          $cart->add_item($product['id'],$_POST['qty'],$product['price'],$product['info']);
          header('Location:'.$uri);
         
     }
     
     if(isset($_POST['remove'])){
     
          $rid = intval($_POST['id']);
          $cart->del_item($rid);
          usleep(000333);
          header('Location:'.$uri);
         
     }
     
     if($cart->itemcount > 0){
     
          foreach($cart->get_contents() as $item){

               $itemInfo=$item['info'];
               $itemQty=$item['qty'];
               $itemPrice=$item['price'];
               $itemSubtotal=$item['subtotal'];
               
               $itemTotal = $cart->total;
               
               $itemsIn.='<div class="_cart_details">'."\n";
               $itemsIn.='<form method="post" action="#">'."\n".
               '<input type="hidden" name="id" value="'.$item['id'].'">'."\n".
               '<button type="submit" value="remove" name="remove" title="Ukloni">x</button>'."\n".'</form>'."\n\n";
               $itemsIn.='<p class="_info">'.$itemInfo.'</p>'."\n";
               $itemsIn.='<p class="_price"> Cena <b>'.number_format($itemPrice,2,'.',',').'</b> '. currency .'</p>'."\n";
               $itemsIn.='<p class="_qty"> Komada <b class="Blue">'.$itemQty.'</b></p>'."\n";
               $itemsIn.='<p class="_subtotal"> Ukupno <b>'.number_format($itemSubtotal,2,'.',',').'</b> '. currency .'</p></div>'."\n";
          }
         
          $itemsIn.='<div class="clear"></div><hr /><div class="total_complete_order">'."\n";
          $itemsIn.='<p> Ukupna cena <b title="ukupna cena">
          '
.number_format($itemTotal,2,'.',',').'</b> '. currency .'</p>'."\n";
          $itemsIn.='<form method="post" action="#">'."\n".
          '<button name="doCartOrder" value="doCartOrder" type="submit" title="Obavi porudžbinu">
          Obavi Porudžbinu</button>'
."\n".
          '</form></div>'."\n";
     }    else{ $itemsIn=''; }
     
     
     $productPerSe='<div class="cartbox">'."\n";
     
     foreach($products as $k=>$d){

          $productPerSe.='<div class="buttonTop">'."\n".
               '<form method="post" action="#">'."\n".
               '<input type="hidden" name="id" value="'.$products[$k]['id'].'"/>'."\n".
               '<input type="hidden" name="qty" value="1">'."\n".
               '<button value="add" name="add" type="submit">Dodaj u korpu</button>'."\n".
               '</form>'."\n".
               '<p> Naziv: '.$products[$k]['info'].'</p>'."\n".
               '<p> Cena: '.number_format($products[$k]['price'],2,'.',',').' '.currency .'</p>'."\n".
               '</div>'."\n";
     }
     
     $productPerSe.='</div>'."\n";
     $clear='<div class="clear"></div><hr />';
?>
<!DOCTYPE html>
<html lang="en">
<head><meta charset=utf-8>
<title>Korpica - Demo</title>
<style type="text/css">
div.clear {float:none;clear:both;}
div.buttonTop, div._cart_details {display:inline;width:180px;float:left;}
div.total_complete_order {display:inline;float:left;}</style>
</head>
<body>
<?php echo $productPerSe.$clear.$itemsIn; ?>
</body>
</html>
<?php
/*

# Ubij sesiju i korpu nakon uspešno obavljene porudžbine

     if($cart->itemcount > 0){

          $cart->empty_cart();
          $_SESSION['cartItems']=array(null);
          unset($_SESSION['cartItems']);
          session_unset();
          session_destroy();
          session_write_close();
     }    header('Location:'.$_SERVER['REQUEST_URI']);

*/
?>
 


about:networking
Prikačeni fajlovi
 
Odgovor na temu

nepoverljiv
student
Kragujevac, Srbija

Član broj: 226360
Poruke: 131
*.dynamic.sbb.rs.



+2 Profil

icon Re: Problem sa korpom i session18.12.2012. u 15:10 - pre 138 meseci
Da se nadovezem na pocetak mog pitanja i posta.

Nije mi jasno, uzmem samo normalno da ocitam podatke iz baze in on mi prikaze nesto sasvim levo. Npr.:

Code:

$result = mysql_query("SELECT * FROM opis");
        while ($row = mysql_fetch_array($result)){
              $data[] = $row;
                   foreach ($data as $row){
                       echo $row['name'];
           }
     }  


On mi izbaci sledece:

Treci opis
Treci opis
Cetvrti opis
Treci opis
Cetvrti opis
Peti opis

Napomena da imam 3 opisa u bazi (treci, cetvrti, peti)

Jel nekom jasno sto mi ovako izbacuje?
 
Odgovor na temu

dakipro
Dalibor Jovic
Web Developer
Bergen, Norway

Moderator
Član broj: 31848
Poruke: 1792
*.80-202-253.nextgentel.com.

Sajt: norway.dakipro.com


+190 Profil

icon Re: Problem sa korpom i session18.12.2012. u 20:07 - pre 137 meseci
Ako dobro vidim izbacuje ti tacno to sto si mu trazio... Imas petlju u petlji
 
Odgovor na temu

[es] :: PHP :: Problem sa korpom i session

[ Pregleda: 2601 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.