Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML]Ukryta wartość
Forum PHP.pl > Forum > Przedszkole
benzulli
Witam

Robię kalkulator no i mam problem, mianowicie z listy rozwijanej wybieram sobie przykładowo pozycję A, a chcę, żeby wlaśnie ta pozycja A była widoczna, a przypisana do niej wartość brała udział w obliczeniach (wartość nie jest widoczna tylko pozycja A). Jak to zrobić?
Kshyhoo
Wrzuć do sesji.
Damonsson
Najlepiej myślę skorzystać z:

http://www.w3schools.com/tags/att_global_data.asp
benzulli
Skorzystałbym z tego sposobu Damonssona, lecz tam jest napisane, że pobieranie za pomocą javascriptu, a nie dałoby się tego jakoś za pomocą php zabrać? Postem myślałem, ale jak...

Jestem początkujący, także nie mam pomysłu jak zrobić coś takiego na sesjach, tworzyłem jedynie system do logowania, taki prymitywny.

P.S
Dzięki za odpowiedzi smile.gif

#edit
To mój kod:

  1. <form method="post">
  2. <input type="text" name="kasa">
  3. <select name="iloczyn">
  4. <?php
  5. include("polacz.php");
  6. ini_set( 'default_charset' , 'UTF-8' );
  7. mysql_query("SET NAMES 'utf8'");
  8. $query = mysql_query("SELECT * FROM servers");
  9. while ($row = mysql_fetch_array($query)) {
  10. ?>
  11. <option><?php echo $row[nazwa];?></option>
  12. <?php }?>
  13. </select>
  14. <input type="submit" value="Licz">
  15. </form>
  16. <?php
  17. $kasa = $_POST['kasa'];
  18. $iloczyn = $_POST['iloczyn'];
  19. $wynik = $kasa*$iloczyn;
  20. if($wynik) echo $kasa.'*'.$iloczyn.' = '.$wynik.'USD';
  21. ?>


W bazie danych są dwie interesujące mnie kolumny: 'nazwa' i 'przel'. 'przel' to wartość liczbowa. Chodzi mi o to, żeby w liście wyskakiwała 'nazwa', a do kalkulatora używana była wartość 'przel'.
Damonsson
  1. <option value="<?php echo $row[przel];?>"><?php echo $row[nazwa];?></option>


?
Kshyhoo
Sesje nie są trudne, wystarczy pamiętać, że każdy plik w którym mają działać, musi się zaczynać tak:
  1. <?php

A potem korzystać do woli z dobrodziejstw...
benzulli
Damonsson, niestety nie działa, próbowałem. Nie działa także, jeżeli w pętli dam <select> i input type=hidden, wtedy cała lista rozwijana się ogranicza do 1 rekordu, reszta pojawia się bez listy (ale działa, tylko do wyboru jest pierwsza opcja).

Przeczytałem co i jak z tymi sesjami, przecież to jest coś takiego jak POST, tylko nie trzeba tworzyć formularzy, a wobec tego mogę dać do sesji ten rekord bez żadnych ograniczeń.
Wielkie dzięki, Kshyhoo, pomogłeś mi otworzyć oczy na PHP z innej strony.

Zbytnio się przeliczyłem, już się cieszyłem, że wszystko działa tak jak chcę, lecz niestety...

Problem jest taki, że zamiast do każdego rekordu dopasowywać przelicznik do rekordu (przez pętlę, jest server1 i do tego przelicznik, który jest pod tym samym id), to przelicznik jest cały czas taki sam i w ogóle się nie zmienia, nie jest mobilny, jest ciągle 1 rekord z bazy, zamiast dopasowywać do konkretnego rekordu (po kolei). Próbowałem już różne opcje z tą sesją, lecz niestety cały czas stoję w miejscu (kalkulator oblicza, lecz jako przelicznik jest ciągle jeden rekord przelicznika do wszystkich rekordów nazwy serwera, a w bazie jest zupełnie inaczej).
Oto kod:

  1. <form method="post">
  2. <input type="text" name="kasa">
  3. <select>
  4. <?php
  5. include("polacz.php");
  6. ini_set( 'default_charset' , 'UTF-8' );
  7. mysql_query("SET NAMES 'utf8'");
  8. $query = mysql_query("SELECT * FROM servers");
  9. while ($row = mysql_fetch_array($query)) {
  10. ?>
  11. <option><?php echo $row[nazwa];?></option>
  12. <?php $_SESSION['przel'] = $row[przel];}?>
  13. </select>
  14. <input type="submit" value="Licz">
  15. </form>
  16. <?php
  17. $kasa = $_POST['kasa'];
  18. $iloczyn = $_SESSION['przel'];
  19. $kasa2 = str_replace ("k", "000", $kasa);
  20. $wynik = $kasa2*$iloczyn;
  21. if($wynik) echo $kasa2.'*'.$iloczyn.' = '.$wynik.'USD';
  22. ?>
