Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][AJAX] Wyświetlanie zależne od select
Forum PHP.pl > Forum > XML, AJAX
CiRiO
Borykam się z pewnym problemem. Opiszę może to na przykładach.
  1. function showPrice(str)
  2. {
  3. var xmlhttp;
  4. if (str=="")
  5. {
  6. document.getElementById("txtHint").innerHTML="";
  7. return;
  8. }
  9. if (window.XMLHttpRequest)
  10. {// code for IE7+, Firefox, Chrome, Opera, Safari
  11. xmlhttp=new XMLHttpRequest();
  12. }
  13. else
  14. {// code for IE6, IE5
  15. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  16. }
  17. xmlhttp.onreadystatechange=function()
  18. {
  19. if (xmlhttp.readyState==4 && xmlhttp.status==200)
  20. {
  21. document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
  22. }
  23. }
  24. xmlhttp.open("GET","includes/price.php?q="+str,true);
  25. xmlhttp.send();
  26. }


  1. $q=$_GET["q"];
  2.  
  3. $dbConnect = mysql_connect ($dbHost, $dbUser, $dbPass) or die ('MySQL connect failed. ' . mysql_error());
  4. mysql_select_db($dbName) or die('Cannot select database. ' . mysql_error());
  5.  
  6. $sql = "SELECT * FROM pfase_server, pfase_settings, pfase_payment WHERE payment_id = $q";
  7. $result = mysql_query($sql) or die(mysql_error());
  8. $row = mysql_fetch_assoc($result);
  9.  
  10. echo "Cena za SMS: <span>".$row['payment_price']."zł</span> z VAT";


  1. <select onchange="showPrice(this.value)">
  2. <option value=""></option>
  3. {foreach from=$payment item=row}<option value="{$row.payment_id}">{$row.payment_time}</option>{/foreach}


W <div id=#txtHint> wyświetla mi się cena, która jest zależna od wyboru w select. Moim celem jest wyświetlenie ponowne ceny, oraz numeru z bazy (id select = id ceny i numeru) tylko w innej postaci, tzn. nie "Cena za SMS: <span>".$row['payment_price']."zł</span> z VAT".
Proszę o pomoc.
szalek01
exclamation.gif! sql injection = (SELECT * FROM pfase_server, pfase_settings, pfase_payment WHERE payment_id = $q) <= $q=$_GET["q"];
poczytaj o PDO i JQUERY AJAX
CiRiO
Wiem doskonale, że ten kod jest dziurawy i wiem jak temu zaradzić, lecz w tym etapie tworzenia kwestie zabezpieczeń pomijam. Tak samo metoda łączenia się z bazą jest tymczasowa. Odesłanie mnie do lektury jQuery AJAX nie jest rozwiązaniem problemu, tym bardziej, że nie nie poruszam się w tej tematyce i wiedza wykraczająca ponad podstawy jest mi zupełnie zbędna.
Pozdrawiam
Arcioch
Hej smile.gif

Tu masz napisane to co potrzebujesz tylko na tablicach i wykorzystując jQuery wink.gif Kod składa się z 2 plików wink.gif selecty.php w którym jest select i kod w js wysyłający wartość selecta do drugiego pliku post.php.
Dostosuj sobie to do bazy danych a następnie odpowiednio zabezpiecz wink.gif

Plik selecty.php

  1. <?php
  2. $produkty = array('Komputer', 'Telewizor', 'Telefon');
  3. ?>
  4.  
  5.  
  6. <!DOCTYPE html>
  7. <meta charset="UTF-8">
  8. <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
  9.  
  10. div.first_select{
  11. display: block;
  12. float: left;
  13. width: 200px;
  14. }
  15.  
  16. select{
  17. width: 150px;
  18. text-align: center;
  19. }
  20.  
  21. div.decv{
  22. display: block;
  23. float: left;
  24. clear: both;
  25. margin: 100px 0px 0px 0px;
  26. }
  27.  
  28.  
  29. $(function(){
  30. // Tu masz funckje odpowiedzialna za pierwszego select
  31.  
  32. $('#produkty').change(function() {
  33.  
  34. var produkt = $('select#produkty option:selected').val();
  35.  
  36. if(produkt != ''){
  37. $.ajax({
  38. type: "POST",
  39. url: "post.php",
  40. data: "produkt=" + produkt ,
  41. cache: false,
  42. dataType: "json",
  43. success: function(data){
  44. $('div.desc').html(data);
  45. }
  46. });
  47. }else{
  48. $('div.desc').html('');
  49. }
  50.  
  51. });
  52.  
  53. });
  54.  
  55.  
  56. </head>
  57.  
  58. <div class="first_select">
  59. <select id="produkty" name="produkty">
  60. <option value="">Wybierz produkt</option>
  61. <? foreach($produkty as $key => $p):?>
  62. <option value="<?= $key?>"><?= $p ?></option>
  63. <? endforeach; ?>
  64. </select>
  65. </div>
  66.  
  67. <div class="desc">
  68. </div>
  69.  
  70. </body>
  71. </html>


