konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Witam!

Od jakiegoś czasu siłuję się z przesłaniem wszystkich pól checkbox do bazy danych sql.

echo "</br>";
echo $rek['nazwa']. "<input type=checkbox name=";
echo "opcje[] value=";
echo $rek['nazwa']. ">";
echo $rek['cena'].".00 PLN";

wyżej podałem kod, który wyświetla opcje z bazy

if (!empty($_POST[opcje])) {
foreach ($_POST[opcje] as $pozycja) {
echo "zaznaczyłeś: $pozycja<br/>";
}
}

a ten je odbiera. Problem polega na tym, że gdy zaznaczam 2 pola to w bazie zapisuje mi value ostatniego zaznaczonego pola.

Czy mógłby mi ktoś pomóc?
Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Marcin Chałko:

Czy mógłby mi ktoś pomóc?

W requeście (ojej, ale słowo ;)) od przeglądarki (bez względu czy jest to get czy post) pola od zaznaczonych checkboxów są (ich nazwy to klucze) i mają zawsze wartość 'on', zaś pól od niezaznaczonych checkboxów nie ma wcale.

To jest ogólne stwierdzenie, a Tobie będzie można więcej pomóc jak podasz więcej kodu. I sugeruję używać znaczników od wklejania kodu, wtedy nie znikają spacje i kod jest czytelniejszy.

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Hmm.. Czyli tak:

To jest pełen formularz do wysłania:

 <form enctype="multipart/form-data" action="" method="post">

<fieldset>

Transfer: <br></br>
Ilość pasażerów: <input size="2" type="text" name="ilosc_pasazerow" /><br /><br />

<?php

// odbieramy dane z formularza

$typ_auta = trim($_GET['typ_auta']);

echo 'Opcje wyposazenia:</br>';

// parametry serwera
$serwer = "mysql.cba.pl"; // nazwa serwera mysql
$login = "marcin142"; // login do bazy
$haslo = "marcin142"; // haslo do bazy
$baza = "chm_cba_pl"; // nazwa bazy
$tabela = "tb_opcje_wyposazenia"; // nazwa tabeli

if ($typ_auta)
{

// łączymy się z bazą danych
if (mysql_connect($serwer, $login, $haslo) and mysql_select_db($baza)) {

// zapytanie do bazy danych
$wynik = mysql_query("SELECT * FROM tb_opcje_wyposazenia WHERE typ_auta LIKE '$typ_auta'")
or die("Błąd w zapytaniu!");

mysql_close();
}
else echo "Nie mogę połączyć się z bazą danych!";

// wyświetlany wyniki zapytania
while($rek = mysql_fetch_array($wynik))



{



echo "</br>";
echo $rek['nazwa']. "<input type=checkbox name=";
echo "opcje[] value=";
echo $rek['nazwa']. ">";
echo $rek['cena'].".00 PLN";

}

}

?>

<fieldset>

</br></br><input value="Dalej" type="submit"></form>


a to skrypt odbierający go również pełen:

<?php

$ilosc_pasazerow = $_POST['ilosc_pasazerow'];
$id = trim($_GET['id']);

if($id and $ilosc_pasazerow and count($_POST)) {

// parametry serwera
$serwer = "mysql.cba.pl"; // nazwa serwera mysql
$login = "marcin142"; // login do bazy
$haslo = "marcin142"; // haslo do bazy
$baza = "chm_cba_pl"; // nazwa bazy
$tabela = "tb_rezerwacje"; // nazwa tabeli

// łączymy się z bazą danych
$connection = @mysql_connect('mysql.cba.pl', 'marcin142', 'marcin142')
or die('Brak połączenia z serwerem MySQL');
$db = @mysql_select_db('chm_cba_pl', $connection)
or die('Nie mogę połączyć się z bazą danych');

if (!empty($_POST[opcje])) {
foreach ($_POST[opcje] as $pozycja) {
echo "zaznaczyłeś: $pozycja<br/>";
}
}

// dodajemy rekord do bazy
$ins = @mysql_query("UPDATE tb_rezerwacje SET ilosc_pasazerow='$ilosc_pasazerow' , opcje_wyposazenia='$pozycja' WHERE id='$id' ");

// ID dodanego rekordu
$id = mysql_insert_id();

if($ins) echo "Rekord został dodany poprawnie!";
else echo "Błąd nie udało się dodać nowego rekordu";

mysql_close($connection);
}

?>


Pierwszy raz korzystam ze znaczników od wklejania kodu także mam nadzieję, że nie wywali kodu na wierzch:)

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Chyba się udało:)

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Masz babole w kodzie który podałeś, powinno być tak:

