Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]kopiowanie tabeli A do tabeli B
Forum PHP.pl > Forum > Przedszkole
rybak84
Witam jeszcze raz. Zaznaczam checkboxem rekordy i chcialbym zrobic archiwum czyli skopiowac dane z jednej tabeli do drugiej przez skasowaniem rekordow. ale znowu problem ze nie kopiuje do tablicy archiwum zamowien wartosci zmiennych:

plik zamowienia:
  1. <?php
  2. $wynik=mysql_query("SELECT * FROM zamowienie;") or 
  3. die ("Blad w pytaniu");
  4.  
  5. echo "<table cellpadding=5 border=1 width=100% >";
  6. echo "<tr bgcolor='#CCCCCC'><td><b>Zamawiający</b></td><td><b>Film</b></td>";
  7. echo "<td><b>Cena</b></td><td><b>Data zamówienia</b></td><td><b>Usuń</b></td>";
  8. echo "<td><form action='usun_zamowienie.php' method='POST'></td></tr>";
  9. while ($rekord = mysql_fetch_assoc ($wynik)) 
  10. {
  11.  
  12. $IdZamowienie=$rekord['IdZamowienie'];
  13. $Login= $rekord['Login'];
  14. $Film = $rekord['Film'];
  15. $Cena = $rekord['Cena'];
  16. $Data_Zamowienia = $rekord['Data_Zamowienia'];
  17.  
  18.  
  19. echo "<tr><td width='110'>".$Login."</td><td>".$Film."</td>";
  20. echo "<td>".$Cena."</td><td>".$Data_Zamowienia."</td>";
  21.  
  22.  
  23. echo "<td><input type=hidden name='Login[]' value=".$Login.">"; 
  24. echo "<input type=hidden name='Film[]' value=".$Film.">"; 
  25. echo "<input type=hidden name='Cena[]' value=".$Cena.">"; 
  26. echo "<input type=hidden name='Data_Zamowienia[]' value=".$Data_Zamowienia.">"; 
  27.  
  28. echo "<input type=checkbox name='IdZamowienie[]' value=".$IdZamowienie."></td></tr>";
  29. }
  30. echo "</table>";
  31.  
  32. echo "<table bgcolor='#CCCCCC' align='left' border='2' >";
  33. echo "<tr><td colspan='2' align='left'><input type='submit' value='Usuń zrealizowane zamówienie'>";
  34. echo "</td></tr></form></table>";
  35. ?>


teraz plik usun zamowienie:
  1. <?php
  2. $IdZamowienie=$_POST['IdZamowienie'];
  3. $Login= $_POST['Login'];
  4. $Film = $_POST['Film'];
  5. $Cena = $_POST['Cena'];
  6. $Data_Zamowienia = $_POST['Data_Zamowienia'];
  7.  
  8. ?>
  9.  
  10. <?php
  11.  
  12. if($IdZamowienie==NULL) {
  13. echo '<font size=6>zaznacz stare zamówienie do skasowania</font>';
  14. echo "<font size=6><center><a href='zamowienia.php'>Wróć</a></center></font>";
  15. }
  16.  
  17. else {
  18.  
  19. while ( list( $key, $val ) = each( $IdZamowienie ) ) {
  20.  
  21.  $sel=mysql_query("SELECT * FROM zamowienie WHERE IdZamowienie = $val");
  22. echo ("$key::$valn;");
  23. echo "Login:" .$Login. "<br/><br/>";
  24. echo "Film:" .$Film. "<br/><br/>";
  25. echo "Cena:" .$Cena. "<br/><br/>";
  26. echo "Data_Zamowienia:" .$Data_Zamowienia. "<br/><br/>";
  27.  
  28. $archiwum=mysql_query("INSERT INTO archiwum_zamowien (Zamawiajacy,Film,Cena,Data) VALUES ('$Login','$Film','$Cena','$Data_Zamowienia')WHERE IdZamowienie=$val");
  29.  
  30. $del=mysql_query("DELETE FROM zamowienie WHERE IdZamowienie = $val");
  31.  
  32. }
  33.  
  34.  
  35. echo "<font size='10'><p>Zrealizowane zamówienie zostało usunięte<p></font>";
  36. }
  37. echo "<font size=8><a href='zamowienia.php'>Wróć</a></font>";
  38.  
  39. ?>


