• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przekształcenie switcha na if'a

Object Storage Arubacloud
0 głosów
191 wizyt
pytanie zadane 23 grudnia 2016 w PHP przez Mistrz0000000 Bywalec (2,780 p.)

Witam, mam switcha z kategoriami porduktów, ale chcę go przekształcić na ifa, aby móc dodawać kategorie z poziomu interfejsu, bez grzebania w kodzie.

mam takiego switcha 

    switch($_POST['category'])
    {
        case'coins':
            $_SESSION['category'] = $_POST['category'];
            break;
        case'testy':
            $_SESSION['category'] = $_POST['category'];
            break;
        case'wszystko':
            $_SESSION['category'] = null;
            break;
        default:
            break;
    }

i próbując go przekształcić na if'a wyszło mi coś takiego, ale nie działa. 

    if(isset($_POST['category']));
    {
        $_SESSION['category'] = $_POST['category'];
    }
    if($_SESSION['category'] == "wszystko")
    {
        $_SESSION['category'] = null;
    }

A tu mamy cały kod tej funkcji:

function search_product()
{
    $limit = 8;
    $page = $_GET['p'];
    if($page==0 || $page==1)
    {
        $strona= 0;
    }else{
        $strona = ($page*$limit)-$limit;
    }

    switch($_POST['category'])
    {
        case'coins':
            $_SESSION['category'] = $_POST['category'];
            break;
        case'testy':
            $_SESSION['category'] = $_POST['category'];
            break;
        case'wszystko':
            $_SESSION['category'] = null;
            break;
        default:
            break;
    }
    

    switch($_POST['filter'])
    {
        case'najmniejsza':
            if(isset($_SESSION['category']))
            {
                $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
                $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
                $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price ASC LIMIT $strona,8");
                $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
                $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
                $stmt->execute();
            }else{
                $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
                $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price LIMIT $strona,8");
                $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
                $stmt->execute();
            }
            break;
        case'najwieksza':
            if(isset($_SESSION['category']))
            {
                $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
                $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
                $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price DESC LIMIT $strona,8");
                $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
                $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
                $stmt->execute();
            }else{
                $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
                $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price DESC LIMIT $strona,8");
                $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
                $stmt->execute();
            }
            break;
        default:
            if(isset($_SESSION['category']))
            {
                $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
                $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
                $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price ASC LIMIT $strona,8");
                $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
                $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
                $stmt->execute();
            }else{
                $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
                $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price LIMIT $strona,8");
                $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
                $stmt->execute();
            }
            break;

    }

    echo '<div class="text5">Wyniki wyszukiwania dla: &nbsp;'.$_SESSION['product_search'].'</div>';
    while ($r = $stmt->fetch(PDO::FETCH_ASSOC)) {

        echo'
    	<div class="col-sm-6 col-md-3">
	<input type="hidden" name="id" value="'.$r['id'].'">
    <input type="hidden" name="price" value="'.$r['price'].'">
    <input type="hidden" name="count" value="'.$r['name'].'">
		<div class="thumbnail">
			<img src="../graph/'.$r['picture'].'" alt="" class="img-responsive">
			<div class="caption">
				<h3 class="text-left">'.$r['name'].'</h3>
				<p class="text-left">Cena: '.$r['price'].'zł</p>
				<div class="btn-toolbar text-center">
					<button type="submit" name="buy_product" class="btn btn-primary pull-right">Szczegoły</button>
				</div>
			</div>
		</div>
	</div>';
    }
    echo '</div>';
}

function change_steamid()
{
    $stmt = getDBH()->prepare("UPDATE users SET steamid = :steamid WHERE login = :id");
    $stmt->bindParam(':steamid', $_SESSION['steamid'], PDO::PARAM_STR);
    $stmt->bindParam(':id', $_SESSION['id'], PDO::PARAM_STR);
    $stmt->execute();

 

2 odpowiedzi

+1 głos
odpowiedź 23 grudnia 2016 przez maly Nałogowiec (37,190 p.)

Zamiast dwóch wersji (z i bez category) zrób jedną a jako kategorię 'wszystko' podaj '*'.

$_SESSION['category'] = $_POST['category'] == 'wszystko' ? '*' : $_POST['category'];

 

Nie wiem czy widzisz ale filter 'najmniejsza' i 'najwieksza' rózni się tylko sposobem sortowania ASC i DESC więc po co ten cały switch?

 

komentarz 23 grudnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
Ten cały switch jest po to żebym miał to lepiej posegregowane ? A poza tym jakaś różnica jest pomiędzy '*' a 'wszystko' ? Poza tym dalej nie mam odpowiedzi dlaczego nie działa mój if -_-
komentarz 23 grudnia 2016 przez maly Nałogowiec (37,190 p.)
Nie posegregowałeś tylko powieliłeś ten sam kod sześć razy.
Gwiazdka oznacza w tym przypadku jakąkolwiek kategorię.
komentarz 23 grudnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
To jak twoim zdaniem zrobić to bez powielania.
komentarz 23 grudnia 2016 przez maly Nałogowiec (37,190 p.)

Pisane z palca więc raczej nie wkleisz ale dla celów poglądowych myślę że wystarczy.

$category = $_POST['category'] == 'wszystko' ? '*' : $_POST['category'];
$sort_type = $_POST['filter'] == 'najwieksza' ? 'DESC' : 'ASC';
$search_product = $_POST['search_product'];

$stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price {$sort_type} LIMIT {$strona},8");

$stmt->bindValue(':search_name','%'.$search_product.'%');
$stmt->bindParam(':category', $category, PDO::PARAM_STR);

$stmt->execute();

 

komentarz 23 grudnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)

