Problem z dodaniem produktu do koszyka


(northwest) #1

Witam serdecznie,

Problem mam z liczeniem go ponieważ skrypt raz widzi maksymalną ilość oraz ilość jako string, a raz jako int:

[0]=
  array(16) {
    ["id"]=
    string(2) "34"
    ["nazwa"]=
    string(11) "BLUZA S.B.P"
    ["cena"]=
    string(5) "20.83"
    ["ilosc"]=
    string(1) "1"
    ["maxilosc"]=
    string(1) "5"
    ["dostawa"]=
    string(4) "2.00"
    ["vat"]=
    string(2) "20"
    ["stanproduktu"]=
    string(1) "1"
    ["aj_nazwa"]=
    string(6) "czarny"
    ["aj_rozmiarX"]=
    string(3) "212"
    ["aj_rozmiar_wielkosc_X"]=
    string(1) "2"
    ["aj_kolorX"]=
    string(3) "212"
    ["produktwpromocji"]=
    string(1) "0"
    ["produktzkuponem"]=
    string(1) "1"
    ["muza"]=
    string(0) ""
  }
  [1]=
  array(16) {
    ["id"]=
    string(2) "60"
    ["nazwa"]=
    string(9) "SBP label"
    ["cena"]=
    string(2) "99"
    ["ilosc"]=
    int(0)
    ["maxilosc"]=
    int(0)
    ["dostawa"]=
    string(4) "3.00"
    ["vat"]=
    string(2) "20"
    ["stanproduktu"]=
    string(1) "1"
    ["aj_nazwa"]=
    string(13) "Cd + koszulka"
    ["aj_rozmiarX"]=
    string(2) "83"
    ["aj_rozmiar_wielkosc_X"]=
    string(2) "83"
    ["aj_kolorX"]=
    string(0) ""
    ["produktwpromocji"]=
    string(1) "0"
    ["produktzkuponem"]=
    ["muza"]=
    string(1) "1"
  }
}

Wie ktoś może dlaczego tak się dzieje?


(GioWDS) #2

Zasadniczo skrypt całego posta powinien przyjąć jako STRING więc coś operuje Ci na _POST wcześniej przed var_dump.

Pokaż zawartość php://input


(northwest) #3

Dziękuję za pomoc :slight_smile:

Faktycznie, formularz wysyła wszystko jako string.

Mam taki kod koszyka:

if ($_SESSION['sumazakupow_brutto'] == "") {
    $_SESSION['sumazakupow_brutto'] = 0;
    $_SESSION['sumazakupow_netto'] = 0;
    $_SESSION['dostawa_brutto'] = 0;
    $_SESSION['dostawa_netto'] = 0;
    $_SESSION['kupon_promocyjny'] = null;
    $_SESSION['kupon_promocyjny2'] = null;
}

if ($_SESSION['koszykzamowien'] == "") {
    $_SESSION['ilosckupow'] = 0;
}

if ($_SESSION['koszykzamowien'] != "") {
    asort($_SESSION['koszykzamowien']);
}

////// USUWANIE POJEDYŃCZEGO PRODUKTU
if ($webid['0'] == "koszyk" && $webid['2'] == "usun" && $_GET['k'] != "") { 
    $_GET['k'] = czysc_sql_liczby($_GET['k']);
    unset($_SESSION['koszykzamowien'][$_GET['k']]);
}

////// USUWANIE WSZYSTKICH PRODUKTÓW
if ($webid['0'] == "koszyk" && $_GET['usunall'] == "usunall") { 
    unset($_SESSION['koszykzamowien']);
    unset($_SESSION['ilosckupow']);
    unset($_SESSION['sumazakupow_brutto']);
    unset($_SESSION['sumazakupow_netto']);
    unset($_SESSION['dostawa_brutto']);
    unset($_SESSION['dostawa_netto']);
    $_SESSION['ilosckupow'] = 0;
    $_SESSION['sumazakupow_brutto'] = 0;
    $_SESSION['sumazakupow_netto'] = 0;
    $_SESSION['dostawa_brutto'] = 0;
    $_SESSION['dostawa_netto'] = 0;
    $_SESSION['kupon_promocyjny'] = null;
    $_SESSION['kupon_promocyjny2'] = null;
}

////// FUNKCJA SZUKAJĄCA DUPLIKATÓW
function recursive_array_search($needle, $haystack, $where1, $where2) {
    foreach($haystack as $key => $value) {
        $current_key=$key;
        // $where1 = aj_nazwa
        // $where2 = aj_rozmiar_wielkosc_X
        if($needle===$value OR ((is_array($value) && recursive_array_search($needle,$value) !== false) AND ($key['aj_nazwa'] == $where1 && $key['aj_rozmiar_wielkosc_X'] == $where2))) {
            return $current_key;
        }
    }
    return false;
}


