Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]tablica w checkbox
Forum PHP.pl > Forum > Przedszkole
krzysiek_raven
Witam

Mam problem z odebraniem tablicy która jest w polu checkbox.

Mam taki formularz w którym w pętli tworzone są chcekboxy z wartościami:
  1. <?php
  2. echo('<form action="index.php?op=art&amp;co=usun&amp;action=usunWybArt" method="post">
  3. <table id="tabForm">
  4. <tr><th>Zaznacz</th><th>Tytuł i informacje</th></tr>');
  5. while ($tab = mysql_fetch_array($query, MYSQL_BOTH)){
  6. echo('<tr>
  7. <td>
  8. <input type="checkbox" name="wpis[]" value="'.$tab['artID'].'" />
  9. </td>
  10. <td>'.$tab['tytul'].'</td>
  11. </tr>');
  12. }
  13. echo('<tr>
  14. <td colspan="2"><input id="wyslijBT" type="submit" value="OK"></td>
  15. </tr>
  16. </table>
  17. </form>');
  18. ?>


Później chcę odebrać tablicę i np. wyświetlić co jest w środku:

  1. <?php
  2. if (isset($_POST['wpis'])){
  3. $i = 0;
  4. $tab = $_POST['wpis'];
  5. while ($test = $tab[$i]){
  6. echo('<br>artID: '.$test);
  7. $i++;
  8. }
  9. }
  10. ?>


A w środku pokazuje mi się napis Array. Robiłem już wiele razy to przesyłanie tablicy w chceckboxach i wszystko zawsze działało. Siedze już chyba 3 godziny i nie moge znaleźć błędu:/
JoShiMa
A napisz sobie var_dump($test) i var_dump($tab) albo print_r($test) i print_r($tab) i zobaczysz jaką masz strukturę.
krzysiek_raven
Napisałem w ten sposób:
  1. <?php
  2. if (isset($_POST['wpis'])){
  3. $i = 0;
  4. $tab = $_POST['wpis'];
  5. var_dump($tab);
  6. while ($test = $tab[$i]){
  7. var_dump($test);
  8. $i++;
  9. }
  10. ?>


a pokazało się
  1. <?php
  2. string(5) "Array" string(1) "A" string(1) "r" string(1) "r" string(1) "a" string(1) "y"
  3. ?>


Oznacza to że w tablicy jest tylko string = Array ?
Nie mam już pojęcia o co w tym chodzi. Zawsze robiłem mniej więcej w ten sam sposób i było OK.

W momencie gdy wstawiłem polecenia print_r($test) i print_r($tab) to dla print_r($test) był napis Array i w pętli też z liter utworzyło się Array:/
JoShiMa
Cytat(krzysiek_raven @ 20.08.2008, 16:12:13 ) *
Napisałem w ten sposób:
Oznacza to że w tablicy jest tylko string = Array ?

Na to wygląda.



A zrób var_dump($_POST['wpis']) przed while
krzysiek_raven
Pokazuje mi: string(5) "Array"
A jak zrobie var_dump($_POST); to otrzymuję array(1) { ["wpis"]=> string(5) "Array" }

Może błąd jest w tym formularzu? Chociaż jak zaglądam w źródło to wygląda ok. W polach value są numery ID a przy name jest zawsze wpis[]
JoShiMa
A nie zamazujesz gdzieś zmiennej $_POST['wpis']?
krzysiek_raven
Raczej nie. Całość działa mniej więcej w ten sposób:

  1. <?php
  2. function zaznaczArt($katArtID){
  3. $query = mysql_query("select artID, tytul, typArt, glownyArt, video from artykuly 
  4. where katArtID = '$katArtID'
  5. order by artID desc");
  6. if (!$query)
  7. echo('Błąd podczas pobierania artykułów');
  8. else{
  9. echo('<form action="index.php?op=art&amp;co=usun&amp;action=usunWybArt" method="post">
  10. <table id="tabForm">
  11. <tr><th>Zaznacz</th><th>Tytuł i informacje</th></tr>');
  12. while ($tab = mysql_fetch_array($query, MYSQL_BOTH)){
  13. echo('<tr>
  14. <td>
  15. <input type="checkbox" name="wpis[]" value="'.$tab['artID'].'" />
  16. </td>
  17. <td>'.$tab['tytul'].'</td>
  18. </tr>');
  19. }
  20. echo('<tr>
  21. <td colspan="2"><input id="wyslijBT" type="submit" value="OK"></td>
  22. </tr>
  23. </table>
  24. </form>');
  25. }
  26. }
  27.  
  28.  
  29.  
  30.  
  31. if ($co == 'usun'){
  32. echo('
  33. <h1 class="txt2">
  34. :: Usuwanie artykułu/linka
  35. </h1>
  36. ');
  37. $action = $_GET['action'];
  38. if (!$action){
  39. echo('<br/>
  40. <div class="info2">
  41. <p>Wybierz kategorię z artykułami/linkami.</p>
  42. </div>
  43. ');
  44. wybKat('usun');
  45. }
  46. if ($action == 'zaznaczArt'){
  47. echo('<br/>
  48. <div class="info2">
  49. <p>Zaznacz artykuły do usunięcia.</p>
  50. </div>
  51. ');
  52. echo('
  53. <div class="info">
  54. <p>Uwaga! Usunięcie nastąpi odrazu po kliknięciu przycisku OK, bez możliwości odwrócenia operacji.</p>
  55. </div>
  56. ');
  57. $katArtID = $_GET['katArtID'];
  58. if (is_numeric($katArtID)){
  59. zaznaczArt($katArtID);
  60. }
  61. }
  62. if ($action == 'usunWybArt'){
  63. if (isset($_POST['wpis'])){
  64. $i = 0;
  65. $tab = $_POST['wpis'];
  66. var_dump($_POST);
  67. while ($test = $tab[$i]){
  68. echo('ID: '.$test);
  69. $i++;
  70. }
  71. /* $test = usunWybArt($_POST['wpis']);
  72. echo('
  73. <div class="info">
  74. <p>Operacja zakończona.<br /><strong>Raport:</strong><br />
  75. Usuniete Artykuły:'.$test['usuniete'].'<br/>Nieusuniete Zdj:'.$test['nieusuniete'].'</p>
  76. </div>
  77. '); */
  78. }
  79. }
  80. }
  81. ?>


Nazwy tablicy też już zmieniałem i ciągle to samo. Może cały plik już za dużo zajmuje? Ma już ponad 1100 linijek, nie wiem czy ma to jakieś znaczenie:P
JoShiMa
Cytat(krzysiek_raven @ 20.08.2008, 16:36:59 ) *
Może cały plik już za dużo zajmuje? Ma już ponad 1100 linijek, nie wiem czy ma to jakieś znaczenie:P

Nie ma, chociaż dla porządku powinieneś to podzielić na mniejsze pliki.

Spróbuj sprawdzić wartość var_dump($_POST['wpis']) przed if (isset($_POST['wpis'])){

A poza tym wyświetl sobie źródło strony z tymi checkboxami, skopiuj formularz i pokaż tu.


Spróbuj jeszcze dać inkrementację wprost
  1. <?php
  2. $i = 0;
  3.  while ($tab = mysql_fetch_array($query, MYSQL_BOTH)){
  4. echo('<tr>
  5. <td>
  6. <input type="checkbox" name="wpis['.$i.']" value="'.$tab['artID'].'" />
  7. </td>
  8. <td>'.$tab['tytul'].'</td>
  9. </tr>');
  10. $i ++;
  11. }
  12. ?>
rzymek01
Cytat
Spróbuj jeszcze dać inkrementację wprost

to nic nie da, powinno działać samo name="wpis[]"
krzysiek_raven
Niestety nic nie dało.
var_dump($_POST['wpis']) przed if pokazuje ciągle to samo: string(5) "Array"

Źródło wygląda tak z inkrementacją:
  1. <form action="index.php?op=art&amp;co=usun&amp;action=usunWybArt" method="post">
  2. <table id="tabForm">
  3. <tr><th>Zaznacz</th><th>Tytuł i informacje</th></tr><tr>
  4. <td>
  5. <input type="checkbox" name="wpis[0]" value="4" />
  6. </td>
  7. <td>ddd</td>
  8. </tr><tr>
  9. <td>
  10. <input type="checkbox" name="wpis[1]" value="3" />
  11. </td>
  12. <td>ccc</td>
  13. </tr><tr>
  14. <td>
  15. <input type="checkbox" name="wpis[2]" value="2" />
  16. </td>
  17. <td>bbb</td>
  18. </tr><tr>
  19. <td>
  20. <input type="checkbox" name="wpis[3]" value="1" />
  21. </td>
  22. <td>aaa</td>
  23. </tr><tr>
  24. <td colspan="2"><input id="wyslijBT" type="submit" value="OK"></td>
  25. </tr>
  26. </table>
  27. </form>


Sprawdzałem już na dwóch serwerach i jest tak samo. Jeśli sie nie uda z tym nic zrobić to trudno, zrobie to w troche inny sposób, ale jak by się udało to by było fajnie;). W kazdym razie dzięki za pomoc.
rzymek01
a jakoś mi działa (bez inkrementacji)

zobacz sobie: http://rzymek.9g.pl/PHP/krzysiek_raven.php

edit: oczywiście źródło: http://rzymek.9g.pl/PHP/krzysiek_raven.phps
krzysiek_raven
No niby powinno u mnie też działać. Musi być gdzieś jakiś dziwny błąd. Trudno, mam już dosyć na dzisiaj. Jak by ktoś znalazł przyczynę to niech pisze:)

Jak by sie komuś chciało to tu jest kod pliku index.php - http://www.wklejto.pl/8440
a tutaj pliku artykuły.php który jest wywoływany z index.php - http://www.wklejto.pl/8441
rzymek01
przeanalizowałem trochę twój kod i wniosek jest prosty:
błąd jest gdzie indziej smile.gif

na przykład w funkcji filtrującej zmienne pochodzące od uzytkownika, tylko że zamiast filtrowac ta funkcja np. je czyści smile.gif


edit: spr te pliki, które są wcześniej includowane, tzn.
Kod
    include('include/dbConnect.php');
        include('include/connFunc.php');
        include('include/funkcjeNaPlikach.php');
        include('include/magic_quotes.php');


        include('layout/header.html');
        include('layout/top.html');
        include('layout/startMainLeft.html');
            include('pages/menu.php');
        include('layout/endLeftStartRight.html');
Maxik
Kiedyś napisałem coś takiego(w celach testowych):
  1. <form action="testowyform.php" method="post">
  2. <input type="checkbox" name="akceptuj[]" value="1">1
  3. <input type="checkbox" name="akceptuj[]" value="2">2
  4. <input type="checkbox" name="akceptuj[]" value="3">3
  5. <input type="checkbox" name="akceptuj[]" value="4">4
  6. <input type="checkbox" name="akceptuj[]" value="5">5
  7. <input type="checkbox" name="akceptuj[]" value="6">6
  8. <input type="checkbox" name="akceptuj[]" value="7">7
  9. <input type="checkbox" name="akceptuj[]" value="8">8
  10. <input type="checkbox" name="akceptuj[]" value="9">9
  11. <input type="checkbox" name="akceptuj[]" value="10">10
  12. <input type="checkbox" name="akceptuj[]" value="11">11
  13. <input type="submit" value="SEND">
  14. </form>


  1. <?php
  2.  
  3. echo "<PRE>";
  4. print_r($_POST);
  5. echo "</PRE>";
  6.  
  7. ?>


Efekt: http://maxik.netmark.pl/opisy/testowyform/testowyform.html
krzysiek_raven
Chyba jedynym plikiem, który może coś popsuć jest magic_quotes.php
  1. <?php
  2. $_GET = array_map('addslashes', $_GET);
  3. $_POST = array_map('addslashes', $_POST);
  4. $_COOKIE = array_map('addslashes', $_COOKIE);
  5. $_REQUEST = array_map('addslashes', $_REQUEST);
  6.  }
  7. $_GET = array_map('stripslashes', $_GET);
  8. $_POST = array_map('stripslashes', $_POST);
  9. $_COOKIE = array_map('stripslashes', $_COOKIE);
  10. $_REQUEST = array_map('stripslashes', $_REQUEST);
  11.  }
  12. ?>
rzymek01
tak poza tematem (chodzi o magic_quotes.php)

czemu robisz tak, że jak php sam dodaje slashe to ty je usuwasz (czyli wtedy nie ma slashy)
a jak php nie dodaje samemu, to ty dodajesz (czyli wtedy są slashe)

wniosek: twój skrypt może działać inaczej na różnych serwerach
krzysiek_raven
Sam już nie pamiętam czemu to tak zrobiłem, ale własnie tu był błąd:P Jak zakomentowałem ten plik to wszystko zaczęło działać:) Usunięcie slashy dałem chyba po to żeby użyć później funkcji mysql_real_escape_string() zresztą sam już nie pamiętam:P

Zostawie ten plik chyba w ten sposób i powinno być ok
  1. <?php
  2. $_GET = array_map('addslashes', $_GET);
  3. $_POST = array_map('addslashes', $_POST);
  4. $_COOKIE = array_map('addslashes', $_COOKIE);
  5. $_REQUEST = array_map('addslashes', $_REQUEST);
  6.  }
  7. ?>


Najważniejsze że sie wyjaśniło o co chodzi:)
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.