echo $rek['nazwa'].'<input type="checkbox" name="opcje[]" value="'.$rek['nazwa'].'" /> '.$rek['cena'].'.00PLN';


Wtedy przejdzie.
Brak cudzysłowów przy atrybutach może powodować, że nie przyjmuje do wiadomości że "opcje" jest wielokrotnym polem.Michał Wachowski edytował(a) ten post dnia 15.12.10 o godzinie 22:47

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

No niestety cudzysłowy przy atrybutach nie pomogły. Nadal wyświetla w bazie tylko ostatnie pole formularza...

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Gratuluję pomysłu podania tutaj wszystkich danych do bazy. Mam nadzieję że albo są fake albo już je zmieniłeś :).

Skoro robisz tak


foreach ($_POST[opcje] as $pozycja) {
echo "zaznaczyłeś: $pozycja<br/>";
}


to jasne jest że w foreach nadpisujesz sobie ciągle $pozycja , a skoro niżej
masz


$ins = @mysql_query("UPDATE tb_rezerwacje SET ilosc_pasazerow='$ilosc_pasazerow' , opcje_wyposazenia='$pozycja' WHERE id='$id' ");


to nie możesz się spodziewać że zadziała inaczej niż wykonanie w SQL $pozycja z ostatniej iteracji w foreach.

Spróbuj zrobić implode na $_POST[opcje].

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Pozwól, że pominę wątpliwą jakość kodu, definicje nieużytych później nigdy zmiennych czy kwestię spaghetti. Skupmy się tylko na:


if (!empty($_POST[opcje])) {
foreach ($_POST[opcje] as $pozycja) {
echo "zaznaczyłeś: $pozycja<br/>";
}
}
// dodajemy rekord do bazy
$ins = @mysql_query("UPDATE tb_rezerwacje SET ilosc_pasazerow='$ilosc_pasazerow' , opcje_wyposazenia='$pozycja' WHERE id='$id' ");


Zmienna pozycja zawiera w tym miejscu value ostatniego checkboksa, nie ma w tym nic dziwnego :). W foreach masz przecież jej nadpisywanie. Btw. ten komentarz jest błędny, UPDATE nie dodaje, a aktualizuje rekord, więc pisząc "dodajemy rekord do bazy" chyba zrobiłeś literówkę? Druga sprawa, to naturalnie nie są prawdziwe dane dostępowe do db?Marek Glijer edytował(a) ten post dnia 15.12.10 o godzinie 23:03

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Nie nie są..

Słuchaj a masz jakiś inny pomysł na zastąpienie foreach?

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Marcin Chałko:
Nie nie są..

Słuchaj a masz jakiś inny pomysł na zastąpienie foreach?

Nie trzeba zastępować foreach.
Zamiast do zapytania wstawiać zmienną, która zawiera ostatnią opcję z tablicy, można użyć http://php.net/implode na zmiennej zawierającej tablicę (patrz 2 posty wyżej na wypowiedź Adama, który pisał to mniej więcej w tym samym czasie co ja). Albo lepiej - przechowaj ją w postaci serializowanej. http://php.net/serializeMarek Glijer edytował(a) ten post dnia 15.12.10 o godzinie 23:26

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Okej zaraz spróbuję. A moglibyście mi wyjaśnić dlaczego zmienna $pozycja w php na stronie wyświetla się mi poprawnie a do bazy sql przesyłane jest tylko jedno pole?

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Marcin Chałko:
Okej zaraz spróbuję. A moglibyście mi wyjaśnić dlaczego zmienna $pozycja w php na stronie wyświetla się mi poprawnie a do bazy sql przesyłane jest tylko jedno pole?
Bo wyświetlasz ją nie 1, a n razy, gdzie n jest liczbą elementów tablicy $_POST[opcje]. To zwykła iteracja. Spróbuj wewnątrz foreach wyświetlić jakikolwiek tekst - efekt będzie taki sam, wyświetli Ci go tyle razy ile elementów tablicy.Marek Glijer edytował(a) ten post dnia 15.12.10 o godzinie 23:32
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

IMO bug php'a, powinno wywalić wyjątek podczas użycia takiej zmiennej 'lokalnej' - definiowanie w klamerkach, (tutaj foreach) a używanej już poza nimi.
Adam Piotrowski:
Gratuluję pomysłu podania tutaj wszystkich danych do bazy. Mam nadzieję że albo są fake albo już je zmieniłeś :).

Skoro robisz tak


foreach ($_POST[opcje] as $pozycja) {
echo "zaznaczyłeś: $pozycja<br/>";
}


