Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP][AJAX] Zwracanie rekordów w pętli

Napisany przez: Fred1485 20.06.2015, 13:05:06

Cześć,

Myślałem, że pójdzie łatwo a tutaj niestety z wielkim problemem się spotkałem, do rzeczy:

  1. try {
  2. $string = $_POST['string'];
  3.  
  4. $database = new PDO('mysql:host=localhost;dbname=x', 'x', 'xi');
  5. $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6. $database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  7.  
  8. $query = $database->query("SELECT imie, nazwisko, klasa FROM uczniowie WHERE imie LIKE '%$string%'");
  9.  
  10. while($s = $query-> fetch()) {
  11. http://www.php.net/echo json_encode($s['imie']);
  12. }
  13. }
  14. catch(Exception $e) {
  15. //chwilowo niepotrzebne
  16. }


  1. $(function() {
  2. $('input').on('input', function() {
  3. var value = $(this).val();
  4.  
  5. $.ajax({
  6. type: 'post',
  7. url: 'search.php',
  8. dataType: 'json',
  9. data: {
  10. string: value
  11. },
  12. success: function(data) {
  13. $('#result').html(data);
  14. },
  15. error: function() {
  16. alert('blad');
  17. }
  18. });
  19. });
  20. });


Wywala cały czas błąd, zaznaczam że jak by był jeden rekord zwrócony w zapytaniu to wszystko działa, czy nie da rady w pętli przekazać wyników?

Napisany przez: Szymciosek 20.06.2015, 13:10:40

Jaki błąd?

Nie możesz przenieść iteracji z php do js?
Zwracasz wtedy cały wynik i iterujesz po nim po stronie klienta.

Napisany przez: Fred1485 20.06.2015, 14:24:18

No niby tak czyli muszę w PHP zwrócić całą tablicę z wszystkimi rekordami i dopiero w js to rozpakować na dane? Ale w takim razie jak w formacie JSON sobie to wyiterowac?

Napisany przez: Szymciosek 20.06.2015, 15:18:02

Lekturka:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

Napisany przez: Fred1485 20.06.2015, 16:53:49

Ok rozumiem, tylko że powyższe opcje u mnie się nie nadadzą raczej. Pewnie muszę dane w JSON zamienić na tablicę a potem to wyiteruję

Napisany przez: Pyton_000 20.06.2015, 16:58:41

W php masz zwrócić kompletną tablicę zakodowaną w JSON, a w JS sobie na niej pracować.

W tej chwili odbierasz dane w niepoprawnym formacie, bo są to kolejno zakodowane tablice które po złączeniu nie są poprawne.

Napisany przez: Fred1485 20.06.2015, 17:14:14

czyli tak?

  1. try {
  2. $string = $_POST['string'];
  3.  
  4. $database = new PDO('mysql:host=localhost;dbname=x', 'x', 'xi');
  5. $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6. $database->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  7.  
  8. $query = $database->query("SELECT imie, nazwisko, klasa FROM uczniowie WHERE imie LIKE '%$string%'");
  9.  
  10. $result = $query->fetchAll();
  11. }
  12. catch(Exception $e) {
  13. //chwilowo niepotrzebne
  14. }

Napisany przez: Turson 20.06.2015, 17:17:17

Wypluj json_encode($result)
a w JS w success ajaxa $.parseJSON i iterujesz w JS

Napisany przez: Fred1485 20.06.2015, 17:30:32

Tak tylko że PHP ewidentnie mi nie zwraca w formacie JSON (w konsoli wywala błąd "SyntaxError: JSON.parse: unexpected end of data..."), dumpując w PHP tablicę otrzymuję:

  1. string(104) "[{"imie":"Patryk","nazwisko":"Szybki","klasa":"1LI"},{"imie":"Patrycja","nazwisko":"Lama","klasa":"1Z"}]"

Napisany przez: Turson 20.06.2015, 17:37:22

Jak wypluwasz JSONa?

Napisany przez: Fred1485 20.06.2015, 17:40:36

  1. $result = $query->fetchAll();
  2. http://www.php.net/die(json_encode($result));
  3.  

Napisany przez: Pyton_000 20.06.2015, 18:09:45

json jest poprawny, w takim razie Twój JS leży

Napisany przez: Fred1485 20.06.2015, 18:28:57

Jakieś sugestie? Skrypt w js jest taki jak w pierwszym poście, nic innego. Próbowałem wywalić wszystko i zostawić talko $.parseJSON ale błąd jest ciągle i coś z tymi danym musi być nie tak

// tak w istocie to po tutaj używać $.parseJSON? Skoro do tablicy to wszystko wywalić to ta funkcja będzie odpowiednia?
Próbując doszedłem, że można to zrobić po prostu tak:

  1. var data = [
  2. {
  3. "imie": "Patryk",
  4. "nazwisko": "Szybki",
  5. "klasa": "1LI"
  6. },
  7. {
  8. "imie": "Patrycja",
  9. "nazwisko": "Lama",
  10. "klasa": "1Z"
  11. }
  12. ]
  13.  
  14. for(var i=0;i<=a.length;i++) {
  15. alert(a[i].imie);
  16. }
  17.  
  18.  


przecież działa w 100% czy jest to zgodne ze 'standardami'?

Napisany przez: nospor 21.06.2015, 11:02:17

Cytat
/ tak w istocie to po tutaj używać $.parseJSON? Skoro do tablicy to wszystko wywalić to ta funkcja będzie odpowiednia?

Oczywiscie ze juz nie musisz stososowac $.parseJSON, gdyż śląc ajaxa okresliles, ze dane mają byc JSON i jquuery konwertuje to na JSON automatycznie, tak wiec w success masz juz poprawną tablice JSON. Teraz wystarczy tylko ze poniej ziterujesz.


ps: oczywiscie oprocz json_encode($result), wypadaloby rzucic odpowiednim naglowkiem informujac przelgadarke ze to JSON idzie.

Napisany przez: Fred1485 21.06.2015, 11:22:00

  1. http://www.php.net/header('Content-Type: application/json');
załatwi sprawę czy trzeba coś jeszcze kombinować?

Napisany przez: nospor 21.06.2015, 11:26:48

wystarczy to

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)