A mógł byś mi wyjaśnić te 2 linijki ? 

$category = $_POST['category'] == 'wszystko' ? '*' : $_POST['category'];
$sort_type = $_POST['filter'] == 'najwieksza' ? 'DESC' : 'ASC';

sory za takie pytania, ale nigdy wcześniej nie spotkałem się z takim czymś.

 

komentarz 23 grudnia 2016 przez maly Nałogowiec (37,190 p.)

To jest skrócona wersja if/else

cel = (warunek) ? (dane dla celu jeśli warunek spełniony) : (dane dla celu jeśli warunek nie spełniony);
if($_POST['category'] == 'wszystko'){
	$category = '*' ;
}else{
	$category = $_POST['category'];
}

 

komentarz 23 grudnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
OK serio wielkie dzięki za wyjaśnienie, niby mógł bym poprostu skopiować, ale nie wie dział bym o co w tym chodzi, a po 2 nie zadziałało by bo strona się odświeża po wybraniu nowej kategorii lub filtrowania i musiał bym pozmieniać na sesje
komentarz 23 grudnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)

Przerobiłem ten kod i jest tak:


    $_SESSION['category'] = $_POST['category'] == 'wszystko' ? '*' : $_POST['category'];
    $_SESSION['sort_type'] = $_POST['filter'] == 'najwieksza' ? 'DESC' : 'ASC';

    $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price {$_SESSION['sort_type']} LIMIT $strona,8");

    $stmt->bindValue(':search_name','%'.$_SESSION['product_search'].'%');
    $stmt->bindParam(':category', $_SESSION['category'], PDO::PARAM_STR);

    $stmt->execute();

    echo '<div class="text5">Wyniki wyszukiwania dla: &nbsp;'.$_SESSION['product_search'].'</div>';
    while ($r = $stmt->fetch(PDO::FETCH_ASSOC)) {

        echo'
    	<div class="col-sm-6 col-md-3">
	<input type="hidden" name="id" value="'.$r['id'].'">
    <input type="hidden" name="price" value="'.$r['price'].'">
    <input type="hidden" name="count" value="'.$r['name'].'">
		<div class="thumbnail">
			<img src="../graph/'.$r['picture'].'" alt="" class="img-responsive">
			<div class="caption">
				<h3 class="text-left">'.$r['name'].'</h3>
				<p class="text-left">Cena: '.$r['price'].'zł</p>
				<div class="btn-toolbar text-center">
					<button type="submit" name="buy_product" class="btn btn-primary pull-right">Szczegoły</button>
				</div>
			</div>
		</div>
	</div>';
    }
    echo '</div>';

ale teraz nic się nie wyświetla

0 głosów
odpowiedź 23 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)
switch -> case -> case -> ... -> default.

if -> else if -> else if -> ... -> else
komentarz 23 grudnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
Mi tu nie chodzi o to żeby kategorie były sztywno wpisane w kod.
komentarz 23 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)

Zapisz kategorie w bazie danych. Pobieraj je i zapisuj do tablicy. Potem sprawdzaj czy dane wejściowe są zgodne z odczytanymi kategoriami za pomocą http://php.net/manual/pl/function.in-array.php

1
komentarz 23 grudnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
Wolę zrobić pobieranie z mysql, i wstawienie do listboxa, który potem postem prześle do funkcji

Podobne pytania

0 głosów
0 odpowiedzi 262 wizyt
pytanie zadane 31 lipca 2022 w PHP przez Tomaszzw Nowicjusz (210 p.)
0 głosów
1 odpowiedź 674 wizyt
pytanie zadane 15 marca 2022 w JavaScript przez mamosia Nowicjusz (120 p.)
+1 głos
1 odpowiedź 396 wizyt
pytanie zadane 29 stycznia 2021 w C i C++ przez Aro15 Nowicjusz (130 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...