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

Nie mogę przesłać checkboxów do bazy danych w PHP

Object Storage Arubacloud
0 głosów
305 wizyt
pytanie zadane 4 kwietnia 2022 w PHP przez XxThorusxX Użytkownik (500 p.)

Czołem. Usiłuję przesłać wartości checkboxów z formularza HTML przez PHP do bazy danych (dokładniej do jednego pola w bazie). Mam napisany skrypt, ale coś nie działa, wywala mi taki błąd " Uncaught mysqli_sql_exception: Unknown column in field list". Zarzucę niżej kod z checkboxami i php, prosiłbym o pomoc :)

 

<input type="checkbox" name="lang[]" id="eng" value = "Angielski">
                    &nbsp;
                    <span id="eng">Angielski</span>
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="checkbox" name="lang[]" id="spain" value="Hiszpański">
                    &nbsp;
                    <span id="spain">Hiszpański</span>
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="checkbox" name="lang[]" id="deutsch" value="Niemiecki">
                    &nbsp;
                    <span id="deutsch">Niemiecki</span>

 

I jeszcze kod PHP:

 

<?php
    if(isset($_POST['submit']))
    {
        require_once("connect.php");
        $connect = mysqli_connect($host, $user, $password, $db) or die("Nie udało się połączyć z bazą danych.");
    
        $name = $_POST['imie'];
        $surname = $_POST['nazwisko'];
        $age = $_POST['wiek'];
        $email = $_POST['email'];
        $sex = $_POST['plec'];
    
        $langs = $_POST['lang'];
        $lng = "";
    
        foreach($langs as $languages)
        {
            $lng .= $languages . ", ";
        }

        $result = mysqli_query($connect, "INSERT INTO `uzytkownicy`(`Imię`, `Nazwisko`, `Wiek`, `E-mail`, `Płeć`, `Języki`) VALUES (`$name`, `$surname`, `$age`, `$email`, `$sex`, `$langs`);");
    }

?>

Z góry dzięki za pomoc :D

komentarz 4 kwietnia 2022 przez VBService Ekspert (253,300 p.)

BTW, dwa elementy (i więcej) na stronie nie mogą posiadać tego samego id

<input type="checkbox" name="lang[]" id="eng" value = "Angielski">

                    &nbsp;

                    <span id="eng">Angielski</span>

komentarz 4 kwietnia 2022 przez XxThorusxX Użytkownik (500 p.)
Dzięki, już poprawiam
komentarz 4 kwietnia 2022 przez VBService Ekspert (253,300 p.)

Pewnie chodziło Tobie o np. taki zapis, używaj css-a, zamiast &nbsp;  wink

<style>
  label { 
    margin-left: 0.5em;
    margin-right: 1.2em;
  }
</style>

<form action="x.php" method="post">

  <input type="checkbox" name="lang[]" id="eng" value="Angielski">
  <label for="eng">Angielski</label>
  <input type="checkbox" name="lang[]" id="spain" value="Hiszpański">
  <label for="spain">Hiszpański</label>
  <input type="checkbox" name="lang[]" id="deutsch" value="Niemiecki">
  <label for="deutsch">Niemiecki</label>

  <input type="submit" name="submit" value="Lorem">
</form>

 

1 odpowiedź

0 głosów
odpowiedź 4 kwietnia 2022 przez VBService Ekspert (253,300 p.)
edycja 4 kwietnia 2022 przez VBService

Użyłeś backtick-ów ` przy przekazywaniu wartość ze zmiennych do zapytania sql.

zapisz np. tak:

($connect, "INSERT INTO `uzytkownicy`(`Imię`, `Nazwisko`, `Wiek`, `E-mail`, `Płeć`, `Języki`) 
            VALUES ('$name', '$surname', '$age', '$email', '$sex', '$langs')");

Druga sprawa użyłeś zmiennej: $langs, która w tym kontekście jest tablicą, a potrzebujemy string-a, czyli Twój $lng.

 

proponuję zamienić to:

        $langs = $_POST['lang'];
        $lng = "";
     
        foreach($langs as $languages)
        {
            $lng .= $languages . ", ";
        }

na

$langs = implode(',', ($_POST['lang'] ?? []));

wtedy w zapytaniu pozostaje zmienna $langs, ponieważ po użyciu implode przyjmuje wartość typu string.

($connect, "INSERT INTO `uzytkownicy`(`Imię`, `Nazwisko`, `Wiek`, `E-mail`, `Płeć`, `Języki`) 
            VALUES ('$name', '$surname', '$age', '$email', '$sex', '$langs')");

 

Proponuje najpierw sprawdzić, czy wszystkie wymagane zmienne posiadają jakąś wartość (lub przeprowadzić pełną walidację danych z formularza) i dopiero wtedy nawiązywać połączenie z bazą danych.

przykład

<?php
    if ($_SERVER["REQUEST_METHOD"] == 'POST') // (isset($_POST['submit']))
    {
        $name = $_POST['imie'] ?? null;
        $surname = $_POST['nazwisko'] ?? null;
        $age = $_POST['wiek'] ?? null;
        $email = $_POST['email'] ?? null;
        $sex = $_POST['plec'] ?? null;

        $langs = implode(',', ($_POST['lang'] ?? []));
        //var_dump($langs);

        if ($name && $surname && $age && $email && $sex)
        {
            require_once("connect.php");
            $connect = mysqli_connect($host, $user, $password, $db) or die("Nie udało się połączyć z bazą danych.");
 
            $result = mysqli_query($connect, "INSERT INTO `uzytkownicy`(`Imię`, `Nazwisko`, `Wiek`, `E-mail`, `Płeć`, `Języki`) VALUES ('$name', '$surname', '$age', '$email', '$sex', '$langs')");
        }
    } 
?>

 

w powyższym przykładzie $lang może przyjąć wartość "pustą" (null string), bo użytkownik może nie zaznaczyć żadnego z checkbox-ów, dlatego nie jest sprawdzana (może być "pusta") (zgaduję, że reszta zmiennych musi posiadać jakąś wartość).

if ($name && $surname && $age && $email && $sex)
{
    ...
}

 

Ewentualnie gdy w bazie danych masz w tabeli `uzytkownicy` kolumnę `Języki` ustawioną na NOT NULL

        $langs = (! empty($_POST['lang'] ?? null)) ? implode(',', ($_POST['lang'])) : 'brak danych';
        //var_dump($langs);

        if ($name && $surname && $age && $email && $sex && $langs)
        {
            ...
        }

 

What does double question mark (??) operator mean in PHP? ]

1
komentarz 4 kwietnia 2022 przez XxThorusxX Użytkownik (500 p.)
Udało się to ogarnąć. Przyznam szczerze, że pierwszy raz próbowałem działać na checkboxach (zazwyczaj leciałem po zwykłych polach tekstowych) i stąd trochę mała wiedza o tym. W każdym razie dzięki za pomoc, zadziałało to, co doradziłeś wyżej. Muszę się trochę dokształcić hah ^^

Dzięki jeszcze raz, miłego dzionka/wieczoru :)

Podobne pytania

+1 głos
1 odpowiedź 462 wizyt
0 głosów
1 odpowiedź 299 wizyt
pytanie zadane 16 sierpnia 2022 w PHP przez Doge Gaduła (3,370 p.)
0 głosów
1 odpowiedź 505 wizyt

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 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!

...