• User Attivo

    & tronca gli url

    Sapete qual'è il modo più comune per evitare il problema dei parametri troncati?

    Nello specifico mi capita di dover fare delle richieste ajax con POST e di spedire a delle pagine php ad esempio del testo, che può anche contenere &.
    & mi tronca il testo e cerco un modo per evitare la cosa.

    Ad esempio, io spedisco questo parametro:

    testo = "Sono un utente che inserisce un url in una textarea, eccolo www(.)pippo(.)it/index.php?a=2&b=3";

    ed in realtà arriva solo:

    testo = "Sono un utente che inserisce un url in una textarea, eccolo www(.)pippo(.)it/index.php?a=2";


  • User Attivo

    Con GET e POST credevo venisse sempre fatta implicitamente questa operazione ma in questo caso non capisco perchè succede questa cosa.
    Se servono altri dettagli chiedete, non voglio mettere tutto il codice subito altrimenti il post diventa troppo lungo e passa a tutti la voglia di leggerlo.


  • User Attivo

    Ciao Artasdog,
    quando devi portare del testo all'interno dell'url, si usa sempre la funzione urlencode().
    Ricordati anche di convertire anticipatamente sempre anche tutti i caratteri speciali con htmlentities() e simili, in modo da evitare di portarti in giro virgolette e altri caratteri particolari.


  • User Attivo

    Grazie per la risposta bazarop.
    Visto che è una richiesta ajax con post devo fare escape via javascript.
    Mi puoi confermare se è corretto fare:

    javascript->escape() prima di mandare il post
    php->urldecode() quando arriva nella pagina php

    Ciao.


  • User Attivo

    Urlencode lo fai prima. Serve per "codificare" un testo da inserire in un url.
    Non lo fai quando lo devi prendere.

    Al contrario, quando devi prendere una stringa da un url e la vuoi "decodificare", usi** urldecode**.

    Se hai un testo preso da un form e devi generare l'url via javascript inserendocelo dentro, non conviene usare solo escape, ma una funzione che ti sostituisca tutti i caratteri speciali:
    [PHP]function urlencode (str) {
    str = escape(str);
    return str.replace(/[+/@]|%20/g,
    function (s) {
    switch (s) {
    case "
    ": s = "%2A"; break;
    case "+": s = "%2B"; break;
    case "/": s = "%2F"; break;
    case "@": s = "%40"; break;
    case "%20": s = "+"; break;
    }
    return s;
    }
    );
    }[/PHP]

    Detto questo, se devi però inviare del testo (magari di un form) via Ajax, non devi usare il metodo GET, ma il metodo POST, in questo modo non hai bisogno di caricare tutto manualmente all'interno della stringa. Utilizzando il metodo POST, non si verificano errori in merito a "& troncate".
    Spero di essere stato chiaro 🙂


  • User Attivo

    La funzione che hai postato fa lo stesso lavoro di urlencode ma via javascript in modo che quel testo può essere convertito poi lato server con urldecode?

    Cmq già utilizzo POST come scritto nel primo messaggio.


  • User Attivo

    Molto strano che il metodo post ti rovini l'url. Usi jQuery o altri framework?

    Si, la funzione javascript che ti ho scritto, funziona allo stesso modo che in php. Non l'ho testata, ma apparentemente dovrebbe fare tutto.


  • User Attivo

    Uso jquery si, ma per le chiamate ajax utilizzo codice normale javascript, questo:

    params="pippo="+va1+"&pluto="+var2+"&paperino="+var3;
    xmlhttp.open("POST","http(:)//www(.)pippo(.)it/fileajax.php",false);
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader("Content-length", params.length);
    xmlhttp.setRequestHeader("Connection", "close");
    xmlhttp.send(params);

    Ora in base a quello che mi consigli di fare posso risolvere mettendo la tua funzione qui:

    params="pippo="+urlencode(var1)+"&pluto="+urlencode(var2)+"&paperino="+urlencode(var3);

    poi nel file php a cui arrivano i POST farò:

    $pippo=urldecode($_POST['pippo']);
    ecc..

    Ho capito bene?


  • User Attivo

    Puoi provare così, ma quello che io ti consiglio realmente di fare, è di utilizzare il metodo ajax() o direttamente post() di jQuery per evitare alcun tipo di problema.
    Non ha particolarmente senso implementare jQuery e poi scrivere le funzioni in Javascript.


  • User Attivo

    Sto notando che i caratteri che converti nella tua funzione urlencode da quanto dicono qui sembrano già compresi in quelli che vengono convertiti con escape()

    http(:)//www(.)javascripter(.)net/faq/escape(.)htm


  • User Attivo

    Non proprio, se vedi all'interno della funzione è presente l'esacpe().

    Vi sono casi in cui l'escape può essere ovviato.
    In questa pagina trovi maggiori dettagli: phpbuilder.com/board/showthread.php?t=10318476

    Un'altra buona funzione presa appunto dalla suddetta pagina, è la seguente: [PHP]function urlencode(str) {
    return escape(str).replace(/+/g,'%2B').replace(/%20/g, '+').replace(/*/g, '%2A').replace(///g, '%2F').replace(/@/g, '%40');
    }[/PHP]


  • User Attivo

    Grazie adesso con calma provo a leggermela, ma ad esempio che tipo di problema potrei incontrare utilizzando solo escape()?


  • User Attivo

    I problemi si affrontano durante la decodificazione in php, in quanto escape(js) e encode(php), non funzionano allo stesso modo. Quindi, quando il parametro lo devi decodificare in php, lo decodificheresti in modo errato.

    Qui vedi come escape ed encode funzionano in modo differente:
    http://cass-hacks.com/articles/discussion/js_url_encode_decode/


  • User Attivo

    Ok, agendo in questo modo immagino che anche la conversione di caratteri al dei fuori dei primi 126 del funzionerà correttamente, ma mi chiedo, la corrispondenza esadecimale dei caratteri oltre il codice ascii in quel caso dove la trovo?

    ad esempio guardando il codice ascii so che & diventera %26

    ma se converto ù che diventa %F9 che tabella devo guardare per la conversione? Ciè come faccio a sapere in anticipo cosa diventera ù senza provarlo?


  • User Attivo

    Ho inserito escape ed il problema sembra essersi risolto.
    Lato server non è stato necessario inserire urldecode() perchè la conversione sembra essere stata fatta in automatico.

    Mi è rimasto ora solo il problema di convertire caratteri come il simbolo dell'euro, che con escape() diventa nel database:

    € diventa %u20AC


  • User Attivo

    Hai provato con urldecode se ti fa la sostituzione dell'euro?

    In alternativa, effettua uno string replace di "%u20AC" con "€" oppure "€".


  • User Attivo

    urldecode purtoppo non decodifica %u20AC
    Ho in effetti fatto string replace ma da "%u20AC" a questo "?" e sembra funzionare correttamente.

    Sai come viene generato questo valore "%u20AC"? (se ci sono tabelle di riferimento)