Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Update kilku rekordów na raz
Forum PHP.pl > Forum > Przedszkole
Przemo75
Witam,
Niestety nie mogę przeskoczyć update'a. Chyba mam coś namieszane z tablicą, bo wyświetla najpierw same produkty a później ich id (id_asort).
Próbuję uzyskać taką postać tablicy:

[products] => Array ( [0] => Array ( [produkt] => Produkt_1 [id_asort] => 148 ) [1] => Array ( [produkt] => Produkt_2 [id_asort] => 149 ) )

a wciąż otrzymuję taką:

Array ( [produkt] => Array ( [0] => Produkt_1 [1] => Produkt_2 ) [id_asort] => Array ( [0] => 148 [1] => 149 ) )
  1. @$kategoria = $_GET['kategoria'];
  2. if ($kategoria)
  3. {
  4. $link=mysql_query(" SELECT a.id_kategorii aid, a.produkt aprodukt, a.id_asort aida, k.id_kategorii kid, k.nazwa knazwa, k.opis kopis FROM kategoria k LEFT JOIN asortyment a ON a.id_kategorii = k.id_kategorii WHERE k.id_kategorii='$kategoria' ORDER BY a.id_asort ASC ");
  5.  
  6. $categories = array();
  7. while ($wybor2 = mysql_fetch_array($link)){
  8. $kid = $wybor2['kid'];
  9.  
  10. if (!isset($categories[$kid]))
  11. $categories[$kid] = array('nazwa' => $wybor2['knazwa'], 'opis' => $wybor2['kopis'], 'products' => array());
  12.  
  13. if (!empty($wybor2['aprodukt']))
  14. $categories[$kid]['products'][] = array('produkt' => $wybor2['aprodukt'], 'id_asort' => $wybor2['aida']);
  15. }
  16.  
  17. echo '<br><ul>';
  18. foreach ($categories as $idCat => $category)
  19. {
  20. echo '<li><b>'.$category['nazwa'].'</b><br>';
  21. echo '<li>'.$category['opis'].'<ul>';
  22. foreach ($category['products'] as $produkty)
  23. {
  24. echo '<form method="POST" action="main_asortyment.php?oferta=wyedytuj">';
  25. echo '<li><input type="hidden" name="id_asort[]" value="'.$produkty['id_asort'].'"><input type="text" name="produkt[]" size="60" value="'.$produkty['produkt'].'"></li>';
  26. }
  27. echo '<br><br><input type="submit" value="ZAPISZ">';
  28. echo '</form>';
  29. echo '</ul></li>';
  30. }
  31. echo '</ul>';
  32. }
  33. }
  34.  
  35. elseif(isset($_GET['oferta']) && $_GET['oferta']=='wyedytuj') // WYEDYTUJ
  36. {
  37. $kid=$_POST['id_kategorii'];
  38.  
  39. if (!empty($_POST['produkt']))
  40. $produkty2[] = array('produkt' => $_POST['produkt'], 'id_asort' => $_POST['id_asort']);
  41.  
  42. foreach($produkty2 as $produkt => $id_asort)
  43. {
  44. $query = "UPDATE asortyment SET produkt='$produkt' WHERE id_asort='$id_asort'";
  45. $result = mysql_query ($query);
  46. }
  47. }

Będę wdzięczny za pomoc, bo siedzę nad tym już stanowczo za długo i próbuje rozpracować na różne sposoby, niestety bezskutecznie.
CuteOne
Zrób sobie prosty test:

  1. @$kategoria = $_GET['kategoria'];
  2. if ($kategoria)
  3. {
  4. $link=mysql_query(" SELECT a.id_kategorii aid, a.produkt aprodukt, a.id_asort aida, k.id_kategorii kid, k.nazwa knazwa, k.opis kopis FROM kategoria k LEFT JOIN asortyment a ON a.id_kategorii = k.id_kategorii WHERE k.id_kategorii='$kategoria' ORDER BY a.id_asort ASC ");
  5.  
  6. $array = array();
  7.  
  8. while($wybor2 = mysql_fetch_assoc($link)) {
  9.  
  10. $array[$wybor2['kid']] = $wybor2;
  11. }
  12.  
  13. echo '<pre>'; print_r($array);
  14.  
  15. }


I sprawdź dokładnie w jaki sposób zwracane są dane z bazy
Przemo75
Postać tablicy:

Array
(
[13] => Array
(
[aid] => 13 //id kategorii
[aprodukt] => Produkt_2
[aida] => 149 //id produktu
[kid] => 13 //id kategorii
[knazwa] => Nazwa_kategorii
[kopis] => Opis_kategorii
)
)
CuteOne
  1.  
  2. $i=1;
  3. while($wybor2 = mysql_fetch_assoc($link)) {
  4.  
  5. $array[$wybor2['kid']][$i++] = array('produkt' => $wybor2['aprodukt'], 'id_asort' => $wybor2['aida']);
  6. }
  7.  
  8. echo '<pre>'; print_r($array);
  9.  
