Returnare date de la PHP la Ajax

Discutii si intrebari legate de scripturi si functii JavaScript, jQuery si Ajax, cod JavaScript in general.
andras
Mesaje: 430

Returnare date de la PHP la Ajax

Am facut o functie ajax() cu jQuery ca mai jos.
problema e ca merge doar in fisierul ajax.php, imi salveaza in variabila SESSION, dar la succes: nu pune raspunsul ajax in:

Cod: Selectaţi tot

alert('a venit raspuns '+raspuns);
si nici nu pune valoarea in div-ul din pagina curenta:

Cod: Selectaţi tot

$("#resp").html(raspuns);
Am gresit undeva?

functia din fisierul html:

Cod: Selectaţi tot

<script type="text/javascript">
function clicu(e){		// parametrul (e) este ID-ul liniei pe care vreau sa-l pus in SESSION
$(document).ready(function(){
    var id = e;
    var data_json = {"id":id};
my_ajax("ajax.php",data_json,"post");
function my_ajax(url,data_json,type){
$.ajax({
	async: false,
    type: type,
    url: url,
    data: data_json,
    success: function(raspuns, status, xhr){
    if(status=="success") {		
      $("#resp").html(raspuns);
      alert('a venit raspuns '+raspuns);
    }
    else { alert(status+ ' - '+ xhr.status); }
  },
 error: function(jqXHR, exception) {
            if (jqXHR.status === 0) {
                alert('Not connect.\n Verify Network.');
            } else if (jqXHR.status == 404) {
                alert('Requested page not found. [404]');
            } else if (jqXHR.status == 500) {
                alert('Internal Server Error [500].');
            } else if (exception === 'parsererror') {
                alert('Requested JSON parse failed.');
            } else if (exception === 'timeout') {
                alert('Time out error.');
            } else if (exception === 'abort') {
                alert('Ajax request aborted.');
            } else {
                alert('Uncaught Error.\n' + jqXHR.responseText);
            }
        }
});
}
});
}​
</script>
ajax.php:

Cod: Selectaţi tot

<?php
session_start();
$nm = $_REQUEST['id'];
$_SESSION['id'] = $nm;
 ?>

MarPlo Mesaje: 4343
Salut
Problema e ca scriptul php nu returneaza nimic la browser.
Ajax primeste ca raspuns valorile output /trimise de server ca date de iesire.
Pe scurt trebuie aplicat un "echo" sau "print" in php:

Cod: Selectaţi tot

<?php
session_start();
$nm = $_REQUEST['id'];
$_SESSION['id'] = $nm;
echo $nm; 

andras Mesaje: 430
In sfirsit! Imi apare totul OK. Nopti intregi m-am chinuit cu problema asta pana am descoperit acest forum.

Mai am un singur "hop" de trecut: am in pagina curenta un input, ceva de genul:

Cod: Selectaţi tot

<form action="#" method="POST"  id="idascuns"><input type="text" id="resp" name="resp" value="" /></form>
iar in functia ajax() la success: am pus:

Cod: Selectaţi tot

  success: function(raspuns) {
   	$('#resp').val(raspuns);
	$('#idascuns').submit(function(){return true;});
   },
