Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Aktualizowanie kilku checkboxów poprzez foreach
Forum PHP.pl > Forum > Przedszkole
casperii
Witam panowie, mam kod , który ma za zadanie po array_key_exsist polecieć foreachem wszystkie zaznaczone checkboxy i jeżeli w bazie mam 1 to robi 0 , jeżeli mam 0 to robi 1.

  1. $odbieram = $_POST['plik'];
  2. if(isset($odbieram)){
  3. foreach ($odbieram as $cos=>$value){
  4. $sprawdz = mysql_query("SELECT * FROM `files` WHERE `plik` = '".$value."'") or die(mysql_error());
  5. $sprawdzam=mysql_fetch_array($sprawdz,MYSQL_ASSOC);
  6. $wyciagam = $sprawdzam['onof'];
  7.  
  8. if($wyciagam=='1'){
  9. $zapisuje = '0';
  10. }else{
  11. $zapisuje = '1';
  12. }
  13.  
  14.  
  15. $aktualizuje = ("UPDATE `files` SET `onof` = '".$zapisuje."' WHERE `plik` = '".$value."'") or die (mysql_error());
  16. $wykonuje_aktualizuje = mysql_query($aktualizuje);
  17. if($result_upd){
  18. print 'skonfigurowałem:'.$value.'<br>';
  19. }
  20. }
  21. }else{
  22. print('Komunikat jeżeli nie wybrano nic');
  23. }


  1. <form...
  2. ...
  3. zapytanie do bazy w celu sprawdzenia czy checkbox mam zaznaczony
  4. print('<input type="checkbox" name="plik[]" value="'.$row['plik'].'"');if($row['onof']){print('checked="checked"');}print('>'.$row['plik'].'<br>');
  5. ..
  6. </form>


Niestety powyższy kod jakoś dziwnie działa. zaptaszkuje zapisze to 1 zapisuje drugi nie zapisuje. Albo jak mam np 2 checkboxy zaznaczone i 1 odznacze to mi odznacza wszystkie checkboxy.
nospor
Czemu do sprawdzania pobierasz dane z tabelka a updatujesz w files?
casperii
Źle napisałem :-) oczywiście tabelka files
nospor
Pokaz jak wyglada tabelka files oraz co zwraca
print_r($_POST);
w sytuacji, gdy rzekomo źle działa.
Tomplus
W linii 15: dajesz do stringa funkcję die() która powinna być dla mysql_query()
W ogóle zbędna rzecz, bo lepiej sprawdzić przed wrzuceniem do UPDATE/SELECT czy nasze wartości są prawidłowe.

czyli if (is_integer($value)) mysql_query ($update);


Potem: $sprawdz = mysql_query("SELECT * FROM `files` WHERE `plik` = '".$value."'") or die(mysql_error());

Jeżeli sprawdzasz czy wartość ma 1 lub 0, to po co wykonujesz dalej polecenie UPDATE?


zrób if ($sprawdz = mysql_query("SELECT * FROM `files` WHERE `plik` = '".$value."'")) { /* UPDATE */}
else echo " Wartość nie zmieniła się. ";


array_key_exist to sprawdzenie czy klucz w tablicy dla wartości o którą pytam istnieje, ale jeżeli już to powinnieneś pytać się o:

if (array_key_exist('plik',$_POST)) ...
lub if (array_key_exist($cos,$odbieram)) ale to bez sensu.

KsaR
Skróciłem ci ten kod z 1 Postu do identycznego z nudów ]:-).
Tylko troche zaciemniony;
  1. if (isset($_POST['plik'])) foreach ($_POST['plik'] as $v) (false!==mysql_query("UPDATE `files` SET `onof`=IF(`onof`='0','1', '0') WHERE `plik` = '".$v."'")) ? print('skonfigurowałem:'.$v.'<br>'):exit(mysql_error());
  2. else echo 'Komunikat jeżeli nie wybrano nic';


if($result_upd){
print 'skonfigurowałem:'.$value.'<br>';
}
^ a to sie nigdy nie wykona u ciebie bo zmienna nie istnieje :-P
--
Moze malo czytelny, ale zawsze mozna dodac { } wink.gif. Wedlug mnie taki kod szybciej ogarniesz bo jest 12x krótszy, i zarazem dosc logiczny.
casperii
@Tomplus mam kilka checkboxów wyciąganych z bazy.

