• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

$_POST i select

Object Storage Arubacloud
+1 głos
293 wizyt
pytanie zadane 19 grudnia 2020 w PHP przez MarKor Nowicjusz (180 p.)

Hejka

 

Mam problem takiego typu, że chcę wypisać na stronie waluty z danego kontynentu poprzez wybranie odpowiedniej opcji w selekcie i nie wiem w jaki sposób to przekazać aby dobrze się to odczytało. Przy wartości domyślnej ("wszystkie") wszystko wyświetla się poprawnie, lecz przy wyborze jakiegokolwiek kontynentu wyskakuje błąd.

 <form method="post">
                                <select name="wybor_kontynentu">
                                    <?php
                                    echo '<option value="wszystkie">Wszystkie</option>';
                                    $rezultat = $polaczenie->query("SELECT DISTINCT kontynent FROM waluta");
                                    while ($row = mysqli_fetch_assoc($rezultat)) {
                                        echo '<option value="' . $row['kontynent'] . '">';
                                        if ($row['kontynent'] == "AM_N") {
                                            echo 'Ameryka Północna';
                                        } elseif ($row['kontynent'] == "AM_S") {
                                            echo 'Ameryka Południowa';
                                        } elseif ($row['kontynent'] == "EUROPA") {
                                            echo 'Europa';
                                        } elseif ($row['kontynent'] == "AZJA") {
                                            echo 'Azja';
                                        } elseif ($row['kontynent'] == "OCEANIA") {
                                            echo 'Oceania';
                                        } elseif ($row['kontynent'] == "AFRYKA") {
                                            echo 'Afryka';
                                        }
                                        echo '</option>';
                                    }
                                    ?>
                                </select>
                                <input type="submit" name="refresh" value="Odśwież"/>
                            </form>

 

No i miejsce wypisywania w tabeli:

if (isset($_POST['refresh'])) {
                        $value = $_POST['wybor_kontynentu'];
                        if ($value == "wszystkie") {
                            $rezultat = $polaczenie->query("SELECT * FROM waluta");
                        } else {
                            $rezultat = $polaczenie->query("SELECT * FROM waluta WHERE KONTYNENT=".$value);
                            echo var_dump($rezultat);
                            echo '</br>';
                            echo var_dump($value);
                        }
                        
                        if (!$rezultat) {
                            throw new Exception($polaczenie->error);
                        } else {

                        // wypisywanie whilem tabeli

                        }
}

a na stronie wyskakuje mi taki błąd:

bool(false)
string(4) "AM_N"
Fatal error: Uncaught Exception: Unknown column 'AM_N' in 'where clause' in C:\xampp\htdocs\Projektowanie-Aplikacji-Internetowych\waluty.php:88 Stack trace: #0 {main} thrown in C:\xampp\htdocs\Projektowanie-Aplikacji-Internetowych\waluty.php on line 88

A linia 88 to wyrzucenie błędu:

throw new Exception($polaczenie->error);

A jak w bazie dałem zapytanie:

SELECT * FROM waluta WHERE kontynent= 'AM_N'

wszystko gładko poszło :(

komentarz 19 grudnia 2020 przez MarKor Nowicjusz (180 p.)

W drugiej części kodu powinno być: 

$rezultat = $polaczenie->query("SELECT * FROM waluta WHERE KONTYNENT='$value'");

Temat do zamknięcia :)

1
komentarz 20 grudnia 2020 przez Anedroid Obywatel (1,530 p.)

@MarKor,
Twój kod jest mało czytelny przez to, że mieszasz html z php. Dane i strukturę powinno się rozdzielić. Jeżeli chcesz umieścić html i php w jednym pliku, najpierw wykonaj wszystkie obliczenia i zapisz do zmiennych, a potem je używaj w kodzie. Dzięki temu kod będzie czytelniejszy, a prócz tego unikniesz wielu różnych problemów z ogarnianiem swojego kodu.

Przy okazji, jeżeli tworzysz dynamiczny select, polecam zainteresować się Smarty (html_options). smiley

1
komentarz 20 grudnia 2020 przez Anedroid Obywatel (1,530 p.)
<?php
// ...
$rezultat = polaczenie->query("SELECT DISTINCT kontynent FROM waluta");
$kontynenty = [
    'AM_N' => 'Ameryka Północna',
    'AM_S' => 'Ameryka Południowa',
    'EUROPA' => 'Europa',
    'AZJA' => 'Azja',
    'OCEANIA' => 'Oceania',
    'AFRYKA' => 'Afryka'
];
$rows = [];
while($row = mysqli_fetch_assoc($rezultat)) {
    array_push($rows, $row['kontynent']);
}
?>
<form method="post">
    <select name="wybor_kontynentu">
        <option value="wszystkie">Wszystkie</option>
        <?php foreach($row as $value) echo '<option value="$value">'.$kontynenty[$value].'</option>'; ?>
    </select>
    <input type="submit" name="refresh" value="Odśwież"/>
</form>

 

1
komentarz 21 grudnia 2020 przez VBService Ekspert (253,340 p.)
edycja 21 grudnia 2020 przez VBService

Ten kod można jeszcze "usprawnić": wink

  • Usuwamy jedną pętle  foreach($row as $value) 
  • i "wywoływanie" echo przy każdej iteracji. 
  • dodawanie do tablicy  array_push($rows, $row['kontynent']) 
 // . . .  
 $rezultat = polaczenie->query("SELECT DISTINCT kontynent FROM waluta");

 $kontynenty = [
    'AM_N' => 'Ameryka Północna',
    'AM_S' => 'Ameryka Południowa',
    'EUROPA' => 'Europa',
    'AZJA' => 'Azja',
    'OCEANIA' => 'Oceania',
    'AFRYKA' => 'Afryka'
 ];

 $options = '';
 while($row = mysqli_fetch_assoc($rezultat)) {
     $options .= "<option value=\"{$row['kontynent']}\">{$kontynenty[$row['kontynent']]}</option>".PHP_EOL;
 }
?>
<form method="post">
    <select name="wybor_kontynentu">
        <option value="wszystkie">Wszystkie</option>
        <?php echo $options; ?>
    </select>
    <input type="submit" name="refresh" value="Odśwież"/>
</form>

 

1 odpowiedź

+2 głosów
odpowiedź 19 grudnia 2020 przez Comandeer Guru (601,490 p.)

Polecam poczytać o prepared statements. One z automatu by pozwalały uniknąć takich błędów, a przy okazji chronią przed atakami SQL injection.

Podobne pytania

+1 głos
0 odpowiedzi 113 wizyt
0 głosów
0 odpowiedzi 260 wizyt
pytanie zadane 13 stycznia 2019 w PHP przez Metarinda Użytkownik (740 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...