Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zmiana kilku osobnych Select'ów w jeden, Czy to jest właściwy krok?
Przemo75
post 19.11.2017, 12:43:42
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


Witam,
Męczę się z tym już od dłuższego czasu i niestety nie bardzo wiem jak to rozgryźć.
Do wyświetlania zawartości (wyników z bazy) z 3 dynamicznych Select'ów mam poniższy kod:
  1. <?php
  2. include('dbconfig.php');
  3. $action = $_REQUEST['action'];
  4. if ($action=='showAll')
  5. {$id = "0";}
  6. else $id=$_POST['id'];
  7.  
  8. switch($action)
  9. {
  10. case 'showAll':
  11. default:
  12. $stmt=$DB_con->prepare('SELECT * FROM slist GROUP BY site');
  13. $stmt->execute();
  14. break;
  15. case 'site':
  16. $stmt=$DB_con->prepare('SELECT menu FROM slist WHERE site=:id GROUP BY menu ORDER BY menu');
  17. $stmt->execute(array(':id'=>$id));
  18. break;
  19. case 'menu':
  20. $stmt=$DB_con->prepare('SELECT categ FROM slist WHERE menu=:id GROUP BY categ ORDER BY categ');
  21. $stmt->execute(array(':id'=>$id));
  22. break;
  23. case 'categ':
  24. $stmt=$DB_con->prepare('SELECT links FROM slist WHERE categ=:id GROUP BY categ ORDER BY links');
  25. $stmt->execute(array(':id'=>$id));
  26. break;
  27. }
  28. ?>

Nie do końca działa on poprawnie, ponieważ przy wyborze ostatniego Select'a nie zwraca właściwego wyniku, a jest to spowodowane tym, że dla
Kod
case 'categ';
poprawne zapytanie powinno mieć postać
Kod
$stmt=$DB_con->prepare('SELECT links FROM slist WHERE menu=:id AND categ=:id GROUP BY categ ORDER BY links');

Niestety nie wiem, w jaki sposób przekazać wartość
Kod
menu=:id
do tego zapytania.
Link do demo i całego kodu umieściłem tutaj

Może mógłby ktoś podpowiedzieć, co zrobić/zmienić.

Ten post edytował Przemo75 19.11.2017, 16:32:45
Go to the top of the page
+Quote Post
viking
post 19.11.2017, 13:22:44
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Wybierz wartość selecta w JS, podstaw do requesta ajaxowego i tyle. I nie twórz po kilka tych samych tematów.
https://prophp.pl/advice/show/22/jak_w_java...ct_od_siebie%3F


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 19.11.2017, 13:39:22
Post #3





Grupa: Zarejestrowani
Postów: 1 836
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Swoją drogą, kod możesz skrócić bardzo prosto. Zakładając że wartość 'showAll' i default to to samo.

wystarczy zastosować case tak:

  1. case 'showAll':
  2. default:
  3. $stmt=$DB_con->prepare('SELECT * FROM slist GROUP BY site');
  4. $stmt->execute();
  5. break;

Go to the top of the page
+Quote Post
Przemo75
post 20.11.2017, 11:07:34
Post #4





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


No właśnie nie za bardzo wychodzi mi to podstawienie.
Z ajaxa wysyłam tym:
Kod
$(".menu").change(function()
{
   var id=$(this).val();
   var dataString = 'id=' + id + '&action=menu';
      $.ajax
      ({
    type: "POST",
    url: "get_categ.php",
    data: dataString,
    cache: false,
    success: function(html)
    {
        $(".categ").html(html);
    }
      });
});

a odbieram tym:
  1. <?php
  2. include('dbconfig.php');
  3. if($_POST['id'])
  4. {
  5. $id=$_POST['id'];
  6. $action=$_POST['action'];
  7. $stmt=$DB_con->prepare('SELECT categ FROM slist WHERE menu=:id GROUP BY categ ORDER BY categ');
  8. $stmt->execute(array(':id' => $id));
  9. ?><option selected="selected">Category :</option><?php
  10. while($row=$stmt->fetch(PDO::FETCH_ASSOC))
  11. {
  12. $categ = $row['categ'];
  13. ?>
  14. <option value="<?php echo $categ; ?>"><?php echo $categ; ?></option>
  15. <?php
  16. }
  17. }
  18. ?>

i właśnie nie wiem, jak dalej przekazać to "startowe"
Kod
$id=$_POST['id']


Cytat(viking @ 19.11.2017, 13:22:44 ) *
Wybierz wartość selecta w JS, podstaw do requesta ajaxowego i tyle.
https://prophp.pl/advice/show/22/jak_w_java...ct_od_siebie%3F

Docelowa baza będzie miała ok. 3 tys. rekordów, więc to rozwiązanie chyba nie do końca w moim przypadku się sprawdzi.

Ten post edytował Przemo75 20.11.2017, 09:19:09
Go to the top of the page
+Quote Post
viking
post 20.11.2017, 11:12:59
Post #5





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Rozwiązanie miało ci pokazać jak dobrac się do elementów select i przekazać z nich wartość dalej bo z tym problem. W jquery podstawiasz:
data: {
id: id,
categ: wartosc tego drugiego selecta
}


--------------------
Go to the top of the page
+Quote Post
Przemo75
post 20.11.2017, 11:38:39
Post #6





Grupa: Zarejestrowani
Postów: 66
Pomógł: 2
Dołączył: 9.03.2004
Skąd: POLSKA

Ostrzeżenie: (0%)
-----


Czy da się jakoś zoptymalizować poniższe zapytania?
  1. switch($action)
  2. {
  3. case 'showAll';
  4. $stmt=$DB_con->prepare('SELECT * FROM slist GROUP BY site');
  5. $stmt->execute();
  6. break;
  7. case 'site';
  8. $stmt=$DB_con->prepare('SELECT menu FROM slist WHERE site=:id GROUP BY menu ORDER BY menu');
  9. $stmt->execute(array(':id'=>$id));
  10. break;
  11. case 'menu';
  12. $stmt=$DB_con->prepare('SELECT categ FROM slist WHERE menu=:id GROUP BY categ ORDER BY categ');
  13. $stmt->execute(array(':id'=>$id));
  14. break;
  15. case 'categ';
  16. $menu = $_POST['menu'];
  17. $stmt=$DB_con->prepare('SELECT links FROM slist WHERE menu=:menu AND categ=:id GROUP BY categ ORDER BY links');
  18. $stmt->execute(array(':menu'=>$menu, ':id'=>$id));
  19. break;
  20. default:
  21. $stmt=$DB_con->prepare('SELECT * FROM slist GROUP BY site');
  22. $stmt->execute();
  23. break;
  24. }


Ten post edytował Przemo75 20.11.2017, 14:06:13
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 17:02