Damonsson
Zacznijmy może od początku.

O co Ci chodzi i w czym masz problem? No i na cholerę Ci ta sesja?

  1. <input type="text" name="kasa" value="50" />
  2. <select name="iloczyn">
  3. <option value="100">STO</option>
  4. <option value="200">DWIESTO</option>


Wartość "STO" jest wyświetlana użytkownikowi.
Wartość "100" jest brana do obliczeń.

Czyli po wybraniu z listy opcji STO:

  1. $_POST['iloczyn'] = '100';
  2. $_POST['kasa'] = '50';
  3. $wynik = $kasa*$iloczyn; // wynik = 5000


Gdzie Twój problem?

benzulli
Robiłem tak na początku, widocznie musiałem przeoczyć coś istotnego i po prostu nie działało.
Ehh, pomyśleć, że dzisiaj siedziałem jakieś 6-7h nad tym i nie mogłem nic wskórać..., a mogło wystarczyć przepisanie kodu od nowa.

No nic, wielkie dzięki specool.gif


Problem został rozwiązany, lecz potrzebuję teraz wydobyć dwie zmienne, iloczyn do mnożenia oraz nazwę serwera, aby w pętli $wynik pojawiała się ona. Próbowałem za pomocą sesji, przy wyborze serwera wszystko gra, dopasowuje odpowiedni przelicznik, lecz kiedy przychodzi wyświetlić nazwę serwera to wtedy wybiera tylko ostatni rekord. Chcę, aby ta zmienna $serwer pokazywała wybrany wcześniej w formularzu serwer.

  1. <form method="post">
  2. <div style="font-family:sans-serif; color:#fff;">Enter amount of money you want to buy (put "cc", "k" or "kk") and choose world.</div><br />
  3. <input class="wpisz" type="text" name="kasa">
  4. <select class="wpisz2" name="iloczyn">
  5. <?php
  6. include("polacz.php");
  7. ini_set( 'default_charset' , 'UTF-8' );
  8. mysql_query("SET NAMES 'utf8'");
  9. $query = mysql_query("SELECT * FROM servers");
  10. while ($row = mysql_fetch_array($query)) { $_SESSION['serwer'] = $row[nazwa];
  11. ?>
  12. <option value="<?php echo $row[przel];?>"><?php echo $_SESSION['serwer'];?></option>
  13. <?php }?>
  14. </select>
  15. <input type="submit" value="Count!">
  16. </form>
  17. <?php
  18. $kasa = $_POST['kasa'];
  19. $serwer = $_SESSION['serwer'];
  20. $iloczyn = $_POST['iloczyn'];
  21. $kasa2 = str_replace ("k", "000", $kasa);
  22. $kasa3 = str_replace ("cc", "0000", $kasa2);
  23. $wynik = $kasa3*$iloczyn;
  24. if($wynik) {
  25. echo '<div style="padding:10px 0px 0px 10px; color:#fff; font-family: Verdana, sans-serif; font-size:13px;">For '.$kasa.' you will pay '.$wynik.''.$serwer.'$.</div>';
  26. }
  27. ?>
Turson
Cytat
Próbowałem za pomocą sesji, przy wyborze serwera wszystko gra, dopasowuje odpowiedni przelicznik, lecz kiedy przychodzi wyświetlić nazwę serwera to wtedy wybiera tylko ostatni rekord.
może ją nadpisujesz
benzulli
Tylko jak usunąć to nadpisywanie? W którym momencie ona się nadpisuje? Po wykonaniu pętli? Nie mam pojęcia jak to naprawić. Szukałem, lecz jest bardzo mało na ten temat. Na jednej stronie wyczytałem, że trzeba wstawić warunek if session is not null, tylko co to da...
Turson
Nie wiem jaki masz kod. To jedyny plik co wstawiłeś, czy coś jeszcze?