Przemo75
Teraz tablica wygląda tak:

Array
(
[13] => Array
(
[1] => Array
(
[produkt] => Produkt_1
[id_asort] => 148
)

[2] => Array
(
[produkt] => Produkt_2
[id_asort] => 149
)
)
)

ale nie wyświetlają się poprawnie wyniki - błąd - niezidentyfikowany index 'nazwa' i 'opis'
  1. echo '<br><ul>';
  2. foreach ($categories as $idCat => $category)
  3. {
  4. echo '<li><b>'.$category['nazwa'].'</b><br>';
  5. echo '<li>'.$category['opis'].'<ul>';
  6. foreach ($category as $produkty)
  7. {
  8. echo '<li>'.$produkty['produkt'].' - id '.$produkty['id_asort'].'</li>';
  9. }
  10. echo '</ul></li>';
  11. }
  12. echo '</ul>';
  13.  


Problem z tematu jest z akcją "wyedytuj" - od instrukcji elseif w linii 35.
CuteOne
  1.  
  2. $i=1;
  3. while($wybor2 = mysql_fetch_assoc($link)) {
  4.  
  5. $array[$kid][$i] = array('nazwa' => $wybor2['knazwa'], 'opis' => $wybor2['kopis'], 'products');
  6. $array[$kid][$i]['products'] = array('produkt' => $wybor2['aprodukt'], 'id_asort' => $wybor2['aida']);
  7.  
  8. $i++;
  9. }
  10.  
  11. echo '<pre>'; print_r($array);


Czasami jeżeli coś nie działa i męczysz się z tym kilka godzin warto napisać cały kod na nowo smile.gif
Przemo75
To chyba nie jest droga w dobrą stronę, bo teraz tablica wygląda tak:
  1. Array
  2. (
  3. [13] => Array
  4. (
  5. [1] => Array
  6. (
  7. [nazwa] => Nazwa
  8. [opis] => Opis
  9. [0] => products
  10. )
  11. [2] => Array
  12. (
  13. [produkt] => Produkt_1
  14. [id_asort] => 148
  15. )
  16. [3] => Array
  17. (
  18. [nazwa] => Nazwa
  19. [opis] => Opis
  20. [0] => products
  21. )
  22. [4] => Array
  23. (
  24. [produkt] => Produkt_1
  25. [id_asort] => 149
  26. )
  27. )
  28. )

Kod "startowy" do linii 33 działa dobrze, tzn. wszystko wyświetla się tak, jak powinno.
Problem zaczyna się po wysłaniu formularza w akcji "wyedytuj", czyli od instrukcji elseif z linii 35.
CuteOne
  1.  
  2. if (!empty($_POST['produkt']) && !empty($_POST['id_asort'])) {
  3.  
  4. mysql_query("UPDATE asortyment SET produkt='{$_POST['produkt']}' WHERE id_asort='{$_POST['id_asort']}'") or die(mysql_error());
  5. }


Pomijam kwestie bezpieczeństwa..
korex
z tego co widze masz zmienne w apostrofach w zapytaniu z linii 44 co powoduje branie ich pod uwage jako tekst
Przemo75
Próbuję przerobić edycję danych na okoliczność wykasowania zawartości z 1 lub kilku pól produktów podczas edycji. Przy wykasowaniu zawartości z co najmniej 2 pól, wykasowany zostaje tylko i wyłącznie rekord z ostatniego "wykasowanego" pola, a inne są pomijane. Natomiast UPDATE działa poprawnie.

  1. elseif(isset($_GET['oferta']) && $_GET['oferta']=='wyedytuj') // WYEDYTUJ
  2. {
  3. $kid=$_POST['id_kategorii'];
  4.  
  5. if (!empty($_POST['produkt']))
  6. $tab1 = $_POST['produkt'];
  7. $tab2 = $_POST['id_asort'];
  8. $tablica = array_combine($tab1, $tab2);
  9.  
  10. foreach($tablica as $produkt => $id_asort)
  11. {
  12.  
  13. if (strlen($produkt) > 0)
  14. {
  15. $query1 = "UPDATE asortyment SET produkt='{$produkt}' WHERE id_asort='{$id_asort}'";
  16. $result1 = mysql_query ($query1);
  17. $message1='<br> Pomyślnie zaktualizowałem produkt - <b>'.$produkt.' o id <b>'.$id_asort.'</b></b><br>';
  18. echo "<p align=\"center\" class=\"style3\">$message1</p>";
  19. }
  20. else
  21. {
  22. $query2 = "DELETE FROM asortyment WHERE id_asort='$id_asort'";
  23. $result2 = mysql_query ($query2);
  24. $message2='<br> Pomyślnie skasowałem produkt o id <b>'.$id_asort.'</b><br>';
  25. echo "<p align=\"center\" class=\"style3\">$message2</p>";
  26. }
  27. }
  28. }
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.