Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Invio variabili PHP tramite navigazione Ajax

    Salve, visualizzo il mio sito con Ajax. Ma ho un problema di invio variabili.
    Ho una pagina index.php simile a questa

    Codice PHP:
    <script src="navigation.js" type="text/javascript"></script>
    <div id="pageContent"></div>
    [url="#page1"]pagina 1[/url]
    [url="#profile"]profilo[/url] 

    Questo è il file navigation.js

    codice:
    $(document).ready(function(){
    
    	checkURL();
    	$('a').click(function (e){
    			checkURL(this.hash);
    	});
    	setInterval("checkURL()",250);
    });
    
    var lasturl="";
    
    function checkURL(hash)
    {
    	if(!hash) hash=window.location.hash;	//if no parameter is provided, use the hash value from the current address
    
    	if(hash != lasturl)	// if the hash value has changed
    	{
    		lasturl=hash;	//update the current hash
    		loadPage(hash);	// and load the new page
    	}
    }
    
    function loadPage(url)
    {
    	url=url.replace('#','');
    	$.ajax({
    		type: "POST",
    		url: "load_page.php",
    		data: 'page='+url,
    		dataType: "html",	
    		success: function(msg){
    			if(parseInt(msg)!=0)	//if no errors
    			{
    				$('#pageContent').html(msg);
    			}
    		}
    	});
    }

    E questa è la pagina load_page.php
    codice:
    <?php
    if(!$_POST['page']) die("0");
    $page = $_POST['page'];
    include('pages/'.$page.'.php');
    ?>


    Bene il problema è questo.. la pagina profile.php che carico tramite il link #profile dovrebbe visualizzare mediante GET dei valori... ad esempio:

    Codice PHP:
    <?php
    $nome_utente 
    $_GET['user'];
    if(!
    $_GET['user']) {
        print 
    'Attenzione, devi inserire il nome di un utente';
    }
    else
    {
        print 
    $nome_utente;
    }
    ?>
    Ho provato quindi a sostituire nella pagina index.php il link in questo modo

    profile

    Ma questo non funziona perché la pagina load_page.php non trova - giustamente - la pagina "profile?user=prova.php"...
    Come devo fare quindi per inviare questa variabile GET alla pagina profile.php a partire da un link nella pagina index.php??
    grazie mille!
    Laura Pausini ♥
    Bellissima Così

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao.
    Puoi risolvere in diversi modi. In qualunque caso dovrai ricostruire correttamente quella stringa prima di passarla alla funzione include di php.
    A mio parere puoi ricostruirla già nella funzione loadPage di js in modo che, alla proprietà "data" di ajax, sia passato un riferimento "reale" della pagina.

    C'è però da considerare qualche possibile problema. Sia ajax che php utilizzano il cosiddetto formato MIME per passare i dati da una pagina all'altra (cioè: var1=val1&var2=val2&varN=valN). Questo può generare dei conflitti nella costruzione delle querystring utilizzate per effettuare il passaggio di dati tra ajax e php, soprattutto nel caso in cui tu voglia passare più di un valore in GET alla tua pagina finale.

    Ti faccio giusto un esempio. Immagina di voler passare un url del genere:
    codice:
    profile.php?user=prova&pw=123
    ..quindi nella chiamata ajax avrai praticamente:
    codice:
    data: 'page=profile.php?user=prova&pw=123'
    ..e di conseguenza al php arriveranno erroneamente due variabili (a causa del carattere &):
    codice:
    page=profile.php?user=prova
    pw=123
    Questo problema lo puoi risolvere usando le apposite funzioni per codificare (escape, in js) e decodificare (urldecode, in PHP) la querystring passata.

    Quindi su js potresti avere una cosa del genere:
    codice:
    function loadPage(url)
    {
    	url=url.replace('#','').split('?');
    	url=escape(url[0]+'.php'+(url.length>1?'?'+url[1]:''));
    
    	$.ajax({
    		type: "POST",
    		url: "load_page.php",
    		data: 'page='+url,
    		dataType: "html",	
    		success: function(msg){
    			if(parseInt(msg)!=0)	//if no errors
    			{
    				$('#pageContent').html(msg);
    			}
    		}
    	});
    }
    Brevemente: ho splitato l'url per estrapolare l'eventuale parte che si riferisce alle variabili da passare in GET. Quindi ho riassemblato la stringa inserendo adeguatamente anche l'estensione ".php" e facendo un escape del tutto.

    Mentre in PHP:
    codice:
    <?php
    if(!$_POST['page']) die("0");
    $page = urldecode($_POST['page']);
    include('pages/'.$page);
    ?>
    Ricevo la stringa e la decodifico. Quindi la passo alla funzione include (senza aggiungere l'estensione ".php" che avevo già inserito in js)
    Nota: urldecode (in php) è usata come funzione inversa di escape (in js) anche se il tipo di codifica non è esattamente corrispondente tra le due funzioni. In questo caso dovrebbe comunque funzionare.

    Non ho avuto modo di testare il tutto, ad ogni modo spero sia chiaro il ragionamento.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Grazie mille veramente per aver dato una prima mano... ho fatto quello che mi hai detto e pensandoci è una soluzione giustissima.. soltanto che a quanto pare non trova comunque il file.. questo è ciò che ricevo:

    Warning: include(pages/profile.php?user=prova) [function.include]: failed to open stream: No such file or directory in /Users/Antonio/Sites/Tilde.me/include/load_page.php on line 7

    Warning: include() [function.include]: Failed opening 'pages/profile.php?user=prova' for inclusion (include_path='.:/Applications/XAMPP/xamppfiles/lib/php:/Applications/XAMPP/xamppfiles/lib/php/pear') in /Users/Antonio/Sites/Tilde.me/include/load_page.php on line 7
    Laura Pausini ♥
    Bellissima Così

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Hoops.. c'è un problema basilare che mi era sfuggito.
    Tieni presente che è un problema riguardante PHP e non JS (siamo quindi un po' offtopic ma ti spiego lo stesso).

    In effetti con include non stai "caricando" la pagina ma stai semplicemente dicendo di "appiccicare", all'interno dello script chiamante, lo script contenuto in quella specifica pagina.
    Le variabili passate in GET o in POST vengono di norma create nell'header della pagina al momento in cui questa viene "caricata" sul browser.
    Nel caso di include non stai "caricando" la pagina e pertanto non puoi passare alcun parametro in quel modo (GET o POST che sia).
    Puoi però "definire" le variabili, in modo anche più semplice, direttamente nello script della pagina load_page.php da cui lanci l'include. Queste variabili saranno quindi visibili automaticamente sullo script della pagina "inclusa".

    Come sempre puoi risolvere in vari modi.
    Io ti consiglierei di passare le variabili supplementari, nel primo passaggio (ajax => load_page.php), concatenandole direttamente sulla proprietà "data" (proprio come ho invece evitato di fare nel primo esempio, per risolvere il problema del MIME).

    Avrai quindi una cosa del genere:
    codice:
    function loadPage(data)
    {
    	data='page='+data.replace('#','').replace('?','&');
    
    	$.ajax({
    		type: "POST",
    		url: "load_page.php",
    		data: data,
    		dataType: "html",	
    		success: function(msg){
    			if(parseInt(msg)!=0)	//if no errors
    			{
    				$('#pageContent').html(msg);
    			}
    		}
    	});
    }
    Ho sostituito la variabile "url" con "data" per un puro fatto di intellegibilità.
    La funzione replace('?','&') non farà altro che agganciare le variabili aggiuntive direttamente alla variabile "page".

    Teoricamente potresti fare a meno di questo passaggio se ti poni la convenzione di indicare, sui link, direttamente il carattere & (e commerciale) anziché ? (punto interrogativo). Potresti ad esempio avere una cosa del genere: "#profile&user=prova". Ovviamente vedi tu come meglio preferisci operare.

    A questo punto, su $_POST in php, ritroverai la tua variabile "page", che conterrà il nome della pagina, e tutte le altre eventuali variabili aggiuntive.

    load_page.php potrà quindi tornare nella sua forma iniziale senza apportare nessuna modifica:
    Codice PHP:
    <?php
    if(!$_POST['page']) die("0");
    $page $_POST['page'];
    include(
    'pages/'.$page.'.php');
    ?>
    Nel caso di "#profile?user=prova" potrai accedere alla variabile $_POST['user'] direttamente dallo script all'interno di quella stessa pagina.

    Analogamente nel caso di più variabili potrai accedere a queste sempre via POST.
    Ad es: "#profile?user=prova&pw=123&id=10", avrai rispettivamente $_POST['page'], $_POST['user'], $_POST['pw'], $_POST['id']


    Non ho testato lo script, spero funzioni.
    La soluzione (se funziona) era comunque più semplice del previsto.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Sei stato perfetto, ti ringrazio veramente per la disponibilità... veramente il problema era roba da nulla, grazie mille
    Un'ultima "curiosità", forse off topic... da qualche parte mi hanno segnalato che questo mio script è vulnerabile agli XSS... dovrei preoccuparmi? Sai com'è possibile ovviare a questo problema?!
    Laura Pausini ♥
    Bellissima Così

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    No problem.

    Per il fattore "vulnerabilità" ovviamente potresti prendere diverse precauzioni, dipende comunque dal livello di sicurezza che vuoi ottenere. Ti consiglio però di postare nel forum php, non prima di aver cercato anche un po' in giro.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    Ricevuto
    Grazie ancora per i preziosissimi consigli e la disponibilità
    Laura Pausini ♥
    Bellissima Così

  8. #8
    salve voglio introdurmi nella vostra bella chiacchierata e visto che mi sembrate un bel po esperti vorrei chiedervi come è possibile far apparire nella url non il simbolo # ma il simbolo ? senza far ricaricare la pagina non so più dove sbattere la testa XD

    orum.html.it/forum/newreply.php?s=&action=newreply&threadid=1483090

    orum.html.it/forum/newreply.php#s=&action=newreply&threadid=1483090

  9. #9
    o forse è possibile bloccare la richiesta della nuova pagina in modo da fare apparire il link desiderato ma ottenere lo stesso effetto boh

  10. #10
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Non è possibile modificare l'url tramite codice senza ricaricare la pagina per motivi di sicurezza (anti-fishing)

    P.S. In futuro inserisci nelle discussioni quando sono strettamente collegata al tuo problema, non per la preparazione di chi interviene, grazie.
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

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 © 2025 vBulletin Solutions, Inc. All rights reserved.