function findDubel($id, $nazwa, $rozmiar, $koszyk)
{
	$find_dubel = false;
	$dubel_key = false;
	while ( ( list($key,$item) = each($koszyk) ) && !$find_dubel) {
		if ($item['id'] == $id && $item['aj_nazwa'] == $nazwa && $item['aj_rozmiar_wielkosc_X'] == $rozmiar) {
			$find_dubel = true;
			$dubel_key = $key;
		}
	}
	return $dubel_key;
}

////// DODAWANIE PRODUKTU DO KOSZYKA
if ($_POST['updatekoszyka'] == "" && $_POST['itemid'] != "" && $_POST['ilosc'] != "") {
    if ($_POST['maxilosc'] >= $_POST['ilosc']) {
        $_POST['i_cena'] = str_replace(",", ".", $_POST['i_cena']); 
        $_POST['i_transport'] = str_replace(",", ".", $_POST['i_transport']); 
        //$dubel = recursive_array_search($_POST['itemid'], $_SESSION['koszykzamowien'], baza_zapis($_POST['aj_nazwa']), baza_zapis($_POST['aj_rozmiar_wielkosc_X']));
        $dubel = findDubel($_POST['itemid'], baza_zapis($_POST['aj_nazwa']), baza_zapis($_POST['aj_rozmiar_wielkosc_X']), $_SESSION['koszykzamowien']);

        
        if($dubel === FALSE){
            $_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']), 'ilosc' =>czysc_sql_liczby($_POST['ilosc']), 'maxilosc' =>czysc_sql_liczby($_POST['aj_dostepnychX']), 'dostawa' =>baza_zapis($_POST['i_transport']), 'vat' =>czysc_sql_liczby($_POST['vat']), 'stanproduktu' =>czysc_sql_liczby($_POST['stanproduktu']), 'aj_nazwa' =>baza_zapis($_POST['aj_nazwa']), 'aj_rozmiarX' =>baza_zapis($_POST['aj_rozmiarX']), 'aj_rozmiar_wielkosc_X' =>baza_zapis($_POST['aj_rozmiar_wielkosc_X']), 'aj_kolorX' =>baza_zapis($_POST['aj_kolorX']), 'produktwpromocji' =>baza_zapis($_POST['produktwpromocji']), 'produktzkuponem' =>baza_zapis($_POST['produktzkuponem']), 'przeliczylem_rabat' => 0, 'muza' =>baza_zapis($_POST['aj_muza']));
        } else{
            //echo "DUBEL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
            if($_POST['maxilosc'] >= $_SESSION['koszykzamowien'][$dubel]['ilosc'] + 1){
                $_SESSION['koszykzamowien'][$dubel]['ilosc'] = $_SESSION['koszykzamowien'][$dubel]['ilosc'] + 1;
            }
        }
        //echo "==== $dubel =====";
    } else
        $error_message = "Brak wystarczającej ilości produktów w sklepie!! Posiadamy aktualnie: " . $_POST['maxilosc'] . " ";
}

////// AKTUALIZOWANIE PRODUKTU W KOSZYKU
if ($_POST['updatekoszyka'] != "" && $_POST['szukanawartosc']!="") { 
    $_POST['szukanawartosc'] = czysc_sql_liczby($_POST['szukanawartosc']);
    $_SESSION['koszykzamowien'][$_POST['szukanawartosc']]['ilosc'] = czysc_sql_liczby($_POST['ilosckupna']); 
}

//////////////////////////////////////////////////
if ($_SESSION['koszykzamowien'] != "") {
    $_SESSION['sumazakupow_brutto'] = 0;
    $_SESSION['sumazakupow_netto'] = 0;
    $_SESSION['ilosckupow'] = 0;
    $_SESSION['dostawa_netto'] = 0;
    $_SESSION['dostawa_brutto'] = 0;
    foreach ($_SESSION['koszykzamowien'] as $index => $value) {
        
        if($value['ilosc'] == 0 || $value['ilosc'] ==""){
            unset($_SESSION['koszykzamowien'][$index]);
        }
        
        // nalicz rabat
        if($value['przeliczylem_rabat'] == "0" && $value['produktwpromocji'] == "0" && $_SESSION['kupon_promocyjny'] != 0 && $_SESSION['kupon_promocyjny'] !== null){
            $_SESSION['koszykzamowien'][$index]['przeliczylem_rabat'] = 1; 
            $value['cena'] = $value['cena'] - ($value['cena'] * $_SESSION['kupon_promocyjny']) / 100;
            $value['cena'] = number_format($value['cena'],2);
            $_SESSION['koszykzamowien'][$index]['cena'] = $value['cena']; 
        }
        ///////////////////////////////////////////
        $_SESSION['sumazakupow_brutto'] = $_SESSION['sumazakupow_brutto'] + (($value['cena'] * $value['ilosc'] * $value['vat']) / 100 + $value['ilosc'] * $value['cena']); 
        //$_SESSION['sumazakupow_netto'] = $_SESSION['sumazakupow_netto'] + ($value['cena'] * $value['ilosc']);
        $_SESSION['ilosckupow'] = $_SESSION['ilosckupow'] + $value['ilosc'];
        $_SESSION['dostawa_netto'] = $_SESSION['dostawa_netto'] + $value['dostawa'] * $value['ilosc']; 
        $_SESSION['dostawa_brutto'] = $_SESSION['dostawa_brutto'] + (($value['dostawa'] * $value['ilosc'] * $value['vat']) / 100 + $value['ilosc'] * $value['dostawa']);
    }
}

