Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    105

    variabile javascript in PHP

    Salve a tutti, avrei la necessit� di prendere una variabile javascript ed utilizzarla in PHP. Mi spiego meglio: ho una select da cui seleziono un elemento, questo elemento mi serve per eseguire una query nella stessa pagina in cui mi trovo, ora, per far comunicare i due linguaggi differenti (lato CLIENT e lato SERVER), utilizzo AJAX. Lo script funziona, ma l'elemento raccolto, non viene inserito nella variabile PHP, ma inserito all'interno del DIV di destinazione, per intenderci, come se scrivessi:

    codice HTML:
    <div id="risultato"> ciao </div>
    mentre quello che mi serve � immettere ciao in una variabile PHP per poi utilizzarla: $prova="ciao";

    Questo � il codice:

    codice:
    <script type="text/javascript">
              $(document).ready(function() {
                    $("#form_1").change(function(){
    
                        var nome = $("#n_1").val();  //valore della select, funzionante
                        $.ajax({                                    
                              type: "POST",                                    
                              url: "prova.php",
                              data: {valore : nome},
                              dataType: "html",    
                              success: function(risultato)
                              {                                        
                                   $("#risultato").html(nome); 
                              },
                                    error: function(er) {        
                                           var status = er.status;
                                           var text = er.statusText;            
                                           var message = status + ': ' + text;
                                           alert(message);        
                                    }
                         });
                      });
                   });

    Poche righe pi� in basso, cerco di raccogliere i dati:

    codice:
    <div id="risultato" name="risultato">
           <?php  $n_1= $_POST['nome']; 
                   echo $n_1; 
           ?>
    </div>
    Ci� che mi aspetto � di vedere riempita la varibile $n_1, ma niente, all'avvio della pagina mi da errore perch� non riconosce 'nome' alla riga $n_1= $_POST['nome']; (il ch� ci pu� stare perch� al primo avvio non ho ancora selezionato il valore della select), quando seleziono il valore, l'errore scompare e viene sostituito con la scelta della select in modo corretto. Il problema � che non raccolgo il risultato nella variabile PHP.

    Qualcuno sa, per favore, come risolvere il problema? Grazie

  2. #2
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,162
    semplicemente non puoi. nel momento che js entra in funzione php non esiste più. il server ti ha restituito l'html e puoi lavorare solo su quello.
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    105
    A questo punto, se AJAX mi ritorna solo un valore HTML, è inutile fare questo giro e utilizzare solo e direttamente javascript. Poi, siccome in molti esempi ho visto il passaggio delle variabili tramite POST in questo modo

    codice:
    $n_1= $_POST['nome'];
    mi chiedo a cosa serva.
    C'è qualche modo per aggirare il problema?

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,286
    Ciao, dal codice che hai postato non è troppo chiaro cosa stai cercando di fare, penso tu stia facendo un po' di pasticci.
    Hai indicato che ti serve effettuare una query dopo la selezione di un valore da un select
    questo elemento mi serve per eseguire una query nella stessa pagina
    suppongo tu intenda una query ad un DB via PHP. Nal codice PHP però non vedo alcuna query.

    Tieni conto che la chiamata AJAX restituisce esattamente ciò che viene restituito dalla pagina PHP, che di base è una stringa testuale. In genere, nella situazione che hai descritto, la chiamata AJAX dovrebbe puntare ad uno script PHP che ad esempio recupera i dati da un DB e restituisce una qualche stringa, magari con i dati elaborati.

    Certamente, tramite la chiamata AJAX, puoi passare al PHP dei parametri via POST, così come hai fatto. Fai però attenzione a ciò che hai scritto: data:{valore:nome} indica che stai passando un parametro che esattamente si chiama "valore"; per cui nel tuo codice PHP lo puoi recuperare in questo modo: $_POST['valore']; mentre tu hai scritto $_POST['nome'];

    Seconda cosa, ciò che restituisce il PHP te lo troverai nell'argomento della funzione callback del success.
    Nel tuo script hai [/highlight]success:function(risultato)[/highlight] per cui la stringa che ti dovrebbe restituire il PHP la trovi esattamente nella variabile risultato (argomento della funzione), mentre vedo invece che poi hai usato la variabile nome per aggiornare l'HTML; perché?
    codice:
    success: function(risultato)
    {                                        
         $("#risultato").html(nome); 
    }
    Chiaramente non può funzionare così. La cosa mi sembra abbastanza confusa.

    Prova a correggere questi punti.
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 15% tra i post del forum; il 9% sul web.
    Ti resta l’1% ... usalo bene!

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    105
    La query � l'obiettivo finale, non l'ho messa perch� il problema avviene prima, e cio� il recupero del dato utile per poi fare la query.
    Per quanto riguarda ci� che dici su data:{valore:nome} � vero, � logico come dici tu ed infatti ero partito da qui, utilizzando poi, per il recupero del dato, $_POST['valore']; ma non funzionava e cos� ho provato $_POST['nome']; entrambi danno lo stesso risultato; valore sconosciuto sia per 'valore' che per 'nome'.

    Laseconda obiezione che mi fai � questa:
    codice:
    success: function(risultato)
    {                                        
         $("#risultato").html(nome); 
    }
    ho utilizzato nome perch� se metto 'risultato', all'interno del DIV di destinazione, mi carica l'intera pagina, quindi mi ritrovo una pagina all'interno di un'altra con 2 intestazioni 2 men� ecc... mentre mettendo 'nome', all'interno del DIV avr� solamente il dato che effettivamente mi serve, il problema � che non viene raccolto dalla variabile PHP come mi aspetto, utilizzando $_POST['nome'];

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,286
    Ok, chiaramente per data:{valore:nome} deve seguire $_POST['valore']; e su questo non si può discutere.

    Non era chiaro che tu stessi richiamando la stessa pagina PHP anche per recuperare quei dati. Teoricamente sarebbe meglio che la chiamata AJAX punti ad uno script PHP a sé, che restituisca solo ciò che deve essere poi appiccicato sulla pagina HTML, in modo da ridurre il traffico di dati all'essenziale e avere comunque una gestione più specifica delle varie funzioni.

    Tuttavia è possibile comunque aggiornare giusto il contenuto di uno specifico elemento richiamando la stessa pagina (per intero) come stai cercando di fare. A tal proposito jQuery mette a disposizione il metodo load() che sostanzialmente è una chiamata AJAX semplificata ma con delle particolari funzionalità.

    Al posto dell'intera chiamata AJAX puoi mettere una cosa del genere:
    codice:
    $('#risultato').load('prova.php #risultato', {valore : nome}, function(response, status, xhr){
       if ( status == "error" ) alert(xhr.status + ': ' + xhr.statusText); 
    });
    In sostanza dentro #risultato, della pagina aperta, viene caricato (via AJAX) il contenuto che sta dentro #risultato della pagina richiamata, passando dei parametri in POST. La cosa viene fatta in automatico, il callback in questo caso serve solo per definire l'eventuale stato di errore della chiamata AJAX.

    Vedi se può andare.





    EDIT: rileggendo meglio il tuo post, in effetti era chiaro che si trattava della stessa pagina
    questo elemento mi serve per eseguire una query nella stessa pagina in cui mi trovo
    Ad ogni modo resta valido quanto ho indicato qui.
    Ultima modifica di KillerWorm; 20-03-2019 a 16:27
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 15% tra i post del forum; il 9% sul web.
    Ti resta l’1% ... usalo bene!

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    105
    Ho seguito i tuoi consigli e funziona, ma è lentissimo... tra quando seleziono la select e la risposta passano circa 30 secondi, decisamente troppi. Non c'è altro che si possa fare?

  8. #8
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,286
    tra quando seleziono la select e la risposta passano circa 30 secondi, decisamente troppi
    Chiaramente il sistema che stai usando deve trasferire l'intero contenuto HTML della pagina per ogni chiamata AJAX, da questo, una volta arrivato al client, viene poi estrapolata la parte specificata. Se il contenuto della pagina è lungo, è possibile che si creino dei rallentamenti nella risposta ma, a prescindere dal sistema usato, 30 secondi sembrano eccessivi anche a me.

    Non c'è altro che si possa fare?
    Intanto bisognerebbe accertarsi che non ci sia qualcos'altro che sta rallentando la risposta del server.
    Senza vedere la pagina in azione non so darti maggiore aiuto.

    Un'altra soluzione te l'ho comunque già indicata nel post precedente: per la chiamata AJAX puoi usare una pagina PHP creata appositamente per interrogare il DB e restituire il solo contenuto da aggiornare nella pagina. Come già indicato, in questo modo il traffico di dati risulterà ridotto all'essenziale... ma in qualunque caso quei 30 secondi mi sembrano veramente troppi; ma anche fossero 3 sarebbero comunque troppi.
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 15% tra i post del forum; il 9% sul web.
    Ti resta l’1% ... usalo bene!

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    105
    Ok, ci ho lavorato un po' e penso di aver risolto... come mi hai suggerito, ho creato un file ad hoc che contiene il minimo indispensabile

    File di origine che contiene la chiamata AJAX:
    codice:
    <script type="text/javascript">
                            $(document).ready(function() {
    
                                //al click sul bottone del form
                                $("#form_1").change(function(){
    
                                    //associo variabili
                                    var nome = $("#n_1").val();
                                    $('#risultato').load('prova.php', {valore : nome}, function(response, status, xhr){
                                       if ( status == "error" ) 
                                           alert(xhr.status + ': ' + xhr.statusText); 
                                    });
    dopodichè in prova.php:

    codice:
    <? php 
    $n_1= $_POST['valore']; 
    //e la relativa query
    ?>
    e infine si ritorna nel file di origine, con il risultato messo nel div risultato:

    codice:
    <div id="risultato" name="risultato"></div>
    è un po' macchinoso, forse anche poco elegante, ma funziona... alcune considerazioni da fare riguardano gli eventuali include che erano presenti nel file di origine e che la chiamata AJAX al file prova.php non considera, quindi ho dovuto reinserirle. Inoltre ho dovuto trasferire la query e la sua gestione nel file prova.php, speravo che in questo file potessi gestire la sola variabile PHP che mi interessava, ma quando torno nel file di origine (dopo la chiamata AJAX), non la vede

  10. #10
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    4,286
    Sì, giuste considerazioni. E' chiaro che una volta eseguita una qualsiasi pagina PHP (che sia aperta direttamente nella finestra del browser o dopo una chiamata AJAX), nel client non resta alcun riferimento della situazione lato server, come già ti ha indicato ciro78:
    nel momento che js entra in funzione php non esiste più. il server ti ha restituito l'html e puoi lavorare solo su quello.
    A tal proposito, tutti i dati per l'interrogazione del DB dovranno essere inclusi nuovamente nella pagina a cui punta AJAX, così come avviene nella pagina principale; ma questo mi pare il minimo.
    Prima di postare considera che tra i link utili puoi trovare il 75% delle risposte alle tue domande; il 15% tra i post del forum; il 9% sul web.
    Ti resta l’1% ... usalo bene!

    Le cattive domande sono quelle che non meritano risposta, le buone domande sono quelle che non hanno risposta
    L'Itailano non e nu'opnioine. E' improntate uslaro correattemtne sul froum. Garize!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.