Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak wykonać UPDATE kilku ID jednym SUBMIT-em?
Forum PHP.pl > Forum > PHP
Soulast
Mam ciągle jeden ten sam problem i nigdzie nie mogę znaleźć ani odpowiedzi a także rozwiązania.

Cytat
Mając przykładowo tabele :

ID|NAZWA| PUNKTY
----------------------
1 | DATA1 | 0
2 | DATA2 | 0
3 | DATA3 | 0
4 | DATA4 | 0


Wykonuje pętle
  1. <form method='post'>
  2. <table cellpadding='1' cellspacing='1' border='0'>";
  3.  
  4. $sql = mysql_query("SELECT * FROM moja_tabela");
  5. while ($dane= mysql_fetch_array($sql)){
  6. echo"
  7. </tr>
  8. <tr>
  9. <td>NAZWA </td>
  10. <td>PUNKTY</td>
  11. </tr>
  12.  
  13. <tr valign='top'>
  14. <td><input type='text' name='dane[nazwa]' value='$dane[nazwa]' maxlength='20' size='20' /></td>
  15. <td><input type='text' name='dane[punkty]' value='$dane[punkty]' maxlength='20' size='20' /></td>
  16. </tr>
  17. <input type='hidden' name='dane[]' value='$dane[id]'>";
  18. }
  19. echo"<tr>
  20. <td colspan='2''>
  21. <input type='hidden' name='act' value='update_dane'>
  22. <input type='submit' name='submit' value='Update' />
  23. </td>
  24. </tr>
  25. </table>
  26. </form>

Wrzucam je do bazy przy pomocy funkcji oraz switcha:
  1.  
  2. $sql = mysql_query("UPDATE moja_tabela SET nazwa= '$brack[nazwa]',punkty= '$brack[punkty]' WHERE id='$dane[id]'")or die(mysql_error());


Ktoś może zna na to jakiś sposób?bo puki co mój zawsze robi update tylko ostatniego ID

ADeM
Nadpisujesz w pętli zmienne.
  1. <tr valign='top'>
  2. <td><input type='text' name='dane[nazwa][]' value='$dane[nazwa]' maxlength='20' size='20' /></td>
  3. <td><input type='text' name='dane[punkty][]' value='$dane[punkty]' maxlength='20' size='20' /></td>
  4. </tr>
Soulast
Niestety nic nie pomogło sad.gif

A może muszę jakąś zmienną do funkcji dopisać?

obecnie mam function update_dane($dane)
thek
WHERE id IN (3,5,7,9) chyba Ci pomoże... Tylko pamiętaj, że jeśli checkboxy oznaczysz jako nazwa[], to dostaniesz tablicę id-eków i musisz to ładnie do stringa poprzez użycie implode połączyć.
Soulast
Cytat(thek @ 4.11.2010, 09:08:32 ) *
WHERE id IN (3,5,7,9) chyba Ci pomoże... Tylko pamiętaj, że jeśli checkboxy oznaczysz jako nazwa[], to dostaniesz tablicę id-eków i musisz to ładnie do stringa poprzez użycie implode połączyć.


Obecnie dodałem do tego checkbox oraz co wygląda następująco:

  1. <form method='post'>
  2. <table cellpadding='1' cellspacing='1' border='0'>";
  3.  
  4. $sql = mysql_query("SELECT * FROM moja_tabela");
  5. while ($dane= mysql_fetch_array($sql)){
  6. echo"
  7. </tr>
  8. <tr>
  9. <td>NAZWA </td>
  10. <td>PUNKTY</td>
  11. </tr>
  12.  
  13. <tr valign='top'>
  14. <td><input type='text' name='dane[nazwa]' value='$dane[nazwa]' maxlength='20' size='20' /></td>
  15. <td><input type='text' name='dane[punkty]' value='$dane[punkty]' maxlength='20' size='20' /></td>
  16. </tr>
  17. <input type='checkbox' id='dane[]' name='dane[]' value='$dane[poz]'>";
  18. }
  19. echo"<tr>
  20. <td colspan='2''>
  21. <input type='hidden' name='act' value='update_dane'>
  22. <input type='submit' name='submit' value='Update' />
  23. </td>
  24. </tr>
  25. </table>
  26. </form>
  27.  


