Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP][jQuery]Dodawanie rekordu do bazy i jednoczesne pokazywanie go na stornie.
Forum PHP.pl > Forum > Przedszkole
qqwwq
Witam,

Mam pytanie do Was, w jaki sposób dodając za pomocą jQuery dane do bazy, mogę jednocześnie sprawić aby te dane się pojawiły na stornie, gdzie powinny być wylistowane? Naturalnie po odświeżeniu strony zwykłym strukturalnym php je pobieram z bazy, ale czy można je pokazywać bez odświeżania?

Jeżeli mój obecny kod może coś pomóc, to teraz tak to dodaję do bazy bez przeładowania:

Formularz w html:
  1. <form id="task_add_content_form" method="post" action="">
  2. <ol>
  3. <li>
  4. <select name="add_task_user_id" id="add_task_user_id" size="1" class="form">
  5. <?php include("get_users.php"); ?>
  6. <?php echo $users_list; // lista użytkowników, po dodaniu zadania, user któremu dodaliśmy zadanie jest automatycznie wybierany. Przy użyciu linka do dodawania zadania konkretnemu userowi, także jest on automatycznie wybierany z listy ?>
  7. </select><span>użytkownik *</span>
  8. </li>
  9. <li>
  10. <select name="add_task_project_id" id="add_task_project_id" size="1" class="form">
  11. <?php include("get_projects.php"); ?>
  12. <?php echo $projects_list_head; // lista projektów, po dodaniu zadania, projekt do którego zostało ono dodane jest automatycznie wybierany. Przy użyciu linka do dodawania zadania konkretnemu projektowi, także jest on automatycznie wybierany ?>
  13. </select><span>projekt *</span>
  14. </li>
  15. <li>
  16. <textarea name="add_task_text" id="add_task_text" rows="" cols=""></textarea><span>tekst *</span>
  17. </li>
  18. </ol>
  19. <br style="clear:both;" />
  20. <div class="left">
  21. <input type="submit" value="" class="add" />
  22. </div>
  23. <div id="add_task_confirm" class="left confirm" style="display: none;">
  24. Zadanie zostało dodane
  25. </div>
  26. <div id="add_task_error" class="left error" style="display: none;">
  27. Pola z gwiazdkami * są wymagane<br />
  28. tekst / projekt / użytkownik
  29. </div>
  30. <br style="clear:both;" />
  31. </form>


jQuery:
  1. $(document).ready(function(){
  2. $("form#task_add_content_form").submit(function() {
  3. var add_task_user_id = $('select[name=add_task_user_id]');
  4. var add_task_project_id = $('select[name=add_task_project_id]');
  5. var add_task_text = $('textarea[name=add_task_text]');
  6.  
  7. if(add_task_user_id.val() == "") {
  8. $('div#add_task_error').fadeIn(400);
  9. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 6000);
  10. return false;
  11. }
  12.  
  13. if(add_task_project_id.val() == "") {
  14. $('div#add_task_error').fadeIn(400);
  15. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 6000);
  16. return false;
  17. }
  18.  
  19. if(add_task_text.val() == "") {
  20. $('div#add_task_error').fadeIn(400);
  21. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 6000);
  22. return false;
  23. }
  24.  
  25. var data = 'add_task_user_id=' + add_task_user_id.val() + '&add_task_project_id=' + add_task_project_id.val() + '&add_task_text=' + add_task_text.val();
  26.  
  27. $.ajax({
  28. type: "POST",
  29. url: "add_task.php",
  30. data: data,
  31. success: function(){
  32. $('textarea#add_task_text').val('');
  33. $('div#add_task_confirm').fadeIn(400);
  34. setTimeout(function(){ $("div#add_task_confirm").fadeOut(400) }, 4000);
  35. }
  36. });
  37. return false;
  38. });
  39. });


PHP:
  1. <?php
  2.  
  3. include("config.php");
  4.  
  5. $text = htmlspecialchars(trim($_POST['add_task_text']));
  6. $project_id = htmlspecialchars(trim($_POST['add_task_project_id']));
  7. $user_id = htmlspecialchars(trim($_POST['add_task_user_id']));
  8.  
  9. $insert = "INSERT INTO `tasks` (`task_id`, `user_id`, `project_id`, `task_text`, `task_status`) VALUES ('', '$user_id', '$project_id', '$text', '1')";
  10.  
  11. mysql_query($insert) or die(mysql_error());
  12. mysql_close($connection);
  13.  
  14. ?>


Z góry dziękuję za pomoc, wystarczą mi jakieś przykłady albo nawet poradniki, abym mógł zobaczyć, zrozumieć i przerobić.
hind
Do pliku w którym robisz insert (ostatni plik) dodaj json_encode(?decode? ten co robi z tablicy jsona) i na callbacku w ajaxie wyświetl, lub już podczas wysyłania sczytaj dane z forma i wyświetl gdzie Ci się podoba (ale tej metody nie polecam, bo nie ma się kontroli nad tym czy dane wysłane na pewno zostały zapisane).