Cytat
kiedy przychodzi wyświetlić nazwę serwera to wtedy wybiera tylko ostatni rekord

co to znaczy
benzulli
Tak, to jedyny plik (oczywiście htmla nie kopiowałem). Przepraszam trochę za to zamieszanie, wiem jak to jest czytać czyjś kod jak się nie jest w temacie.


Mam formularz, a w nim wartość tekstową, która jest nieistotna i listę. Z tej listy wybieram widoczny rekord, który nazwiemy a. Natomiast w tejże liście, pod jedną opcją znajduje się drugi rekord, niewidoczny, który pobieram, a jest nim iloczyn wykorzystywany do obliczeń - czyli b. Do php przez POST pobieram element b - poprzez value="" (wcześniej <select name="iloczyn">). Budowa listy jest taka, że właśnie widać element a, a pobiera się do php element b. Wszystko grało, ale teraz chcę, żeby do php był pobierane oba elementy - b (który jest poprawnie przesyłany do tej pory) oraz element a, który do tej pory był tylko widoczny jako rekord, który nie służył do niczego, a jedynie do oznakowania iloczynu. Teraz potrzebuję pobrać dodatkowo to oznakowanie iloczynu, wobec tego użyłem sesji (podczas wyboru z listy odbierany jest właściwy iloczyn wraz z dopasowanym elementem a, lecz kiedy chcę już pobrać sesję użytą do wyboru z listy, potem ona mi się nie pokazuje jako ta wybrana, lecz jako ostatni rekord z tabeli).
Turson
Pokaż jak zapisujesz do sesji
benzulli
To jest cały jeden plik, po za nim nie ma nic więcej.

  1. <form method="post">
  2. <div style="font-family:sans-serif; color:#fff;">Enter amount of money you want to buy (put "cc", "k" or "kk") and choose world.</div><br />
  3. <input class="wpisz" type="text" name="kasa">
  4. <select class="wpisz2" name="iloczyn">
  5. <?php
  6. include("polacz.php");
  7. ini_set( 'default_charset' , 'UTF-8' );
  8. mysql_query("SET NAMES 'utf8'");
  9. $query = mysql_query("SELECT * FROM servers");
  10. while ($row = mysql_fetch_array($query)) { $_SESSION['serwer'] = $row[nazwa];
  11. ?>
  12. <option value="<?php echo $row[przel];?>"><?php echo $_SESSION['serwer'];?></option>
  13. <?php }?>
  14. </select>
  15. <input type="submit" value="Count!">
  16. </form>
  17. <?php
  18. $kasa = $_POST['kasa'];
  19. $serwer = $_SESSION['serwer'];
  20. $iloczyn = $_POST['iloczyn'];
  21. $kasa2 = str_replace ("k", "000", $kasa);
  22. $kasa3 = str_replace ("cc", "0000", $kasa2);
  23. $wynik = $kasa3*$iloczyn;
  24. if($wynik) {
  25. echo '<div style="padding:10px 0px 0px 10px; color:#fff; font-family: Verdana, sans-serif; font-size:13px;">For '.$kasa.' you will pay '.$wynik.''.$serwer.'$.</div>';
  26. }
  27. ?>


W 11 linijce znajduje się przypisanie sesji wartości z bazy danych :
  1. $_SESSION['serwer'] = $row[nazwa];



_________
  1. <option value="<?php echo $row[przel];?>"><?php echo $_SESSION['serwer'];?></option>


O tutaj $row[przel] sobie normalnie pobieram jako post i wykorzystuję dalej, lecz jeżeli chcę pobrać zmienną sesyjną 'serwer' - nie mogę jej potem użyć, bo pokazuje się ostatni rekord z bazy danych, a chodzi mi, żeby pokazywał się ten wybrany w liście.
Turson
  1. $_SESSION['serwer'] = $row[nazwa]

nadpisujesz sesję jak mówiłem wczoraj.

Jak już to:
  1. $i=0;
  2. while ($row = mysql_fetch_array($query)) {
  3. $_SESSION['serwer'][] = $row['nazwa'];
  4. echo '<option value="'.$row['przel'].'"><'.$_SESSION['serwer'][$i].'</option>';
  5. $i++;
  6. }
  7. ?>