deci, la completarea textului din formular de catre ajax, se face automat si submit. Pana aici am testat si merge (adica afiseaza valoarea in html (#resp), nu pot sa testez daca sintaxa pentru submit e corecta).
Cum preiau acel $_POST['resp'] pentru a-l folosi (tot in pagina curenta) la un query:

Cod: Selectaţi tot

SELECT * from tabel where id=$_POST['resp']
- dar fara reload pagina curenta?
Sau poate exista alta cale, fara <form>, pentru ca mie imi trebuie in php doar valoarea din acel html input (#resp). Multumesc.

MarPlo Mesaje: 4343
Il poti prelua in javascript /jquery tot asa cum l-ai adaugat, adica:

Cod: Selectaţi tot

var id = $('#resp').val();
Dupa ce este adaugat in #resp. Apoi il trimiti cu Ajax dupa cum stii.

andras Mesaje: 430
Dar cu Ajax il trimit in alta pagina (ajaxnou.php). Cum il aduc in PHP in pagina curenta, ca si daca il pun in ajaxnou.php in SESSION tot trebuie reincarcata pagina curenta? Sau fac restul de interogari in ajaxnou.php unde am deja variabila? Sau se poate in pagina curenta cu include_once('ajaxnou.php')? Marturisesc ca aici nu prea stiu...

MarPlo Mesaje: 4343
Depinde ce vrei sa obtii, pot exista mai multe solutii.
Daca vrei sa schimbi datele din pagina fara refresh, se aplica ajax, si lucrezi in javascript cu raspunsul de la php.
Pe partea de server poti retine in $_SESSION valorile pe care vrei sa le folosesti in fisiere php sau accesari diferite.
Accesezi cu ajax ce fisier vrei, in php flosesti datele de la ajax ssu din $_SESSION, faci Select si ce mai trebuie, iar cu "echo" trimiti raspunsul pe care il prelucrezi in javascript.
Restul depinde sa incerci, vezi ce iese, cu "echo" in php si alert() in javascript; iar din astea iti dai seama ce sa mai schimbi, pana reusesti.

andras Mesaje: 430
Simplificat, ordinea logica ar fi urmatoarea: am in baza de date 2 tabele, o tabela parinte (tabela1) si o tabela copil (tabela2). Din diverse ratiuni, nu pot face un query de pe ambele tabele (SELECT t1.*, t2.* from tabela1 t1 inner join tabela2 t2), asa ca:
- la incarcarea paginii curente, se executa query1 din parinte tabela1 (SELECT * from tabela1). Rezultatul il pun intr-un tabel html - htmltabel1 (rezolvat)
- la click pe o linie din tabel html, se preia cu ajax ID-ul liniei, se salveaza in SESSION si se afiseaza intr-un element (<input>) in pagina curenta (rezolvat).
- cu acest ID se executa query2 din tabela copil (pseudocod -SELECT * from tabela2 where id=id-ul preluat (SESSION) din tabela1) (nerezolvat)
- se afiseaza rezultatul intr-un alt tabel html (htmltabel2) in pagina curenta (sub tabelul principal), fara reload page (nerezolvat).

Deci, la fiecare click pe htmltabel1 se schimba continutul htmltabel2 in pagina curenta, fara reload page. Acum imi dau seama ca ceea ce vreau este foarte greu de realizat (poate chiar imposibil) fara reload page. Numai ca toata aplicatia se bazeaza pe aceste click-uri in htmltabel1 care trebuie sa faca filtre in alte tabele si toate fara reload page. Am nevoie o mica indrumare cum sa procedez. Multumesc.

MarPlo Mesaje: 4343
In functia de la "success:" din primul ajax apelezi o alta functie ajax care acceseaza fisierul php pentru Select in tabel2.
In acel fisier iei id-ul care e deja in sesiune (sau il poti trimite iar), faci selectul, iar cu "echo" returnezi un tabel html cu datele.
Aest tabel html e primit ca raspuns in a doua functie ajax, si-l incluzi intr-un Div unde vrei.
Cam asa:

Cod: Selectaţi tot

function ajax2(phpfile, data, callback) {
  $.ajax({
    type: 'POST',
    url: phpfile,
    data: data,
    success: function(raspuns){
      callback(raspuns);
    }
  });
}

function ajax1() {
  // ...
  success: function(raspuns) {
    $('#resp').val(raspuns);
    ajax2('fisier.php', '', function(resp){
      $('#id_div').html(resp);
    });
  }
}
- Sau, mai simplu, cu un singur ajax, cand apelezi fisierul php cu id-ul, faci si select-ul in tabel2, si returnezi cu "echo" tabelul html pe care il adaugi cu javascrpt intr-un div. Asa nu mai e nevoie nici de $_SESSION.

andras Mesaje: 430
Multumesc, MarPlo! Am reusit sa fac sa apara exact cum doresc. Trec la etapa urmatoare. Stii de ce ma bucur? Am depus o imensa munca de documentare, am accesat sute de link-uri in limba engleza, dar pana la urma raspunsul corect a venit tot de la un roman. Salut !

Subiecte similare