Zobacz jakie argumenty przyjmuje $.ajax dla success (chyba jedyny argument to dane pobrane od serwera)
qqwwq
W jaki sposób mogę sprawdzić jakie argumenty przyjmuje $.ajax dla success? W kodzie widzę że mam:
  1. #
  2. success: function(){
  3. #
  4. $('textarea#add_task_text').val('');
  5. #
  6. $('div#add_task_confirm').fadeIn(400);
  7. #
  8. setTimeout(function(){ $("div#add_task_confirm").fadeOut(400) }, 4000);
  9. #
  10. }


I to faktycznie działa średnio ciekawie, bo jak zepsułem plik dodający dane do bazy, to ajax i tak pokazał że zadanie zostało dodane - a tak naprawdę zostały chyba tylko poprawnie wysłane dane POSTem do pliku php, a już sam plik powinien się wykrzaczyć z jakimiś syntax error albo źle formułowanym poleceniem do bazy - a tego nie zrobił. W związku z czym, jaką inną opcję polecasz aby to działało dobrze, a nie była to tylko taka prowizorka?
konrados
pierwszym parametrem funkcji w success jest właśnie "data" czyli to co zwrócił Twój plik add_task, tak więc:

  1. (...)
  2. success: function(data) {
  3. $('#jakis_div_id').html(data);
  4. }
  5. (..)


a w add_task.php robisz np:
  1. (...) coś tam z mysql a potem:
  2. echo "to co chcesz wypluć na stronę";

qqwwq
Ok, fajnie, i to w takim wypadku jeszcze muszę dodatkowo if'a dodać, który będzie sprawdzał czy się insert wykonał poprawnie, czy nie, i w obu wypadkach dodaję inny tekst? To w takim razie, rozumiem że linijka $('#jakis_div_id').html(data); dodaje ten tekst z echo do div'a o id="jakis_div_id", a jak przy okazji mogę sprawić, aby dla tego div'a zmienić atrybut css color, i w zależności od tego co zwróci plik php ( że się insert udał bądź nie ), dam czcionkę komunikatu na zielono bądź czerowno.

Ogólnie już używałem takiego kodu do czegoś innego:
Kod
document.getElementById('content_add_project').style.display='none';


Tylko to jest chyba javascript a nie ajas/jQuery, i to reagowało na onclicka ... więc jak używając jQuery, połączyć w tym success wyświetlanie tekstu, oraz zmianę jakiegoś elementu stylu w zależności od treści tekstu, czy jeszcze czegoś przekazanego przez plik php?
konrados
Cytat
Ok, fajnie, i to w takim wypadku jeszcze muszę dodatkowo if'a dodać, który będzie sprawdzał czy się insert wykonał poprawnie, czy nie, i w obu wypadkach dodaję inny tekst? To w takim razie, rozumiem że linijka $('#jakis_div_id').html(data); dodaje ten tekst z echo do div'a o id="jakis_div_id"


Wszystko się zgadza.

Cytat
a jak przy okazji mogę sprawić, aby dla tego div'a zmienić atrybut css color, i w zależności od tego co zwróci plik php ( że się insert udał bądź nie ), dam czcionkę komunikatu na zielono bądź czerowno.


Możesz w php (w add_task.php) zwrócić cały kod html, gdzie zrobisz ifa - jeśli insert się udał, w tym zwróconym kodzie dajesz zielonego diva, jak nie to czerwonego.

Albo, tak jak zasugerował Hind przerobić to wszystko na json. Czyli wysyłasz żądanie, add_task.php zwraca dane json, a Ty w skrypcie js robisz resztę - czyli na podstawie zwróconych danych (gdzie jednym z pól może być np. "error") robisz kod html. Więcej : http://www.factsandpeople.com/facts-mainme...ax-json-and-php lub (chyba lepsze) : http://www.phpriot.com/articles/php-json-j...ajax-screencast

Pierwsza opcja jest łatwiejsza i szybsza, druga bardziej przyszłościowa smile.gif
#luq
Cytat(qqwwq @ 23.11.2010, 18:24:52 ) *
Ogólnie już używałem takiego kodu do czegoś innego:
Kod
document.getElementById('content_add_project').style.display='none';


Tylko to jest chyba javascript a nie ajas/jQuery, i to reagowało na onclicka ... więc jak używając jQuery, połączyć w tym success wyświetlanie tekstu, oraz zmianę jakiegoś elementu stylu w zależności od treści tekstu, czy jeszcze czegoś przekazanego przez plik php?