czekam na propozycje. thx
mokry
Nie wiem czy dobrze cie zrozumialem, ale jesli chodzi o samo przeniesienie danych to mozesz najpierw wybrac dana pozycje z bazy danych a potem zrobic dwa zapytania... INSERT do tabeli B i DELETE z tabeli A.
Jesli jednak chodzi o archiwizacje danych to na Twoim miejscu stworzylbym jeszcze jedno pole 'archiwum' i jego wartosc albo '0' jesli aktywne, albo '1' jako zarchiwizowane.
Sedziwoj
Cytat
Jesli jednak chodzi o archiwizacje danych to na Twoim miejscu stworzylbym jeszcze jedno pole 'archiwum' i jego wartosc albo '0' jesli aktywne, albo '1' jako zarchiwizowane.

Ale lepiej skopiować, bo poco mają się skasowane plątać, ale to już zależy co dokładnie chcesz przez to osiągnąć, do tego do tej drugiej tabeli mogą być inne uprawnienia, a dodawanie wszędzie dodatkowego warunku jest troszkę dziwne.

A zapytanie możesz zrobić coś w tek konstrukcji, jeśli nie musisz jeszcze raz wybierać:
  1. INSERT INTO aktorzy_a (SELECT * FROM aktorzy WHERE id_a=7);

przy założeniu że obie tabele mają taki sam rozstaw kolumn i obie mają tyle samo
rybak84
Cytat(mokry @ 2.12.2006, 22:20:36 ) *
Nie wiem czy dobrze cie zrozumialem, ale jesli chodzi o samo przeniesienie danych to mozesz najpierw wybrac dana pozycje z bazy danych a potem zrobic dwa zapytania... INSERT do tabeli B i DELETE z tabeli A.


wlasnie o to chodzi. i tak mam ale dane nie wpisuja sie do tabeli (zapytanie INSERT INTO)
Sedziwoj
  1. INSERT INTO archiwum_zamowien (Zamawiajacy,Film,Cena,DATA) VALUES ('$Login','$Film','$Cena','$Data_Zamowienia')WHERE IdZamowienie=$val

a po co Ci "WHERE IdZamowienie=$val" questionmark.gif przecież to nie jest poprawna składnia
rybak84
no dokladnie poprawilem

  1. <?php
  2. $archiwum=mysql_query("INSERT INTO archiwum_zamowien (Zamawiajacy,Film,Cena,Data) VALUES ('$Login','$Film','$Cena','$Data_Zamowienia')");
  3. ?>



i wpisuje do tablicy dane ale w postaci np: Login nie ma loginu tylko pisze array. cos zle ztymi tablicami mam

usunalem te talbice i zmienilem na:

  1. <?php
  2. echo "<td><input type=hidden name='Login' value=".$Login.">"; itd
  3. ?>


teraz usuwam i kopiuje ale do nowej tablicy kopiuje mi ostatni rekord nie wazne czy zaznacze pierwszy ,trzeci itd.

help wdzięczny za pomoc cool.gif
Neojawor
niestety dla każdego rekordu pola typu hiden w Twoim formularzu tak samo się nazywają (np. Cena[]). Zrób tak - dodaj w pętli coś w stylu licznika, tzn przed pętlą zadeklaruj
  1. <?php
  2. int $i=0;
  3. ?>
a na samym końcu pętli daj
  1. <?php
  2. i++;
  3. ?>
w ten sposób masz licznik i robisz z nim coś takiego:
  1. <?php
  2. echo "<input type=hidden name='Cena[$i]' value=".$Cena.">";
  3. ?>

teraz twoje inputy będą się nazywać kolejno Cena[0], Cena[1], Cena[2]....
Nie wiem czy to jest rozwiązanie całego problemu, ale bez tego nie będzie Ci działać choćby nie wiem co

pozdrawiam
Sedziwoj
Neojawor, to nie był kłopot, bo php sam inkrementuje jeśli zrobisz $cos[] = 'aaaa';

Tu problem jest taki, że dostajesz Login[], Film[], Cena[], Data_Zamowienia[], IdZamowienie[] jako array, dlatego jak robisz
  1. INSERT INTO archiwum_zamowien (Zamawiajacy,Film,Cena,DATA) VALUES ('$Login','$Film','$Cena','$Data_Zamowienia')

