Dropdown list selected poszczególnego pola.

0

Witam, mam następujący problem:

	$qwe = "SELECT marka FROM samochody ";
							$result1 = mysqli_query($link, $qwe) or die ("Problemy z odczytem danych");
				
							while($row = mysqli_fetch_assoc($result1))
							{
							echo '<option>' . $row['marka'] . '</option>';
							
								}
								if ($row["marka"] == '$samochodok')
								{
									echo "selected";
								}

Ogólnie chodzi mi o to aby pobrać z bazy danych dane z tabeli "samochody" i wpisać je w liste rozwijaną. Za pomocą pętli while i fetch assoc udaje mi się wpisać wszystkie dane z bazy danych do pola rozwijanego. Problem polega na tym że chciałbym aby pole było zaznaczone na konkretnej marce która jest przypisana do danego klienta. Linijki 9-12 sam dodałem jednak skrypt totalnie to olewa. Czy pętla if jest czy nie i tak działa tylko fetch assoc. Mógłby ktoś podpowiedzieć jak to zrobić ?

3

No ale zobacz - najpierw w linii numer 6 dajesz <option> xxxx </option>, czyli zamykasz znacznik, a dopiero potem chcesz dodać do niego atrybut selected - to raczej nie ma prawa działać. Poza tym zwróć uwagę na klamry po while - najpierw pobierze i wyświetli Ci wszystkie wartości z bazy, a dopiero potem wykona sprawdzenie. Klamerki po while powodują, że w ramach tej pętli wykona się jedynie kod w liniach 5-7, natomiast sprawdzenie konkretnej marki już nie zawiera się w ramach pętli while. Jakbyś miał porządnie zrobione formatowanie kodu i wcięcia, to te bloki kodu o których piszę by były lepiej widoczne i łatwiej by było zobaczyć, co jest z czym połączone i kiedy się wykona.

Czy teraz masz pomysł, jak to naprawić? :)

3

Linijki 9-12 sam dodałem jednak skrypt totalnie to olewa.

to tak jeszcze uzupełniając poprzedni post, odniosę się do powyższego fragmentu. Nie, PHP nie ma focha na Twój kod i go nie olewa, tylko tak, jak pisałem wcześniej - najpierw pętla while pobiera wszystkie marki, a dopiero potem wykonuje sprawdzenie. Po zakończeniu pętli while podczas sprawdzenia, zmienna $row["marka"] ma wartość ostatniego pobranego samochodu. Jest więc możliwość, że sprawdzenie wykona się pozytywne, ale pod warunkiem, że akurat ostatni samochód będzie miał taką markę, jaką chcesz zaznaczyć jako aktywną. Ale i tak nie da to efektu, który chcesz uzyskać - o czym także pisałem wcześniej. Ponieważ tagi <select> domykasz każdorazowo w ramach pętli while, nie masz za bardzo możliwości dodania atrybutu selected do żadnego optiona. Jeśli akurat będziesz miał tyle szczęścia, że ostatni pobrany samochód będzie miał taką markę, jakiej szukasz, to if się wykona pozytywnie i uzyskasz coś takiego:

  <option>Volvo</option>
  <option>Saab</option>
  <option>VW</option>
  <option>Audi</option>selected
0

No właśnie niestety nie. Nie wiem czy wgle ta pętla if jest poprawnie zrobiona, można tak się odwoływać ? Zmienna $samochodok na pewno przechowuje wartość która powinna być selected.

echo '<option>' . $row['marka'] . '</option>';

Ta linijka wydaje się być kluczowa w takim układzie tylko nie mam pojęcia jak mam to zrobić ;(

2

Przeczytaj proszę moje **OBA **wcześniejsze posty - wydaje mi się, że są napisane dość prostym językiem.

Podpowiedź:
procedura powinna wyglądać tak:
**1) **pobierz dane z bazy (jeśli jeszcze coś zostało do pobrania)
2) wypisz <option
3) sprawdź, czy dana marka jest tą, której szukasz. Jeśli tak, to wypisz selected
4) wypisz > marka-z-bazy</option>
5) skocz do pkt. 1

Czy teraz rozumiesz swój błąd?

A co do fragmentu ta pętla if jest poprawnie zrobiona - nie ma czegoś takiego jak "pętla if". IF jest instrukcją warunkową, która sprawdza, czy dany warunek jest prawdziwy i w zależności od wyniku sprawdzenia, wykonuje pewną czynność. W Twoim przykładzie pętlą jest while i ten fragment kodu wykonuje się wiele razy.

1

Tak dzięki, tak to wyjasniłeś ,żę zrozumiałem gdzie jest błąd logiczny. Dalej jednak nie mam pojęcia jak zrobić te wszystkie sprawdzenia itd w pętli while. Podpowiedź podana przez cb (punkty 1-5) z tego co rozumiem muszą być zawarte między ". $row['marka'] .". Nie wiem jak do końca tutaj zedytować w tym php no ale popatrze w internetach, może coś znajde.

1

No to ostatnia podpowiedź ;)

while... {
echo...
if ...{echo  ...}
echo...}

