Wysłanie wielu wartości w jednym polu formularza HTML

0

Hej,

Tworzę formularz do rejestracji użytkowników.
Jedną z opcji jest wybór hobby, ma być możliwość wyboru kilku hobby i zapisu ich do bazy danych.
Niestety zapisuje mi się tylko ostatni wybór.

Potrzebuję pomocy aby dodać możliwość zapisu kilku hobby do bazy.

A oto fragment kodu:

Zainteresowania
         <p></p>
         <input type="checkbox" name="interest" value="sport" checked/> Sport
         <p></p>
         <input type="checkbox" name="interest" value="kino" /> Kino
         <p></p>
         <input type="checkbox" name="interest" value="zakupy" /> Zakupy
         <p></p>
         <input type="checkbox" name="interest" value="ksiazki" /> Książki
         <p></p>
         <input type="checkbox" name="interest" value="rodzina" /> Rodzina
 <?php
     require('db.php');
     if (isset($_REQUEST['username'])) {
         $username = stripslashes($_REQUEST['username']);
         //escapes special characters in a string
         $username = mysqli_real_escape_string($con, $username);
         $email    = stripslashes($_REQUEST['email']);
         $email    = mysqli_real_escape_string($con, $email);
         $password = stripslashes($_REQUEST['password']);
         $password = mysqli_real_escape_string($con, $password);
         $name = stripslashes($_REQUEST['name']);
         $name = mysqli_real_escape_string($con, $name);
         $surename = stripslashes($_REQUEST['surename']);
         $surename = mysqli_real_escape_string($con, $surename);
         $address = stripslashes($_REQUEST['address']);
         $address = mysqli_real_escape_string($con, $address);
         $school = stripslashes($_REQUEST['school']);
         $school = mysqli_real_escape_string($con, $school);
         $interest = stripslashes($_REQUEST['interest']);
         $interest = mysqli_real_escape_string($con, $interest);
         $create_datetime = date("Y-m-d H:i:s");
         $query    = "INSERT into `users` (username, password, email, create_datetime, name, surename, address, school, interest)
                      VALUES ('$username', '" . md5($password) . "', '$email', '$create_datetime', '$name', '$surename', '$address', '$school', '$interest')";
         $result   = mysqli_query($con, $query);
2

Wysyłasz wszystkie dane jako jedno pole,

<input type="checkbox" name="interest" value="sport" checked/> Sport
<input type="checkbox" name="interest" value="kino" /> Kino
<input type="checkbox" name="interest" value="zakupy" /> Zakupy
<input type="checkbox" name="interest" value="ksiazki" /> Książki
<input type="checkbox" name="interest" value="rodzina" /> Rodzina

Więc jak wyślesz taki formularz, nie ważne jaką metodą, czy POST czy GET, to w requeście zobaczysz coś takiego:

?interest=sport&interest=ksiazki

Więc jak odczytasz sobie takie pole, to większość bibliotek odczyta tylko jedną z nich.

Odpowiedź na Twoje pytanie jest bardzo prosta, albo wyślij każdy checkbox w innym polu, albo posłuż się tzw. notacją tablicy w requestach, interest[].

0

Poprawiłem w ten sposób:

         Zainteresowania
         <p></p>
         <input type="checkbox" name="interest[]" value="sport" checked/> Sport
         <p></p>
         <input type="checkbox" name="interest[]" value="kino" /> Kino
         <p></p>
         <input type="checkbox" name="interest[]" value="zakupy" /> Zakupy
         <p></p>
         <input type="checkbox" name="interest[]" value="ksiazki" /> Książki
         <p></p>
         <input type="checkbox" name="interest[]" value="rodzina" /> Rodzina

Lecz po wypełnieniu formularza na stronie mam taki błąd:

Fatal error: Uncaught TypeError: stripslashes(): Argument #1 ($string) must be of type string, array given in C:\xampp\htdocs\Projekt_1\registration.php:29 Stack trace: #0 C:\xampp\htdocs\Projekt_1\registration.php(29): stripslashes(Array) #1 {main} thrown in C:\xampp\htdocs\Projekt_1\registration.php on line 29

To jest moja 29 linia:

$interest = stripslashes($_REQUEST['interest']);
1
xomaba napisał(a):

Fatal error: Uncaught TypeError: stripslashes(): Argument #1 ($string) must be of type string, array given in C:\xampp\htdocs\Projekt_1\registration.php:29 Stack trace: #0 C:\xampp\htdocs\Projekt_1\registration.php(29): stripslashes(Array) #1 {main} thrown in C:\xampp\htdocs\Projekt_1\registration.php on line 29

Naucz się czytać ze zrozumieniem, masz napisane TypeError: stripslashes(): Argument #1 ($string) must be of type string, array given.

Po polsku:

  • TypeError błąd typu
  • stripslashes(): w funkcji stripslashes()
  • Argument #1 (string) pierwszy argument typu string
  • must be of type string, array given musi być typu string, przekazano array, czyli tablicę.

To jest moja 29 linia:

    $interest = stripslashes($_REQUEST['interest']);

No, to jest dokładnie to miejsce. Argument #1 ($string) must be of type string, array given - pierwszy argument musi być string, a przekazano array. Łatwo się domyślić więc, że $_REQUEST['interest'] to jest array, bo przekazałeś listę zainteresowań. Jak zrobisz var_dump($_REQUEST['interest']) to zobaczysz. Nie możesz więc tak po prostu wywołać stripSlashes() na tej zmiennej.

Ale pomijając już ten problem, to masz dwa, dużo gorsze błędy.

  • Po pierwsze, dlaczego w ogóle chcesz używać funkcji stripSlashes() do budowania zapytania MySQL? Nigdy rób tego nigdy, nic dobrego z tego wyjść nie może, a tylko sobie narobisz problemów, usuń ją. Jeśli chcesz kiedykolwiek łączyć plain text z SQL'em to użyj mysqli_real_escape_string().
  • Po drugie, przekazujesz interest[], czyli listę; a w tabeli z tego co widzę masz pojedyncze pole interest. Musiałbyś z tego albo zrobić relację jeden-do-wielu, albo je połączyć jakoś po przecinku (zakładając że w zainteresowaniach nie będzie przecinka).
1

Nie wiem czy to jest projekt do ćwiczeń programowania czy powstanie z tego jakiś serwis, ale powinieneś od razu się nauczyć, że:

  • przechowywanie haseł w md5 nie jest bezpieczne. A w twoim przypadku nie jest nawet użyta sól (salt). Będzie to podatne na atak przy użyciu tęczowych tablic: https://pl.wikipedia.org/wiki/T%C4%99czowe_tablice. Zainteresuj się funkcją password_hash (link).

  • użycie:

$password = stripslashes($_REQUEST['password']);
$password = mysqli_real_escape_string($con, $password);

nie ma sensu, bo potem ze zmiennej $password robisz skrót hash przy użyciu md5($password) a z tego zawsze wychodzą 32 znaki z zakresu a-f oraz 0-9 i tego nawet nie trzeba escape'ować.

Zalecam również zainteresowanie się w MySQL zapytaniami Prepared Statements (link), dzięki czemu unikniesz atakom wstrzykiwania kodu (SQL Injection).

0
xomaba napisał(a):

Poprawiłem w ten sposób:

         Zainteresowania
         <p></p>
         <input type="checkbox" name="interest[]" value="sport" checked/> Sport

Dodanie tego jako interest[] spowoduje że w $_POST['interest'] będziesz miał tablicę - wystarczy po niej iterować np. przez foreach i masz wybrane checkboxami wartości.

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