plik post.php

  1. <?php
  2.  
  3.  
  4. $produkty = array('Komputer', 'Telewizor', 'Telefon');
  5.  
  6. $ceny = array('1500', '1000', '500');
  7.  
  8.  
  9.  
  10. if(isset($_POST['produkt'])){
  11.  
  12. $cena = 'Cena za produkt wynosci ';
  13. foreach($ceny as $key => $c){
  14. if($key == $_POST['produkt']){
  15. $cena .= $c.' PLN';
  16. break;
  17. }
  18. }
  19.  
  20. echo json_encode($cena);
  21. }
  22. ?>
  23.  
CiRiO
Wszystko prawdopodobnie działałoby super, gdyby nie fakt, że korzystam również ze SMARTY. Wyklucza to wstawienie w value zmiennej $key, a co za tym idzie zawartość nie zmienia się zależnie od selecta. Rozwiązaniem tej sytuacji mogłoby być nazwanie funkcji przykładowo showPrice(str) i wstawienie do selecta onchange="showPrice(this.value)", lecz wiązałoby się to z przesłaniem metodą GET wartości value. Niestety nie wiem jak wdrożyć coś takiego w dany mi powyżej kod jquery. Ma ktoś jakieś pomysły? Albo potrafi przerobić mój kod bym mógł określić zawartość więcej niż jednego diva tak jak mogę zrobić w kodzie, który podesłał mi Arcioch.
Arcioch
Kolego to jest tylko przykład wink.gif bez problemu można go zastosować ze smartami wink.gif
Robisz selecta jak w Twoim kodzie w value wpisując id i ślesz id postem wink.gif Ja akurat wysyłałem klucze tablicy bo mi tak było szybciej wink.gif Kodu jQuery nie musisz zmieniać chyba ze nazwę wysyłanej postem zmiennej i id selecta z którego ma łapać wink.gif Czyli robisz tak wink.gif W pliku z templatem gdzie masz załączane arkusz stylów itp w znaczniku head doklejasz wink.gif

  1. <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
  2.  
  3. $(function(){
  4. $('#produkty').change(function() {
  5.  
  6. var produkt = $('select#produkty option:selected').val();
  7.  
  8. if(produkt != ''){
  9. $.ajax({
  10. type: "POST",
  11. url: "post.php",
  12. data: "produkt=" + produkt ,
  13. cache: false,
  14. dataType: "json",
  15. success: function(data){
  16. $('div.desc').html(data);
  17. }
  18. });
  19. }else{
  20. $('div.desc').html('');
  21. }
  22.  
  23. });
  24.  
  25. });
  26.  


Twój select w smartach wygląda tak wink.gif Dodatkowo potrzeby jest jakiś pusty div w którym będziemy wrzucać ten tekst (w tym przypadku div.desc)wink.gif

  1. <select id="produkty" name="produkty">
  2. <option value=""></option>
  3. {foreach from=$payment item=row}<option value="{$row.payment_id}">{$row.payment_time}</option>{/foreach}
  4. <div class="desc"></div>


Plik post.php w Twoim przypadku będzie wyglądał tak wink.gif

  1. <?
  2. if(isset($_POST['produkt'])){
  3.  
  4. $q=$_POST['produkt'];
  5.  
  6. $dbConnect = mysql_connect ($dbHost, $dbUser, $dbPass) or die ('MySQL connect failed. ' . mysql_error());
  7. mysql_select_db($dbName) or die('Cannot select database. ' . mysql_error());
  8.  
  9. $sql = "SELECT * FROM pfase_server, pfase_settings, pfase_payment WHERE payment_id = $q";
  10. $result = mysql_query($sql) or die(mysql_error());
  11. $row = mysql_fetch_assoc($result);
  12. $komunikat = "Cena za SMS: <span>".$row['payment_price']."zł</span> z VAT";
  13. echo json_encode($komunikat);
  14. }
  15. ?>


CiRiO
Dziękuję ślicznie za pomoc. Wszystko działa znakomicie smile.gif
Pozdrawiam
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.