Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]tablica POST z kluczem przyrastającym o 1 i baza danych
Forum PHP.pl > Forum > Przedszkole
eFK
Witam wszystkich serdecznie

Są to dość teoretyczne rozwarzania, a kod jest napisany przez mnie z czystej ciekawości czy coś takiego da się zrobić, taki system poprawiania "hurtowo"danych z DB.

I. pobiera dane z DB
II. wyświetlam je w formularzu
III pola formularza mają nazwę: ++i
IV. poprawiam co potrzebóje
V. przy pomocy pętli for updejtuje DB

teraz kod:
  1. <?php header('Content-Type: text/html; charset=utf-8');
  2.  
  3. try
  4. {
  5.  
  6. $pdo = new PDO('mysql:host=localhost;dbname=niop', 'niop, 'niop');
  7. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8. #echo 'ok';
  9.  
  10. $arg1nr=0; //pobieram dane z DB i wyświetlam w inpucie
  11. $sql = $pdo->query("SELECT arg1, arg2, addinf FROM ang_in_on_at");
  12. while($row = $sql->fetch())
  13. {
  14. $arg1=$row['arg1'];
  15. $arg2=$row["arg2"];
  16. $addinf=$row["addinf"];
  17.  
  18. echo '
  19. <form action="delete1.php" method="post">
  20. <input type="text" name="'. ++$arg1nr .'" value="'.$arg1 .'">'; //nazwa inputa przyrasta o 1
  21.  
  22. }
  23.  
  24. echo '
  25. <input type="submit" name="button" value="send">
  26. </form>';
  27.  
  28. $sql = $pdo -> prepare("SELECT COUNT(arg1) FROM `ang_in_on_at`"); //sprawdzam ile wierszu ma DB, aby ograniczyć ilość obrotów pętli
  29. $sql -> execute();
  30. $countrow = $sql -> fetch();
  31. echo 'points:&emsp;' .$countrow[0] .'<br />';
  32.  
  33. if ($_POST["button"]=='send')
  34. {
  35. for ($arg1nr=0;$arg1nr<=$countrow[0];++$arg1nr) //chcę by przy każdym ruchu pętli dodawał się kolejny rekord DB, z danymi wpisanymi do formularza, z których te które trzeba będa poprawione
  36. {
  37. print $_POST[$arg1nr];
  38. #$sql = $pdo->query("UPDATE ang_in_on_at SET `arg1`='$_POST[$arg1nr]'");
  39. #echo $arg1nr;
  40. #var_dump($_POST);
  41. }
  42. }
  43.  
  44.  
  45. }
  46. catch(PDOException $e)
  47. {
  48. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  49. }
  50.  
  51.  
  52. ?>


Wszystko działa pięknie do momentu update. Skrypt czyści wszystkie pola kolumny tabeli, zamiast dodawać poprawione dane.

Dlatego moje pytanie brzmi, czy to w ogóle da się zrobić? A jeżeli tak, to gdzie mam zacząć szukać błędu? Sprawdziłam, tablica POST na pewno poprawnie przejmuje dane z formularza. Czyli problem jest gdzieś w miejscu wkładania ich do DB. Tylko gdzie?
Damonsson
brakuje WHERE w UPDATE
eFK
Hej

Spróbowałam dodać klauzurę WHERE - zadziałało pod tym wzgledem, że zamienia wszystkie dane w DB na to, co wpisałam w pierwszym z okienek formularza. A ja potrzebuje aby hurtowo zamieniało wszystkie dane z tabeli, ale na różne dane.

Powiedzmy, że mam w BD ( i wyświetlam, każdą daną w swoim input)

a
g <- potrzebuje by było "b"
c
d
wyślij

Wyświetlam, zamieniam tę jedną daną i hurtowo wysyłam wszystko do DB. Każda z tych danych jest w oddzielnym wierszu tabeli.
Czy to w ogóle możliwe? A może da się to zrobić inaczej?
Damonsson
Przeczytaj jakiś kurs PHP + MySQL. To przedszkole, a nie żłobek.
Forti
Kilka miesięcu temu robiłem coś podobnego u siebie. Pobierasz całą tabele i każde z pół przypisujesz odpowiedniemu polu html np. z value. Można to zrobić w pętli itp.

zobacz przykład:

  1. <?php
  2.  
  3. if(isset($_POST['aktualizuj'])){
  4.  
  5.  
  6.  
  7.  
  8. $dodaj = $baza->prepare("UPDATE users SET updatetime = NOW(), battle = :battle, tag = :tag, achiv = :achiv, avatar = :avatar, sygnatura = :sygnatura, o_sobie = :osobie WHERE login = :login");
  9. $dodaj->bindValue(":battle", $_POST['battle'], PDO::PARAM_STR);
  10. $dodaj->bindValue(":tag", $_POST['tag'], PDO::PARAM_INT);
  11. $dodaj->bindValue(":achiv", $_POST['achiv'], PDO::PARAM_INT);
  12. $dodaj->bindValue(":avatar", $_POST['avatar'], PDO::PARAM_STR);
  13. $dodaj->bindValue(":sygnatura", $_POST['sygnatura'], PDO::PARAM_STR);
  14. $dodaj->bindValue(":osobie", $_POST['osobie'], PDO::PARAM_STR);
  15. $dodaj->bindValue(":login", $_SESSION['login'], PDO::PARAM_STR);
  16. $dodaj->execute();
  17. echo 'Dane zostały zaaktualizowane!
  18. <meta http-equiv="Refresh" content="0; url='.$nurl->Url('log=profil/id/'.$id.'').'"" />';
  19. }
  20.  
  21. else {
  22. ?>
  23.  
  24. <form id="contact-form" method="post" action="">
  25. <label for="email_again"><span class="text-form">Podaj swój Battle.tag: (nie wymagane)</span>
  26. <input type="text" maxlength="255" name="battle" class="btag" value="<?= $profile['battle'] ?>"/>#<input type="text" maxlength="4" name="tag" class="btag" value="<?= $profile['tag'] ?>"/><br /></label>
  27.  
  28. <label for="avatar"><span class="text-form">Avatar (55x55, link http):</span>
  29. <input type="text" name="avatar" maxlength="50" class="formularz" value="<?= $profile['avatar'] ?>" /></label>
  30.  
  31. <div class="wrapper">
  32. <div class="text-form">Sygnatura (100znaków):</div>
  33. <div class="extra-wrap">
  34. <textarea type="text" name="sygnatura" maxlength="100" cols="50" rows="5" id="sygnatura"><?= $profile['sygnatura'] ?></textarea></label>
  35. </div>
  36. </div>
  37.  
  38. <div class="wrapper">
  39. <div class="text-form">O sobie (200 znaków):</div>
  40. <div class="extra-wrap">
  41. <textarea type="text" name="osobie" maxlength="200" cols="50" rows="5" id="osobie"><?= $profile['o_sobie'] ?></textarea>
  42. </div>
  43. </div>
  44.  
  45. <label for="achiv"><span class="text-form">Achievment:</span>
  46. <input type="text" name="achiv" maxlength="4" class="formularz" value="<?= $profile['achiv'] ?>" /></label>
  47.  
  48.  
  49.  
  50. <input class="button" type="submit" name="aktualizuj" value="Aktualizuj" />
  51. </form>
  52. <?php
  53. }


Oczywiście kod można przerobić dowolnie i pobrać wszystkie rekordy z bazy (powyżej pobiera jeden). Wówczas całość wypisujesz w pętli.

Jeżeli źle cie zrozumiałem to sorka wink.gif
eFK
Forti: trochę mnie źle zrozumiałeś. U ciebie każde pole inputu ma swoją niepowtarzalną nazwę (battle, tag, archiv itd) i jest powiazane z konkretną kolumną tabeli.
U mnie co prawda każde pole input tez ma swoją niepowtarzalną nazwę, ale stworzoną przez przyrastanie zmiennej o 1. I jeżeli chodzi o wyświetlanie w ten sposób danych z DB to działa. Ale w drugą stronę, przy UPDATE już sprawia problemu.
Ale pewnie wynika to z mojej małej wiedzy.

Damonsson: Możesz poradzić coś dobrego do poczytania na temat php/mysql?
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.