Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekształcenia switcha na ifa
Forum PHP.pl > Forum > Przedszkole
TetTheGod
Witam, mam taki problem że chcę przekształcić switcha z kategoriami na ifa, tak abym mógł dodawac nowe kategorie z poziomu UI, bez grzebania w kodzie.
mam taki kod switcha:
  1.  
  2. switch($_POST['category'])
  3. {
  4. case'coins':
  5. $_SESSION['category'] = $_POST['category'];
  6. break;
  7. case'testy':
  8. $_SESSION['category'] = $_POST['category'];
  9. break;
  10. case'wszystko':
  11. $_SESSION['category'] = null;
  12. break;
  13. default:
  14. break;
  15. }



i zrobiłem zamiast tego takiego ifa, ale nie działa:
  1. if(isset($_POST['category']));
  2. {
  3. $_SESSION['category'] = $_POST['category'];
  4. }
  5. if($_SESSION['category'] == "wszystko")
  6. {
  7. $_SESSION['category'] = null;
  8. }


a cały kod tej funkcji wygląda tak:
  1. function search_product()
  2. {
  3. $limit = 8;
  4. $page = $_GET['p'];
  5. if($page==0 || $page==1)
  6. {
  7. $strona= 0;
  8. }else{
  9. $strona = ($page*$limit)-$limit;
  10. }
  11.  
  12. switch($_POST['category'])
  13. {
  14. case'coins':
  15. $_SESSION['category'] = $_POST['category'];
  16. break;
  17. case'testy':
  18. $_SESSION['category'] = $_POST['category'];
  19. break;
  20. case'wszystko':
  21. $_SESSION['category'] = null;
  22. break;
  23. default:
  24. break;
  25. }
  26.  
  27.  
  28. if(isset($_POST['category']));
  29. {
  30. $_SESSION['category'] = $_POST['category'];
  31. }
  32. if($_SESSION['category'] == "wszystko")
  33. {
  34. $_SESSION['category'] = null;
  35. }
  36.  
  37.  
  38. switch($_POST['filter'])
  39. {
  40. case'najmniejsza':
  41. if(isset($_SESSION['category']))
  42. {
  43. $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
  44. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  45. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price ASC LIMIT $strona,8");
  46. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  47. $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
  48. $stmt->execute();
  49. }else{
  50. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  51. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price LIMIT $strona,8");
  52. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  53. $stmt->execute();
  54. }
  55. break;
  56. case'najwieksza':
  57. if(isset($_SESSION['category']))
  58. {
  59. $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
  60. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  61. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price DESC LIMIT $strona,8");
  62. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  63. $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
  64. $stmt->execute();
  65. }else{
  66. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  67. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price DESC LIMIT $strona,8");
  68. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  69. $stmt->execute();
  70. }
  71. break;
  72. default:
  73. if(isset($_SESSION['category']))
  74. {
  75. $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
  76. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  77. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price ASC LIMIT $strona,8");
  78. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  79. $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
  80. $stmt->execute();
  81. }else{
  82. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  83. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price LIMIT $strona,8");
  84. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  85. $stmt->execute();
  86. }
  87. break;
  88.  
  89. }
  90.  
  91. echo '<div class="text5">Wyniki wyszukiwania dla: &nbsp;'.$_SESSION['product_search'].'</div>';
  92. while ($r = $stmt->fetch(PDO::FETCH_ASSOC)) {
  93.  
  94. <div class="col-sm-6 col-md-3">
  95. <input type="hidden" name="id" value="'.$r['id'].'">
  96. <input type="hidden" name="price" value="'.$r['price'].'">
  97. <input type="hidden" name="count" value="'.$r['name'].'">
  98. <div class="thumbnail">
  99. <img src="../graph/'.$r['picture'].'" alt="" class="img-responsive">
  100. <div class="caption">
  101. <h3 class="text-left">'.$r['name'].'</h3>
  102. <p class="text-left">Cena: '.$r['price'].'zł</p>
  103. <div class="btn-toolbar text-center">
  104. <button type="submit" name="buy_product" class="btn btn-primary pull-right">Szczegoły</button>
  105. </div>
  106. </div>
  107. </div>
  108. </div>';
  109. }
  110. echo '</div>';
  111. }


Pomoże ktoś, jak zrobić tego ifa, żeby działał.
nospor
Po co uzywasz sesji skoro twoje if/switche maja tylko zasieg lokalny? Totalnie bez sensu.

Co do problemu to wyswietl sobie co zawiera $_POST i $_SESSION przy pomocy var_dump() i wszystko bedzie jasne

ps: przenosze

Kolejna sprawa jest duplikacja calej masy kodu w zaleznosci od asc/desc. Kod powtarzasz az trzy razy a rozni sie jedynie asc/desc. Przeciez to mozna wstawic do zapytania jako zmienna i bedzie tylko raz w kodzie.
viking
  1. if (isset($_POST['category']) && ($_POST['category'] == 'coins' || $_POST['category'] == 'testy')) {
  2. $_SESSION['category'] = $_POST['category'];
  3. } elseif (isset($_POST['category']) && $_POST['category'] == 'wszystko') {
  4. $_SESSION['category'] = null;
  5. }


albo

  1. $_SESSION['category'] = $_POST['category'] ?? null;


