use Tie::Hash; use DBI; my $dbh = DBI->connect("DBI:mysql:book","book","addison") or die "Error: $DBI::errstr\n"; my @KEYS; package ShopCart; @ISA = qw(Tie::StdHash); sub STORE { my ($self, $key, $val) = @_; my $modified = time(); my $session = main::Session(); my $existed = $self->EXISTS($key); # Already exist? my $action = main::param('action'); my $new_qty; unless($val){ $self->DELETE($key); return; } if($existed) { if($action eq "update"){ $new_qty = $val; } else{ $new_qty = $existed + $val; } my $sth = $dbh->prepare( qq{ UPDATE cart SET qty = '$new_qty' WHERE session = ? AND sku = ? }); $sth->execute($session, $key); } else{ my $sth = $dbh->prepare( qq{ INSERT INTO cart VALUES (?,?,?,?) }); $sth->execute($key, $val, $modified, $session); } # End of if..else } # End of STORE sub EXISTS{ my($self, $key) = @_; my $session = main::Session(); my $sth = $dbh->prepare( qq{ SELECT qty FROM cart WHERE session = ? AND sku = ? }); $sth->execute($session, $key); my $temp = $sth->fetch; return $temp->[0] ? $temp->[0] : 0; } # End of EXISTS sub DELETE{ my ($self, $key) = @_; my $session = main::Session(); my $sth = $dbh->prepare( qq{ DELETE FROM cart WHERE session = ? AND sku = ? }); $sth->execute($session, $key); } # End of DELETE sub FETCH{ my ($self, $key) = @_; my $session = main::Session(); my $sth = $dbh->prepare( qq{ SELECT qty FROM cart WHERE session = ? AND sku = ? }); $sth->execute($session, $key); my $temp = $sth->fetch; return $temp->[0]; } # End of FETCH sub FIRSTKEY{ my $self = shift; my $session = main::Session(); my $sth = $dbh->prepare( qq{ SELECT qty, sku FROM cart WHERE session = ? }); $sth->execute($session); $self->{DATA} = $sth->fetchall_arrayref; $self->{INDEX} = 0; my $val = $self->{DATA}->[0][0]; my $key = $self->{DATA}->[0][1]; return if !@{$self->{DATA}}; # No data, return. foreach(@{$self->{DATA}}){ my $key = $_->[1]; my $val = $_->[0]; $self->{LIST}{$key} = $val; } @KEYS = keys ( %{$self->{LIST}} ); $self->{FIRSTKEY} = $key; return ($val, $key); } # End of FIRSTKEY sub NEXTKEY{ my $self = shift; my $lastkey = shift; $key = $KEYS[$self->{INDEX}++]; next if($key eq $self->{FIRSTKEY}); return($key); } # End of NEXTKEY sub DESTROY { $dbh->disconnect(); } # End of DESTROY package Colors; use Tie::Scalar; sub TIESCALAR{ my ($class, @values) = @_; return bless \@values, $class; } sub FETCH { my $self = shift; push(@$self, shift(@$self)); return $self->[-1]; } 1;