to $Login to właśnie array czyli tablica.
To powinno działać:
  1. <?php
  2. if(!isset($IdZamowienie)) {
  3. echo '<font size=6>zaznacz stare zamówienie do skasowania</font>';
  4. echo "<font size=6><center><a href='zamowienia.php'>Wróć</a></center></font>";
  5. }
  6.  
  7. else {
  8.  
  9. while ( list( $key, $val ) = each( $IdZamowienie ) ) {
  10.  
  11.  $sel=mysql_query("SELECT * FROM zamowienie WHERE IdZamowienie = $val");
  12. echo ("$key::$valn;");
  13. echo "Login:" .$Login[$key]. "<br/><br/>";
  14. echo "Film:" .$Film[$key]. "<br/><br/>";
  15. echo "Cena:" .$Cena[$key]. "<br/><br/>";
  16. echo "Data_Zamowienia:" .$Data_Zamowienia[$key]. "<br/><br/>";
  17.  $archiwum=mysql_query("INSERT INTO archiwum_zamowien (Zamawiajacy,Film,Cena,Data) VALUES ('${Login[$key]}','${Film[$key]}','${Cena[$key]}','${Data_Zamowienia[$key]}')");
  18.  
  19. $del=mysql_query("DELETE FROM zamowienie WHERE IdZamowienie = $val");
  20.  
  21. }
  22. ?>

a te tablice zostaw w formularzu.

Wiedziałem, że takie coś jest, ale jak już pisałem z SQL to zemnie cienias.
  1. CREATE RULE zamowienie_arch AS ON DELETE TO zamowienie DO ALSO INSERT INTO archiwum_zamowien (Zamawiajacy, Film, Cena, DATA) VALUES (OLD.Zamawiajacy, OLD.Film, OLD.Cena, OLD.DATA);

To działa pod PostgreSQL, i nie musisz nic w php robić po prostu kasujesz z tabeli 'zamowienie' a baza sama tworzy nowy wpis w 'archiwom_zamowien'.
Tą regułę tworzysz raz tak jak bazę czy tabelę i zostanie zawsze wykonana przy kasowaniu rekordy z tej tabeli.

Mam nadzieję, że się to przyda i działa pod MySQL (już spr. mi się nie chce) choć z tego co widzę na 4.0.5 nie było...
rybak84
witam no niestety z tymi keyami tez nie dziala, teraz kopiujac jakis srodkowy rekord kasuje mi pierwszy (a nie ostatni blinksmiley.gif )

  1. <?php
  2.  
  3. //Odczyt z bazy danych
  4. require('baza.php');
  5.  
  6.  
  7. $wynik=mysql_query("SELECT * FROM zamowienie;") or 
  8. die ("Blad w pytaniu");
  9.  
  10. $i=0;
  11.  
  12. echo "<table cellpadding=5 border=1 width=100% >";
  13. echo "<tr bgcolor='#CCCCCC'><td><b>Zamawiający</b></td><td><b>Film</b></td>";
  14. echo "<td><b>Cena</b></td><td><b>Data zamówienia</b></td><td><b>Usuń</b></td>";
  15. echo "<td><form action='usun_zamowienie.php' method='POST'></td></tr>";
  16.  
  17. while ($rekord = mysql_fetch_assoc ($wynik)) 
  18. {
  19.  
  20.  
  21. $IdZamowienie=$rekord['IdZamowienie'];
  22. $Login= $rekord['Login'];
  23. $Film = $rekord['Film'];
  24. $Cena = $rekord['Cena'];
  25. $Data_Zamowienia = $rekord['Data_Zamowienia'];
  26.  
  27.  
  28. echo "<tr><td width='110'>".$Login."</td><td>".$Film."</td>";
  29. echo "<td>".$Cena."</td><td>".$Data_Zamowienia."</td>";
  30.  
  31.  
  32. echo "<td><input type=hidden name='Login[$i]' value=".$Login.">"; 
  33. echo "<input type=hidden name='Film[$i]' value=".$Film.">"; 
  34. echo "<input type=hidden name='Cena[$i]' value=".$Cena.">"; 
  35. echo "<input type=hidden name='Data_Zamowienia[$i]' value=".$Data_Zamowienia.">"; 
  36.  $i++;
  37. echo "<input type=checkbox name='IdZamowienie[]' value=".$IdZamowienie."></td></tr>";
  38. }
  39. echo "</table>";
  40.  
  41. //Po zaznaczeniu Checkboxa usuwa dane zamówienie
  42. echo "<table bgcolor='#CCCCCC' align='left' border='2' >";
  43. echo "<tr><td colspan='2' align='left'><input type='submit' value='Usuń zrealizowane zamówienie'>";
  44. echo "</td></tr></form></table>";
  45.  
  46.  
  47. echo "<table align=center>";
  48. echo "<center><font size=6><a href='index.php'>Wróć</a></font><center>";
  49. echo "</table>";
  50. ?>




i plik wykonawczy
  1. <?php
  2. require('baza.php');
  3.  
  4.  
  5. echo "zam: " .$IdZamowienie;
  6. if(!isset($IdZamowienie)) {
  7. echo '<font size=6>zaznacz stare zamówienie do skasowania</font>';
  8. echo "<font size=6><center><a href='zamowienia.php'>Wróć</a></center></font>";
  9. }
  10.  
  11. else {
  12.  
  13. //$i=0;
  14. while ( list( $key, $val ) = each( $IdZamowienie ) ) {
  15.  
  16.  $sel=mysql_query("SELECT * FROM zamowienie WHERE IdZamowienie = $val"); 
  17.  
  18. echo ("$key::$valn;");
  19. echo "Login:" .$Login[$key]. "<br/><br/>";
  20. echo "Film:" .$Film[$key]. "<br/><br/>";
  21. echo "Cena:" .$Cena[$key]. "<br/><br/>";
  22. echo "Data_Zamowienia:" .$Data_Zamowienia[$key]. "<br/><br/>";
  23.  
  24. $archiwum=mysql_query("INSERT INTO archiwum_zamowien (Zamawiajacy,Film,Cena,Data) VALUES ('${Login[$key]}','${Film[$key]}','{$Cena[$key]}','${Data_Zamowienia[$key]}')");
  25.  
  26. $del=mysql_query("DELETE FROM zamowienie WHERE IdZamowienie = $val");
  27.  
  28.  //$i++;
  29. }
  30.  
  31.  
  32. echo "<font size='10'><p>Zrealizowane zamówienie zostało usunięte<p></font>";
  33. }
  34. echo "<font size=8><a href='zamowienia.php'>Wróć</a></font>";
  35.  
  36. ?>


juz ze 100 sposobow robilem i nic angrysmiley.gif

pozdrawiam
Sedziwoj
  1. <?php
  2. //Odczyt z bazy danych
  3. require('baza.php');
  4. $wynik = mysql_query('SELECT * FROM zamowienie;') or die ('Blad w pytaniu');
  5. echo '<form action="usun_zamowienie.php" method="POST">':
  6. echo '<table cellpadding="5" border="1" width="100%" >';
  7. echo '<tr bgcolor="#CCCCCC"><td><b>Zamawiający</b></td><td><b>Film</b></td>';
  8. echo '<td><b>Cena</b></td><td><b>Data zamówienia</b></td><td><b>Usuń</b></td>';
  9. echo '</tr>';
  10. while ($rekord = mysql_fetch_assoc ($wynik)) 
  11. {
  12. $IdZamowienie = $rekord['IdZamowienie'];
  13. $Login = $rekord['Login'];
  14. $Film = $rekord['Film'];
  15. $Cena = $rekord['Cena'];
  16. $Data_Zamowienia = $rekord['Data_Zamowienia'];
  17. echo '<tr><td width="110">'.$Login.'</td><td>'.$Film.'</td>';
  18. echo '<td>'.$Cena.'</td><td>'.$Data_Zamowienia.'</td>';
  19. echo '<td><input type=hidden name="Login[]" value='.$Login.'>'; 
  20. echo '<input type="hidden" name="Film[]" value='.$Film.'>'; 
  21. echo '<input type="hidden" name="Cena[]" value='.$Cena.'>'; 
  22. echo '<input type="hidden" name="Data_Zamowienia[]" value='.$Data_Zamowienia.'>'; 
  23. echo '<input type="checkbox" name="IdZamowienie[]" value='.$IdZamowienie.'></td></tr>';
  24. }
  25. echo '</table>';
  26. //Po zaznaczeniu Checkboxa usuwa dane zamówienie
  27. echo '<table bgcolor="#CCCCCC" align="left" border="2" >';
  28. echo '<tr><td colspan="2" align="left"><input type="submit" value="Usuń zrealizowane zamówienie">';
  29. // a po co colspan ? przecież to tabela z jednym wierszem...
  30. echo '</td></tr></table></form>';
  31. echo '<table align="center">';
  32. //tabela wymaga zgrupowania i podziału na komórki
  33. echo '<tr><td>';
  34. echo '<center><font size="6"><a href="index.php">Wróć</a></font><center>';
  35. echo '</td></tr>';
  36. echo '</table>';
  37. ?>


usun_zamowienie.php
  1. <?php
  2. require('baza.php');
  3.  
  4. if(!isset($IdZamowienie)) {
  5. echo "zam: " .$IdZamowienie;//Możesz wyświetlić kiedy tylko jest!
  6. echo '<font size=6>zaznacz stare zamówienie do skasowania</font>';
  7. echo "<font size=6><center><a href='zamowienia.php'>Wróć</a></center></font>";
  8. }
  9. else {
  10.  $IdZamowienie = $_POST['IdZamowienie'];
  11.  //choć przydało by się spr. czy to jest to, to co powinno
  12.  while (list( $key, $val ) = each( $IdZamowienie )) {
  13. $sel = mysql_query('SELECT * FROM zamowienie WHERE IdZamowienie = '.$val) or die('Blad zapytania');
  14. echo "$key::$valn;";
  15. /* A to skąd masz?
  16. * przecież to co przesłałeś z formularza jest w tablicy $_POST
  17. echo "Login:" .$Login[$key]. "<br/><br/>";
  18. echo "Film:" .$Film[$key]. "<br/><br/>";
  19. echo "Cena:" .$Cena[$key]. "<br/><br/>";
  20. echo "Data_Zamowienia:" .$Data_Zamowienia[$key]. "<br/><br/>";
  21. * Co najwyżej tak:
  22. */
  23. $wynik = mysql_fetch_assoc($sel);
  24. echo 'Login:'.$wynik['Login'].'<br/><br/>';
  25. echo 'Film:'.$wynik['Film'].'<br/><br/>';
  26. echo 'Cena:'.$wynik['Cena'].'<br/><br/>';
  27. echo 'Data_Zamowienia:'.$wynik['Data_Zamowienia'].'<br/><br/>';
  28. $archiwum = mysql_query('INSERT INTO archiwum_zamowien (SELECT * FROM zamowienie WHERE IdZamowienie='.$val.')') or die('Nieudane dodanie do archiwum');
  29. /* Tak powinno działać, ale jakby coś było nie tak to:
  30. * $archiwum = mysql_query('INSERT INTO archiwum_zamowien (Zamawiajacy, Film, Cena, Data) VALUES (''.$wynik['Login'].'', ''.$wynik['Film'].'', ''.$wynik['Cena'].'', ''.$wynik['Data_Zamowienia'].'')');
  31. */
  32. $del=mysql_query('DELETE FROM zamowienie WHERE IdZamowienie = '.$val) or die('Nieudana kasacja');
  33. //$i++;
  34.  }
  35.  echo '<font size="10"><p>Zrealizowane zamówienie zostało usunięte<p></font>';
  36. }
  37. echo '<font size="8"><a href="zamowienia.php">Wróć</a></font>';
  38. ?>


Choć nadal jestem nad dodaniem do bazy reguły, po co robić coś samemu jak może być automatycznie?
Ale by mógł ktoś napisać czy w MySQL to jest, bo chwilowo nie chce mi się ściągać nowego manuala biggrin.gif
rybak84
Dzięki już jest lepiej smile.gif .

Ale gdy chce skasowac a w zapytaniu archiwum nie dopisalem "or die('Nieudane dodanie do archiwum'); " to wyswietla mi wszystkie zaznaczone filmy i je kasuje.

Gdy jednak dopisze do zapytania archiwum "or die('Nieudane dodanie do archiwum'); " i zaznacze np 2 opcje: to ten film ktory zaznacze pierwszy sie wyswietla a drugi juz nie!(czyli tak jakby tablica przekazywala jeden element?)
obydwa zapytania archiwum nie dzialaja, cholera wie co jest ja tego niestety nie widze sad.gif .
Sedziwoj
Właśnie po to jest to or die(), możesz dodać jeszcze mysql_error() to wyświetli komunikat błędu.
Zauważyłem, że wywaliło wszystkie znaki ucieczki z tego wykomentowanego zapytania spróbuj tego:
  1. <?php
  2. $archiwum = mysql_query('INSERT INTO archiwum_zamowien (Zamawiajacy, Film, Cena, Data) VALUES (''.$wynik['Login'].'', ''.$wynik['Film'].'', ''.$wynik['Cena'].'', ''.$wynik['Data_Zamowienia'].'')') or die('Nieudane dodanie do archiwum, komunikat: '.mysql_error().'<br />');
  3. ?>
rybak84
dzieki!!! dziala ale zapytanie z malutkimi poprawkami wyglada tak:

  1. <?php
  2. $archiwum = mysql_query("INSERT INTO archiwum_zamowien (Zamawiajacy, Film, Cena, Data) VALUES ('$Login', '$Film', '$Cena', '$Data_Zamowienia')") or die('Nieudane dodanie do archiwum, komunikat: '.mysql_error().'<br />');
  3. ?>



pozdrawiam i dziekuje jeszcze raz tongue.gif
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.