Tylko po co to przerabiać?
TetTheGod
Nospor uzywam sesji bo po wybraniu nowej kategorii lub filtrowania strona się odświeża. Viking chcę to zmienić bo nie chcę mieć kategorii zapisanych sztywno w kodzie, tylko żeby były na stronę wczytywane z mysq'l
nospor
NO dobrze, napisalem ci co zrobic. Zrobiles to?
TetTheGod
Jeszcze z innego forum ktoś polecił mi jeden sposób i staram się go sprzwdzić.
viking
To wystarczy warunek drugi który podałem. Zmieniasz tylko założenie że brak kategorii szczegółowej oznacza pobranie wszystkich. Później wyciągasz selecta z prepare do osobnej zmiennej i budujesz sobie to zapytanie ifami. Na takiej samej zasadzie też sortowanie.
TetTheGod
Zrobiłem to tak i pojawia się wszystko
  1.  
  2. $_SESSION['category'] = $_POST['category'] == 'wszystko' ? "*" : $_POST['category'];
  3. $sort_type = $_POST['filter'] == 'najwieksza' ? 'DESC' : 'ASC';
  4.  
  5. if(isset($_SESSION['category']))
  6. {
  7. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  8. $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
  9. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price $sort_type LIMIT $strona,8");
  10. $stmt->bindValue(':search_name', '%' . $phpro_search_name . '%');
  11. $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
  12. $stmt->execute();
  13. }else{
  14. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  15. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price $sort_type LIMIT $strona,8");
  16. $stmt->bindValue(':search_name', '%' . $phpro_search_name . '%');
  17. $stmt->execute();


ale gdy wybiorę kategorię wszystko, to nic się nie pojawia, a gdy daję filtorwanie od najniższej lub od najwyższej, to też nic się nie pojawia i dopiero po ponownym wybraniu kategorii w której znajdują się wyszukiwane produkty, pojawia się to co chcę.
nospor
Nie "*"
a: null

przeciez robisz ISSET a ISSET na tekscie zawsze daje TRUE
TetTheGod
No dobra to ogarnąłem, a co z filtrowaniem ceny ?
nospor
To nie jest FILTROWANIE a SORTOWANIE.
Pokaz jak wysylasz dane POST
TetTheGod
<?PHP error_show() ?>
<div class="container">
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<form method="post" action="">
<div class="" role="search">
<div class="input-group">
<input type="text" class="form-control" placeholder="Szukaj..." name="search_name">
<div class="input-group-btn">
<button class="btn btn-default btn-v2" type="submit" name="search"><i class="glyphicon glyphicon-search"></i></button>
</div>
</div>
<select class="form-control menus selectpicker" name="filter" onchange="this.form.submit();">
<option name="option">Filtrowanie</option>
<option name="option" value="najmniejsza">Od najniższej ceny</option>
<option name="option" value="najwieksza">Od najwyższej ceny</option>
</select>
<select class="form-control menus selectpicker" name="category" onchange="this.form.submit();">
<option name="option">Kategoria</option>
<option name="option" value="wszystko">Wszystko</option>
<option name="option" value="coins">Coinsy</option>
<option name="option" value="testy">Testy</option>
</select>
</form>
</div>
</div>
</div>
<div class="container thumbs">
<?php search_product() ?>
</div>
<ul class="pagination">
<?PHP search_products_pagination() ?>
</ul>
viking
Wygląda dobrze. Wyświetl sobie co masz w $sort_type przed przekazaniem do zapytania.
TetTheGod
zrobiłem
  1. echo "<p>".$sort_type."</p>";


i pokazuje się ASC lub DESC w zależności od tego co wybieram, ale nie pokazuje się żaden produkt
viking
Może po prostu warunek nie jest spełniony. Wyświetl sobie http://php.net/manual/pl/class.pdostatemen...ops.querystring podstaw dane i wykonaj bezpośrednio na bazie.
TetTheGod
Niby jaki warunek ma nie być spełniony skoro jeśli nie ma kategorii to poprostu pokazuje wszystko. Więc nie rozumiem co tu ma spełnianie warunku do tego że nic się nie wyświetla
viking
WHERE name LIKE :search_name - ten warunek
TetTheGod
Ale co zmiana sortowania ceny ma do tego bo nie za bardzo rozumiem
nospor
To jaki jest aktualnie problem?
I pokaz w koncu jak wyglada $_POST po wyslaniiu
TetTheGod
Problem rozwiązany, a kod finalnie wygląda tak:
  1. switch($_POST['category'])
  2. {
  3. case'wszystko':
  4. $_SESSION['category'] = null;
  5. break;
  6. case'':
  7. break;
  8. default:
  9. $_SESSION['category'] = $_POST['category'];
  10. break;
  11. }
  12.  
  13. switch($_POST['filter'])
  14. {
  15. case'najwieksza':
  16. $_SESSION['sort_type'] = "DESC";
  17. break;
  18. case'najmniejsza':
  19. $_SESSION['sort_type'] = "ASC";
  20. break;
  21. default:
  22. break;
  23. }
  24.  
  25. if(isset($_SESSION['category']))
  26. {
  27. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  28. $phpro_category = filter_var($_SESSION['category'], FILTER_SANITIZE_STRING);
  29. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name AND category=:category ORDER BY price {$_SESSION['sort_type']} LIMIT $strona,8");
  30. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  31. $stmt->bindParam(':category', $phpro_category, PDO::PARAM_STR);
  32. $stmt->execute();
  33. }else{
  34. $phpro_search_name = filter_var($_SESSION['product_search'], FILTER_SANITIZE_STRING);
  35. $stmt = getDBH()->prepare("SELECT * FROM products WHERE name LIKE :search_name ORDER BY price {$_SESSION['sort_type']} LIMIT $strona,8");
  36. $stmt->bindValue(':search_name','%'.$phpro_search_name.'%');
  37. $stmt->execute();
  38. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.