Pokombinuj trochę i daj znać, czy się udało. Myślę, że dasz radę, ale jakbyś totalnie utknął, to postaram się bardziej pomóc. Po prostu - nie chcę dawać Ci gotowego rozwiązania, ale raczej naprowadzić - w ten sposób przynajmniej się czegoś nauczysz :)

0

Jasne, taka forma jest nawet lepsza niż gotowiec :) Wieczorem do tego siąde na spokojnie i dam znać czy mi się udało :)
Pozdrawiam

0
 while($row = mysqli_fetch_assoc($result1))
                            {
                            echo '<option>' . $row['marka'] . '</option>';
                            if ($row["marka"] == '$samochodok')
                           {
                           echo "selected";
                             }
                                }

Doszedłem do czegoś takiegoś, jednak selected nie działa :( Wydaje mi się ,że zastosowałęm się do twoich tipów jednak coś dalej nie działa.

3

@cerrato: 'wyrasta' na tym forum na guru, który ze stoickim spokojem i cierpliwością tłumaczy błędy zagubionych w kodzie :)* Chapeau bas* :)

Ze swojego skromnego doświadczenia w nauce programowania powiem tylko, że problemem nas początkujących jest nieodparta chęć lecenia z tematem do przodu mimo braków w dogłębnym zrozumieniu podstaw. A to rodzi bardzo szybko coraz więcej frustracji, i zamiast motywacji pojawia się rezygnacja.

Nie znając tego języka, a czytając tylko wyjaśnienie @cerrato wnioskuje, że problemem jest ten za wcześnie użyty znacznik i klamra zamykająca pętlę while. Dlatego if nie wykona się poprawnie, choć oczywiście wykonać się wykona.

0

@Kubs: Mógłbyś troche jaśniej ?
Który wiersz bo nie do końca rozumiem ?

1

Moze wciecia Cie zmylily
W Twoim kodzie powinny byc tak o:

    $qwe = "SELECT marka FROM samochody ";
    $result1 = mysqli_query($link, $qwe) or die("Problemy z odczytem danych");

    while ($row = mysqli_fetch_assoc($result1)) {
        echo '<option>'.$row['marka'].
        '</option>';

    }
    if ($row["marka"] == '$samochodok') {
        echo "selected";
    }

a tak zeby dzialalo

while ($row = mysqli_fetch_assoc($result1)) {
    echo '<option';

    if ($row["marka"] == '$samochodok') {
        echo " selected";
    }

    echo '>'.$row['marka'].'</option>';
}

****dbaj o poprawne wciecia w kodzie

1

W sumie to się trochę spóźniłem - Robal okazał się szybszy ;) Ale tak dla formalności wyjaśnię Ci w czym robiłeś błąd. Pocieszające jest to, że szliśmy w dobrym kierunku, więc jeszcze kilka prób i byśmy doszli razem do rozwiązania :)

Dobre jest to, że w ostatnim kodzie dałeś całość w "pierwszych" klamrach (linie 2-8), przez co całość się wykonywała za każdym przebiegiem pętli while.
Natomiast nadal nie do końca czaisz, jak działa ten if.

Ponieważ Robal/ @stivens podał rozwiązanie, więc najprościej będzie, jak na jego podstawie wyjaśnię, jak to działa.

  • linia 1 jest pętlą, która pobiera "porcję" danych, a następnie się wykonuje kod zawarty w klamrach (linie 2-9). W chwili, w której zostaną pobrane wszystkie wartości z bazy, pętla while się zakończy, a program będzie się dalej wykonywać od linii 12.
  • linia 2 wypisuje <option - za każdym razem tak trzeba zacząć wypisywanie nowej pozycji, niezależnie czy będzie ona selected czy nie. Początek każdego elementu listy samochodów jest taki sam
  • linie 4-6 wykonują sprawdzenie, czy obecna marka jest tą, której szukasz. Zauważ, że nadal jesteśmy "wewnątrz" elementu <option - jeśli mamy dodać informację o tym, że dana pozycja jest zaznaczona/aktywna, to musimy to zrobić wewnątrz tego tagu. I tutaj był Twój błąd - chciałeś robić sprawdzenie po zamknięciu tagu, przez co wygenerowany przez Ciebie kod HTML byłby błędny. Poprawna postać to <option selected>XXX</option>, natomiast to, co byłeś w stanie uzyskać wcześniej miałoby postać <option>XXX</option>selected. Czy teraz rozumiesz o co chodzi i dlaczego Twój if był w nieodpowiednim miejscu?
  • linia 8: tutaj zamykamy tag <option> (zamknięcie wygląda tak samo, niezależnie od tego, czy tag posiada atrybut selected), następnie wypisujemy markę auta, a na końcu wstawiamy tag zamykający </option>.

Czy teraz wszystko jest jasne, czy jeszcze chciałbyś, żeby coś Ci wyjaśnić?

0

Dziękuje Panowie za pomoc.
@cerrato Zrozumiałem teraz po twoim wyczerpującym wyjaśnieniu :)

dzięki raz jeszcze i przepraszam za problemy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1