[ nepoverljiv @ 09.12.2012. 17:27 ] @
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?
[ Boyka @ 11.12.2012. 13:05 ] @
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
[ nepoverljiv @ 12.12.2012. 18:12 ] @
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?
[ nesh @ 12.12.2012. 19:17 ] @
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...
[ nepoverljiv @ 12.12.2012. 19:35 ] @
Hvala, ali ne hvala. Nista nisam razumeo sta si hteo da kazes.
[ nesh @ 12.12.2012. 19:46 ] @
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
[ nepoverljiv @ 12.12.2012. 20:06 ] @
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.
[ Boyka @ 14.12.2012. 15:33 ] @
hmmm mozda je postback,

ubaci ovo kroz celu stranu html-a,
<?php
if (!strtoupper($_SERVER['REQUEST_METHOD']) == 'POST')
{
?>
<html>
</html>
<?php
}
?>
[ Nemanja Avramović @ 15.12.2012. 09:51 ] @
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.
[ plus_minus @ 15.12.2012. 10:17 ] @
@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.


[ nepoverljiv @ 15.12.2012. 16:22 ] @
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?
[ nepoverljiv @ 16.12.2012. 21:47 ] @
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?
[ plus_minus @ 17.12.2012. 00:18 ] @
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']);

*/
?>
 

[ nepoverljiv @ 18.12.2012. 15:10 ] @
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?
[ dakipro @ 18.12.2012. 20:07 ] @
Ako dobro vidim izbacuje ti tacno to sto si mu trazio... Imas petlju u petlji