to jasne jest że w foreach nadpisujesz sobie ciągle $pozycja , a skoro niżej
masz


$ins = @mysql_query("UPDATE tb_rezerwacje SET ilosc_pasazerow='$ilosc_pasazerow' , opcje_wyposazenia='$pozycja' WHERE id='$id' ");


to nie możesz się spodziewać że zadziała inaczej niż wykonanie w SQL $pozycja z ostatniej iteracji w foreach.

Spróbuj zrobić implode na $_POST[opcje].

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Artur Świerc:
> IMO bug php'a, powinno wywalić wyjątek podczas użycia takiej 	
zmiennej 'lokalnej' - definiowanie w klamerkach, (tutaj foreach) a używanej już poza nimi.

Mądre słowa :) Tylko jestem dopiero raczkującym małym człowieczkiem jeśli chodzi o php. Arturze a czy mógłbyś napisać coś więcej na ten temat?
Jakub L.

Jakub L. Programista

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Niby dlaczego tam miałby lecieć wyjątek?

Zmiennych w PHP się nie deklaruje explicite, jakby były deklaracje, to to byłby błąd składni, a tak to zaskocz a nie bug.

Z tego http://php.net/manual/en/language.variables.scope.php wygląda że scopem nie jest blok oznaczony {} ale dopiero funkcje deklarują zmienne lokalne.

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql



$all_num = count($_POST['opcje']);

if(is_array($_POST['opcje']))

{

$i=1;

foreach($_POST['opcje'] as $value)

{

$water .= $value;

if($i<$all_num)

{

$water .=", ";

}

++$i;
}
}


Znalazłem już kod, który mnie interesował. Po drobnych przeróbkach śmiga:) Dla formalności zmienna $water pzesyła mi wszystkie zaznaczone rekordy!

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Marcin Chałko:


$all_num = count($_POST['opcje']);

if(is_array($_POST['opcje']))

{

$i=1;

foreach($_POST['opcje'] as $value)

{

$water .= $value;

if($i<$all_num)
>
{

$water .=", ";

}

++$i;
}
}


Znalazłem już kod, który mnie interesował. Po drobnych przeróbkach śmiga:) Dla formalności zmienna $water pzesyła mi wszystkie zaznaczone rekordy!

? Jeśli chcesz uzyskać stringa z wszystkimi opcjami, oddzielonymi przecinkami - użyj implode() (cytuję za manualem):

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone

Jedna linijka. Generalnie to nie jest dobry pomysł, żeby zaznaczone opcje wrzucać do pola w bazie jako string (pisałem o tym wcześniej). Ale skoro tak wolisz to zamień ten gigantycznie długi kod na 1 linijkę.

konto usunięte

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Próbowałem tym kodem, ale w bazie tak jak i wyniki na stronie w echo nie wyświetlał mi pól checkbox tylko "Array".
Jakub L.

Jakub L. Programista

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Zrób sobie tak:
// dodajemy rekord do bazy
$sql = "UPDATE tb_rezerwacje SET ilosc_pasazerow='$ilosc_pasazerow' , opcje_wyposazenia='$pozycja' WHERE id='$id'";
echo $sql . '<br />';
$ins = @mysql_query($sql);

I zobaczysz co jest wstawiane do bazy.
Jak wiesz co powinno być, to będzeisz wiedział jak to możesz osiągnąć.

I wstawianie do bazy czegoś co będzie trzeba potem przetwarzać to zazwyczaj słaby pomysł.
Robert Nodzewski

Robert Nodzewski Tworzenie serwisów
www oraz paneli do
zarządzania/raporto.
..

Temat: Problem z przesłaniem kliku pól checkbox do pola bazy sql

Adam Piotrowski:
Gratuluję pomysłu podania tutaj wszystkich danych do bazy. Mam nadzieję że albo są fake albo już je zmieniłeś :).

O zgrozo dane są prawdziwe i spokojnie można się zalogować... nie żebym się logował ;)

@Marcin to bardzo nieroztropne z Twojej strony podawać publicznie dane do swojej bazy. Powodów chyba nie muszę podawać.

Co do samego sposobu zapisu: to jak już wspomniano jest to również beznadziejny pomysł w przypadku, gdy będziesz miał zamiar te dane przetwarzać. Napisz może co to są za dane, co będziesz z nimi robił, a pomożemy ci znaleźć inne, lepsze rozwiązanie :)Robert Nodzewski edytował(a) ten post dnia 17.12.10 o godzinie 08:41

Następna dyskusja:

CakePHP - Problem z dodawan...




Wyślij zaproszenie do