puki co dostaje takie error:
  1. poz = implode(',',$dane['poz']);
  2. $sql = mysql_query("UPDATE moja_tabela SET nazwa= '$dane[nazwa]',punkty= '$dane[punkty]' WHERE id IN $poz ")or die(mysql_error());

  1. Warning: implode() [function.implode]: Invalid arguments passed in /dane.php on line 496
  2. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Uważam się za jeszcze bardzo początkującego samouka więc z góry przepraszam za proste pytania tongue.gif

oraz spróbowałem również ręcznie WHERE id IN (3,5,7,9) lecz to robi update wszystkich id-ów tą samą wartością.
thek
A to każdy id z własną wartością? No to Cię zasmucę. Według standardu języka sql nie można tego zrobić. Nie przewidziano hurtowego update rekordów w tej formie.
Soulast
Cytat(thek @ 4.11.2010, 15:12:54 ) *
A to każdy id z własną wartością? No to Cię zasmucę. Według standardu języka sql nie można tego zrobić. Nie przewidziano hurtowego update rekordów w tej formie.


Tak raczej każdy "PUNKT" ma inną wartość.

A czy istnieją inne forum hurtowego UPDATE?naprawdę szukałem ale nigdzie nie mogę znaleźć odpowiedzi.
Może pod złym wyrażeniem szukam;)
thek
Tu chodzi o to, że nie ma w języku SQL takiej formy jak update jednym zapytaniem wielu rekordów nadając im różne wartości. Można jedynie wiele rekordów tymi samymi danymi i wtedy właśnie używa się WHERE id IN (numerki) bo wtedy wszystkie wymienione ustawiają się na podany w zapytaniu. Jeśli chcesz nadawać i m różne wartości to albo musisz pogrupować je po tych wartościach i wykonać tyle zapytań ile jest różnych wartości (czyli ileś rekordów, które ustawiasz na 5 poleci jednym zapytaniem, a ileś które ma mieć 9 poleci innym), albo wykonać update dla każdego rekordu oddzielnie. Po prostu nie da się inaczej, bo tego SQL nie przewiduje i nigdy nie przewidywał, choć dla niektórych byłoby to wygodne.
Soulast
Mimo wszystko po 3ch dniach męki znalazłem rozwiązanie.

Oto poniższy działający już przykład :

  1. <form method='post'>
  2. <table cellpadding='1' cellspacing='1' border='0'>";
  3.  
  4. $sql = mysql_query("SELECT * FROM moja_tabela");
  5. while ($dane= mysql_fetch_array($sql)){
  6. echo"
  7. </tr>
  8. <tr>
  9. <td>NAZWA </td>
  10. <td>PUNKTY</td>
  11. </tr>
  12.  
  13. <tr valign='top'>
  14. <td><input type='text' name='dane[".$dane['id']."][nazwa]' value='$dane[nazwa]' maxlength='20' size='20' /></td>
  15. <td><input type='text' name='dane[".$dane['id']."][punkty]' value='$dane[punkty]' maxlength='20' size='20' /></td>
  16. </tr>";
  17. }
  18. echo"<tr>
  19. <td colspan='2''>
  20. <input type='hidden' name='act' value='update_dane'>
  21. <input type='submit' name='submit' value='Update' />
  22. </td>
  23. </tr>
  24. </table>
  25. </form>

Wrzucam dane przy pomocy funkcji:
  1. function update_dane ($dane){
  2.  
  3. global $config;
  4.  
  5. foreach($dane as $id=> $array) {
  6. $var1= trim(strip_tags($array['nazwa']));
  7. $var2= trim(strip_tags($array['punkty']));
  8. $sql = mysql_query("UPDATE moja_tabela SET nazwa= '$var1',punkty= '$var2' WHERE id=$id")or die(mysql_error());
  9. }
  10.  
  11.  
  12. }

Podaje ten przykład ponieważ w moim wypadku się sprawdził także może ktoś kto czegoś podobnego szuka może i skorzysta winksmiley.jpg
thek
Ech.... Czyli zrobiłeś to o czym każdy tutaj piszący wie. Puściłeś w pętli każde zapytanie osobno. A w temacie ewidentnie sugerowałeś, że chcesz optymalizacji tak, by było jak najmniej zapytań, a co ja ująłem w poprzednim poście słowami: "albo wykonać update dla każdego rekordu oddzielnie."
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.