if($_POST['updatekod'] == 1){ 
    $stmt22a = $db->prepare("SELECT rabat, nazwa, bf_id FROM cms_users_kody_promocyjne WHERE kod=:kod and idusera=:idusera and data_uzycia is null;");
    $stmt22a->bindValue(':kod', baza_zapis($_POST['kodrabatowy']), PDO::PARAM_STR);
    $stmt22a->bindValue(':idusera', czysc_sql_liczby($_SESSION['cms_id']), PDO::PARAM_INT);
    $stmt22a->execute();
        foreach ($stmt22a as $row22a) {
            $_SESSION['kupon_promocyjny'] = $row22a['rabat'];
            $_SESSION['kupon_promocyjny2'] = $row22a['bf_id'];
            header("Refresh:0");
        }
}

echo $_SESSION['kupon_promocyjny2'];

echo "<pre>";
var_dump ($_SESSION['koszykzamowien']);
echo"</pre><br/><br/>";



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function dodaj_koszyk_porownanie($item) {
    $_SESSION['koszyk_porownanie'][] = $item;
}
// produkty ulubione
    if($_POST['por_poz_send_to_upd']!=""){
        $save_to_por = array('id' =>czysc_sql_liczby($_POST['por_poz_send_to_por']));
            dodaj_koszyk_porownanie($save_to_por);
        $_SESSION['koszyk_porownanie'] = array_map("unserialize", array_unique(array_map("serialize", $_SESSION['koszyk_porownanie'])));
        
    }
$_SESSION['porownywarka_produktow'] = 0;
    foreach ($_SESSION['koszyk_porownanie'] as $value) {
        $_SESSION['porownywarka_produktow'] = $_SESSION['porownywarka_produktow'] + 1;
    }

function baza_zapis($string) { 
    $string = addslashes($string);
    $string = trim((htmlspecialchars(($string), ENT_QUOTES)));
    return $string;
}
function czysc_sql_liczby($string) {
    if (preg_match("/[0-9]/", $string)) {
        if (is_numeric($string)) {
            if ($string == "")
                $string = 0;
            return $string;
        }
    } else
        return 0;
}

 

Przed “wgraniem” produktu do koszyka mam:

array(1) {


(ttomas) #4

nie podam ci gotowego rozwiązania ale masz problem ogólnie z konwersją lub brakiem konwersji typów zmiennych. 

PHP nie wymaga definiowana typów ale działa zgodnie z typami w jakich “uważa” że dany string jest zdefiniowany i tak oblicza numerki :slight_smile:

i tutaj ważne jest co w danym stringu z liczbą po “przecinku” się znajduje . czy , . samo str_replace z , na . lub odwrotnie może pomóc (nie pamiętam i nie sprawdzałem jak powinno być) lub może w formularzu przed/po przesłaniu wkradają się spacje i php uzna za string nie oblicza.

 


(ttomas) #5

eh :), rozpędziłem się trochę z poprzednim postem :stuck_out_tongue:

dałeś var_dump ($_SESSION[‘koszykzamowien’]); prawie na końcu koszyka i masz [“ilosc”]=> int(0) i [“maxilosc”]=> int(0)

daj jeszcze var_dump z $_POST[‘ilosc’] i z $_POST[‘aj_dostepnychX’] na samym początku koszyka bo te zamienne wrzucasz do:

$_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']), 'ilosc' =>czysc_sql_liczby($_POST['ilosc']), 'maxilosc' =>czysc_sql_liczby($_POST['aj_dostepnychX']),

to zawęzi Ci poszukiwania bo możesz mieć problem z formularzem / skryptem wysyłającym i zmienne nie dolatują i funkcja czysc_sql_liczby która masz w kodzie z “” wrzuca 0.

Jeśli na początku kodu koszyka będziesz miał odpowiednie wartości tych 2 POST, sprawdzasz ich wartość po kolei w kodzie koszyka gdzie mogą być podmienione.