To wyciągam zapytaniem z bazy i ptaszkuje jeżeli ma w bazie status onof = 1
  1. print('<input type="checkbox" name="plik[]" value="'.$row['plik'].'"');if($row['onof']=='1'){print('checked="checked"');}print('>'.$row['plik'].'<br>');


To wszystko jest oplecione formem. Po kliknięciu buttona wykonuje się kolejny kod:
Ok niech będzie tu kod użytkownika @KsaR
  1. if (isset($_POST['plik'])) foreach ($_POST['plik'] as $v) (false!==mysql_query("UPDATE `files` SET `onof`=IF(`onof`='0','1', '0') WHERE `plik` = '".$v."'")) ? print('skonfigurowałem:'.$v.'<br>'):exit(mysql_error());
  2. else echo 'Komunikat jeżeli nie wybrano nic';


i po wykonaniu tego kodu są jaja. Bo updatuje mi się nawet ten plik , którego nie zaznaczyłem tongue.gif
Czyli reasumując mam 3 pliki plikA , plikB , plikC, plikA i plikB mają w bazie onof=1 czyli są zaptaszkowane, teraz ptaszkuje sobie plikC i daje zapisz to owszem mi się zaptaszkuje ten plikC ale plikA i plikB odptaszkowuje mi się tongue.gif Chociaż powinny być dalej zaptaszkowane bo ja ich nie odptaszkowywałem ręcznie.
KsaR
casperii, moj kod robi to co twoj..
Obkomentuje go:
  1. if (isset($_POST['plik'])) # istnieje w tablicy $_POST klucz plik.
  2. foreach ($_POST['plik'] as $v) # więc przeglądamy wartosci wyslanych post-ów.
  3. (false!==mysql_query("UPDATE `files` SET `onof`=IF(`onof`='0','1', '0') WHERE `plik` = '".$v."'")) #czy "skonfigurowalo", oraz zapytanie do bazy, w ktorym jesli `onof` mialo 0 da mu 1 inaczej pozostawi 0.
  4. ? print('skonfigurowałem:'.$v.'<br>') # jesli wyzszy warunek dal prawde
  5. :exit(mysql_error()); # jesli nie dal prawdy.
  6. else echo 'Komunikat jeżeli nie wybrano nic'; # $_POST['plik']; nie istnieje, (klucz).

Aha, ten if ale w zapytaniu zastepuje te liniki:
  1. $sprawdz = mysql_query("SELECT * FROM `files` WHERE `plik` = '".$value."'") or die(mysql_error());
  2. $sprawdzam=mysql_fetch_array($sprawdz,MYSQL_ASSOC);
  3. $wyciagam = $sprawdzam['onof'];
  4.  
  5. if($wyciagam=='1'){
  6. $zapisuje = '0';
  7. }else{
  8. $zapisuje = '1';
  9. }

Czyli troche inaczej jednak:
powinno byc zamiast:
IF(`onof`='0','1', '0')
W zapytaniu, tak:
IF(`onof`='1','0', '1')
Wtedy moj kod zrobi dokladnie to co twoj, z tym że dodatkowo zadziala mu ten komunikat ze skonfigurowano, jak i komunikat bledu tongue.gif
casperii
@KsaR i dOOpa ten twój kod coś nie działa.
Dalej jest tak, że odptaszkowuje mi pliki które je ręcznie nie odptaszkowałem w htmlu.
Tomplus
Ja może szukam błędu często po chłopsku, ale

zrób sobie echo/print na różnych stopniach dzialania skryptu. Sprawdź zawartość zmiennych i tablic
np. echo "<pre>".print_r($_POST,1)."</pre>"; aby wyświetlić preformatowaną listę informacji z tablicy. Sprawdź co leci do bazy, jaką wartość masz przed, a jaką po.
casperii
tabela files:
plik varchar (64)
onof int(1) - domyślnie 0