benzulli
Teraz w ogóle nie pobiera wiadomości z bazy danych, w ogóle brak jest tych rekordów 'nazwa', tylko puste pola. Także po wykonaniu przeliczenia nie pokazuje się nazwa rekordu.
Turson
  1. echo '<option value="'.$row['przel'].'">'.$_SESSION['serwer'][$i].'</option>';


a tak w ogóle to po co do option ładować sesję jak można $row['name']
benzulli
Tak, tylko wtedy jak pobiorę $row[nazwa] do zmiennej z poza pętli?? Jak jeszcze $row[przel] za pomocą POST sobie pobiorę i mogę używać w obliczeniach, tak już $row[nazwa] jest tylko nazwą i zostaje w formularzu.
com
$row['nazwa'] jak już... no to przecież masz już zapis do sesji napisany wiec w czym jeszcze problem?
Turson
Cytat
Jak jeszcze $row[przel] za pomocą POST sobie pobiorę i mogę używać w obliczeniach, tak już $row[nazwa] jest tylko nazwą i zostaje w formularzu.

W sesji jest tak czy inaczej. Ale w option może być równie dobrze $row['nazwa']

W sesji zapisujesz wszystkie nazwy serwerów, więc jak chcesz tutaj wyszczególnić którą opcję user wybrał
  1. echo '<div style="padding:10px 0px 0px 10px; color:#fff; font-family: Verdana, sans-serif; font-size:13px;">For '.$kasa.' you will pay '.$wynik.''.$serwer.'$.</div>';


Ja bym to rozwiązał najprawdopodobniej javascriptem
benzulli
com, problem jest taki, że potem nie wyświetla mi dokonanego wyboru.

Turson, możesz powiedzieć ogólnie co trzeba zrobić? W javascripcie jestem zielony, tak więc się poduczę i jak bym miał wytyczne to już sobie (mam nadzieję) poradzę.
com
a możesz tak jaśniej?
benzulli
Mam formularz,

pole1(text) pole2(lista)

Wpisuję cyfry w pole1, z pole2 wybieram nazwę (i tam jest pobierane przez post - value - przelicznik, jest w bazie konkretny przelicznik do konkretnej nazwy) i naciskam przycisk, który przelicza mi to co wpisałem. Wynikiem tego jest pole1*pole2(wynik mnożenia). Ja chciałbym, żeby dodatkowo jeszcze z pola2 pobierała się nazwa. To, co aktualnie Turson mi pomógł wyświetla nazwę w liście (tak jak było wcześniej), lecz potem jej nie pobiera (jako konkretnego wyboru, już za pętlą, kiedy to wykonuje działania z formularza).
Turson
Po co sobie utrudniać życie wink.gif

  1. echo '<option value="'.$row['przel'].'/'.$row['nazwa'].'">'.$row['nazwa'].'</option>';


  1. $select = explode("/", $_POST['iloczyn']);
  2. $iloczyn = $select[0];
  3. $serwer = $select[1];
benzulli
Wielkie dzięki!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ile ja się z tym namęczyłem, aż szkoda słów, o matko...
Damonsson
  1. <select name="xxx">
  2. <option value='1_aaaa' >aaaa</option>
  3. <option value='2_bbbb'>bbbb</option>
  4. <option value='3_cccc'>cccc</option>


  1. $xxx = explode("_",$_POST['xxx']);
  2. $xxx1 = $xxx[0]; // 1
  3. $xxx2 = $xxx[1]; // aaaa




Jeżeli korzystasz z tego
  1. '<option value="'.$row['przel'].'">'.$_SESSION['serwer'][$i].'</option>';

do generowania swoich option, no to robisz tak:
  1. '<option value="'.$row['przel'].'_'.$_SESSION['serwer'][$i].'">'.$_SESSION['serwer'][$i].'</option>';


No i uważaj, żebyś w nazwie serwera nie miał przypadkiem "_" to wtedy musisz podmienić na jakiś inny znak, którego jesteś pewien, że nigdy nie wystąpi.


Edit: tyle czasu męczyliście gościa, a jak się wkurzyłem i postanowiłem napisać rozwiązanie, to mnie ubiegł o 2 minuty, ehhh biggrin.gif
benzulli
Damonsson, wielkie dzięki, nawet nie macie pojęcia jak się teraz z tego wszystkiego cieszę. Aż po prostu brak mi słów, przynajmniej położę się szczęśliwy spać thumbsupsmileyanim.gif yahoo.gif
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.