Eh, tak to jest jak się odrazu zaczyna od jQ. @qqwwq poważnie, poczytaj jakiś kursik i JS`a i jQ, korzystaj też z dokumentacji jQ.


Cytat(konrados @ 23.11.2010, 18:40:39 ) *
Możesz w php (w add_task.php) zwrócić cały kod html, gdzie zrobisz ifa - jeśli insert się udał, w tym zwróconym kodzie dajesz zielonego diva, jak nie to czerwonego.


Można, aczkolwiek tak się robić nie powinno...
Najlepiej oczywiście odbierać obiekt, o czym zresztą już @konrados wspomniał.
qqwwq
Teraz mam taki kod:
  1. $("form#task_add_content_form").submit(function() {
  2. var add_task_user_id = $('select[name=add_task_user_id]');
  3. var add_task_project_id = $('select[name=add_task_project_id]');
  4. var add_task_text = $('textarea[name=add_task_text]');
  5.  
  6. if(add_task_user_id.val() == "") {
  7. $('div#add_task_error').html('Nie wybrano użytkownika');
  8. $('div#add_task_error').fadeIn(400);
  9. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 6000);
  10. return false;
  11. }
  12.  
  13. if(add_task_project_id.val() == "") {
  14. $('div#add_task_error').html('Nie wybrano projektu');
  15. $('div#add_task_error').fadeIn(400);
  16. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 6000);
  17. return false;
  18. }
  19.  
  20. if(add_task_text.val() == "") {
  21. $('div#add_task_error').html('Zadanie nie posiada treści');
  22. $('div#add_task_error').fadeIn(400);
  23. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 6000);
  24. return false;
  25. }
  26.  
  27. var data = 'add_task_user_id=' + add_task_user_id.val() + '&add_task_project_id=' + add_task_project_id.val() + '&add_task_text=' + add_task_text.val();
  28.  
  29. $.ajax({
  30. type: "POST",
  31. url: "add_task.php",
  32. data: data,
  33. success: function(data){
  34. if(data == "success"){
  35. $('textarea#add_task_text').val('');
  36. $('div#add_task_confirm').html('Zadanie zostało dodane');
  37. $('div#add_task_confirm').fadeIn(400);
  38. setTimeout(function(){ $("div#add_task_confirm").fadeOut(400) }, 4000);
  39. } else {
  40. $('div#add_task_error').html('Błąd połączenia z bazą<br />Skontaktuj się z administratorem');
  41. $('div#add_task_error').fadeIn(400);
  42. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 14000);
  43. }
  44. }
  45. });
  46. return false;
  47. });


I od razu mam pytanie. Posiadając kilka albo kilkanaście różnych możliwych formularzy na stronie, i każdego dopracować w ten sposób, że za pomocą jQuery sprawdza się wprowadzone dane po kolei, i wywala jakieś komunikaty, powoduje że taki plik .js będzie miał kilkanaście albo i kilkadziesiąt kb - no a to sporo. W z związku z czym, nie lepiej skorzystać z $.ajax({ }); oraz success, i aby plik php sprawdzał czy otrzymane dane są poprawne, zwracał jakiś komunikat i go jQuery wyświetlało na stornie? Jeżeli dobrze kombinuję, to zaleta będzie przy kilku sprawdzeniach, natomiast jeżeli ktoś będzie dużo rzeczy dodawał, i niepoprawnie, to wtedy zamiast co chwila uruchamiać jakiś plik php i generując transfer, lepiej by chyba było pobrać jeden plik js i trzymać go w cache przeglądarki?

I może od razu ktoś się orientuje - przejście na jakąś podstronę lub odświeżenie podstrony, powoduje ponowne pobranie plików js, czy sczytuje je właśnie z cache przeglądarki?

Do tego, dlaczego kod:
  1. if(data == "success"){
  2. $('textarea#add_task_text').val('');
  3. $('div#add_task_confirm').html('Zadanie zostało dodane');
  4. $('div#add_task_confirm').fadeIn(400);
  5. setTimeout(function(){ $("div#add_task_confirm").fadeOut(400) }, 4000);
  6. $('div#add_task_confirm').empty();
  7. } else {
  8. $('div#add_task_error').html('Błąd połączenia z bazą<br />Skontaktuj się z administratorem');
  9. $('div#add_task_error').fadeIn(400);
  10. setTimeout(function(){ $("div#add_task_error").fadeOut(400) }, 14000);
  11. }


A dokładniej ta funkcja empty() na końcu, powoduje że to wszystko nie działa? Tak jakby się to wykonywało jednocześnie, i zamiast po fadeIn, odczekać 4 sekundy na fadeOut, i następnie usunąć zawartość div'a add_task_confirm, on po prostu od razu ją usuwa? Tutaj nie działa jakaś kolejność kodu?

Druga sprawa. Jest jakiś sposób aby pobrać zawartość jakiegoś div'a, albo czegoś takiego? Np. chciał bym sobie pobrać zawartość div'a o id="test", oraz zawartość między akapitem <p></p> który się znajduje w div'ie o id="test", czy też zawartość między <p></p> o class="test_class", a to <p> znajduje się w divie o id="test" ... takie myki są możliwe? Osobiście znalazłem kawałek kodu:

  1. var imageTitle = $("select[name=image] option:first").attr('title');


Ale on odpowiada za pobranie wartości z title="", a jak z samym tekstem czy ewentualnie kodem?

O Jason czytałem, ale poza samym zrozumieniem tego, nie mam zielonego pojęcia jak by miało mi się to przydać do wyświetlenia dopiero co dodanych danych do bazy także na stronie ( bez jej odświeżenia ) ... znalazłem natomiast funkcję .appendTo():
http://api.jquery.com/appendTo/

... która dodaje jakiś element na stronie, i mógł bym ją do jednego if'a dołączyć - jeżeli $insert przejdzie, i dodawała by ona jakiegoś tam div'a z danymi na stronie, tylko problem jest taki ( patrząc wedle przykładów ), że po pierwsze taki div ląduje na końcu 'czegoś tam', a ja mam dane wyświetlone w pionowej kolumnie, w jakimś div'ie, z najświeższymi u góry. I druga sprawa, oprócz tych danych które sam uzupełniam, potrzebował bym znać ID dodawanego elementu - a tego nie znam, bo to już sobie baza sama dodaje ze względu na autoincrement.

btw. dziękuję wszystkim za dotychczasowe rady. #luq jeżeli masz jakiś dobry poradnik od js czy jQuery to chętnie poczytam, chyba że chciałeś abym się dowiedział że jQuery jest biblioteką dla js winksmiley.jpg
#luq
Cytat(qqwwq @ 24.11.2010, 07:23:52 ) *
Posiadając kilka albo kilkanaście różnych możliwych formularzy na stronie, i każdego dopracować w ten sposób, że za pomocą jQuery sprawdza się wprowadzone dane po kolei, i wywala jakieś komunikaty, powoduje że taki plik .js będzie miał kilkanaście albo i kilkadziesiąt kb - no a to sporo


Popatrz ile kodu Ci się powtarza. Zbuduj jakąś klasę albo poszukaj jakiegoś plugina do jQ.

Cytat
I może od razu ktoś się orientuje - przejście na jakąś podstronę lub odświeżenie podstrony, powoduje ponowne pobranie plików js, czy sczytuje je właśnie z cache przeglądarki?

Cache.

Cytat
A dokładniej ta funkcja empty() na końcu, powoduje że to wszystko nie działa? Tak jakby się to wykonywało jednocześnie, i zamiast po fadeIn, odczekać 4 sekundy na fadeOut, i następnie usunąć zawartość div'a add_task_confirm, on po prostu od razu ją usuwa? Tutaj nie działa jakaś kolejność kodu?


Jak najbardziej wszystko działa zgodnie z kolejnością. Dokładnie sprawdź co robi setTimeout. (btw. w jQ jest delay)

Cytat
Jest jakiś sposób aby pobrać zawartość jakiegoś div'a, albo czegoś takiego?

W pierwszym lepszym kursie jQuery to znajdziesz, w dokumentacji także.

Cytat
O Jason czytałem, ale poza samym zrozumieniem tego, nie mam zielonego pojęcia jak by miało mi się to przydać do wyświetlenia dopiero co dodanych danych do bazy także na stronie

A czym jest Jason?

Cytat
(...) a ja mam dane wyświetlone w pionowej kolumnie, w jakimś div'ie, z najświeższymi u góry

Do-ku-men-ta-cja.

Cytat
potrzebował bym znać ID dodawanego elementu - a tego nie znam, bo to już sobie baza sama dodaje ze względu na autoincrement

A w PHP się tego nie da pobrać? [ironia on]Nie wiem ja się nie znam[ironia off]

Cytat
#luq jeżeli masz jakiś dobry poradnik od js czy jQuery to chętnie poczytam, chyba że chciałeś abym się dowiedział że jQuery jest biblioteką dla js

Wyjaśnijmy sobie coś. Ja tu jestem tylko po to aby pomagać i samemu czegoś nowego/fajnego się nauczyć a nie po to żeby robić z ludzi osłów. Więc aluzja, że moja rada, żebyś poczytał i zaznajomił się z JS`em i jQ jest tylko po to aby się wywyższyć i zrobić z Ciebie idiotę jest nie na miejscu.
Czy uważasz, że wiedząc czym jest jQuery umiesz w nim tworzyć? Jeśli tak myśleć to ja fantastycznie znam Jave, Pythona, umiem świetnie piec ciasta, rozpalać ognisko kamieniem w ulewnym deszczy no i oblatuje F16...
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.