@KsaR tak wygląda obecnie kod:

  1. <?php
  2. if(array_key_exists('zapiszmnie', $_POST)){
  3. $cosik = $_POST['plik'];
  4. if(isset($cosik)){
  5. foreach ($cosik as $v){
  6. (false!==mysql_query("UPDATE `files` SET `onof`=IF(`onof`='0','1', '0') WHERE `plik` = '".$v."'"))
  7. ? print('skonfigurowałem:'.$v.'<br>')
  8. }
  9. }else{
  10. echo 'Nie wybrano pliku.';
  11. }
  12. }
  13. ?>
  14.  
  15. <form name="zapiszmnie" method="post" action="">
  16. <?php
  17. $sql = mysql_query("SELECT * FROM `files`") or die(mysql_error());
  18. if(mysql_num_rows($sql)>0){
  19. for($i=0;$i<mysql_num_rows($sql);$i++){
  20. $row = mysql_fetch_array($sql, MYSQL_ASSOC);
  21. print('<input type="checkbox" name="plik[]" value="'$row['plik'].'"');;if($row['onof']=='1'){print('checked="checked"');}print('>'.$row['plik'].'<br>');
  22. }
  23. }
  24. ?>
  25. <br><br>
  26. <input type="submit" name="zapiszmnie" value="Zapisz">
  27. </form>


Nie potrafię znaleźć błędu. Dlaczego bierze pod uwagę te checkboxy które nie odznaczyłem i sam nadaje im update z 1 na 0. Czyli nadpisuje jak mu się podoba.
nospor
Cytat
Dlaczego bierze pod uwagę te checkboxy które nie odznaczyłem
Poniewaz formularzem wysylane są tylko zaznaczone checkboxy. To są podstawy HTML a sam bys to zobaczyl, gdybyś raczył posluchac porad, ktore ci dawalismy, a ktorze brzmialy:
zajrzyl w koncu co idzie postem. Ale zignorowales to dwukrotnie i meczysz sie od tygodnia z totalną pierdułą.
casperii
@nospor nie zrozumiałeś mnie.
Wiem, że tylko zaznaczone checkboxy idą POSTem. Chodzi mi o to, że jeżeli już jakiś checkbox jest już zaznaczony po wczytaniu strony zaznaczę inne checkboxy, to te wcześniejsze co były zaznaczone odptaszkowują się (czyli nadpisują w bazie onof=0).
nospor
Bo tak dziala skrypt, ktory napisales.
Skoro napisales, ze w bazie zmieniasz zaznaczone checkboxy na przeciwne wartosci jakie mają aktualnie w bazie, to skrypt robi co mu każesz.
casperii
@nospor racja, skrypt robi to co się jemu dyktuje, źle może na początku wyraziłem się o to co chcę osiągnąć.

obecnie skrypt wygląda tak:

  1. <?php
  2. if(array_key_exists('zapiszmnie', $_POST)){
  3. $cosik = $_POST['plik'];
  4. if(isset($cosik)){
  5. foreach ($cosik as $v){
  6. $wykonajmnie= mysql_query("UPDATE `files` SET `onof` = '1' WHERE `plik` = '".$v."'");
  7. }
  8. }else{
  9. echo 'Nie wybrano pliku.';
  10. }
  11. }
  12. ?>
  13.  
  14. <form name="zapiszmnie" method="post" action="">
  15. <?php
  16. $sql = mysql_query("SELECT * FROM `files`") or die(mysql_error());
  17. if(mysql_num_rows($sql)>0){
  18. for($i=0;$i<mysql_num_rows($sql);$i++){
  19. $row = mysql_fetch_array($sql, MYSQL_ASSOC);
  20. print('<input type="checkbox" name="plik[]" value="'$row['plik'].'"');;if($row['onof']=='1'){print('checked="checked"');}print('>'.$row['plik'].'<br>');
  21. }
  22. }
  23. ?>
  24. <br><br>
  25. <input type="submit" name="zapiszmnie" value="Zapisz">
  26. </form>


Oczywiście powyższy kod jest dla mnie jak najbardziej zrozumiały i zapisuje mi 1 dla tych checkboxów które wybrałem. No ale nasuwa się pytanie w jaki sposób teraz odptaszkowywać je? Mam tworzyć kolejny foreach z empty i w nim update onof=0?
Proszę o porady.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.