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

    Stessa funzione non va se a due parametri

    Salve, ho questo problema... Vorrei riciclare una funzione funzionante in una pagina PHP, in un'altra pagina PHP, con la differenza che in quest'ultima passo due parametri anziché uno, e che nel secondo caso il link è testuale anziché da immagine. Illustro la situazione con i codici.

    Caso 1, funzionante:
    codice:
    function conferma(codice) {
        var esito;
        esito=confirm("Sei sicuro di voler cancellare il telefono con id "+codice+"?");
        if(esito==true) {
            window.location="cancella.php?id="+codice;
        } else {
            alert("Cancellazione annullata!");
        }
    }
    codice:
    <img  border='0' src='immagini/cestino.png' alt='Elimina questo telefono' onclick='javascript:conferma($id);' />
    Caso 2, click ignorato:
    codice:
    function conferma(cod,tab) {
        var esito;
        esito=confirm("Sei sicuro di voler eliminare questo campo con id "+cod+" dall'elenco "+tab+"?");
        if(esito==true) {
            window.location="cancella_offerta.php?id="+cod+"&"+tab;
        } else {
            alert("Cancellazione annullata!");
        }
    }
    codice:
    <a href='#' onclick='javascript:conferma($id,$tabella);'>Elimina</a>
    Entrambe le funzioni conferma() sono nell'HEAD delle pagine, mentre gli onclick sono inclusi in degli echo di PHP, tuttavia si visualizza la parola Elimina come link ma senza effetti.

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,691
    Ciao, quando imposti una stringa in php che deve restituire un codice HTML in cui è incluso uno script JavaScript, è bene assicurarsi cosa stia effettivamente arrivando lato client e verificare magari se ti saltano errori di script sulla console web del browser.

    Immagino che $id sia un valore numerico e quindi non ci sarebbe alcun problema per JavaScript se non è racchiuso tra apici, ma $tabella che tipo di dato è esattamente?
    Se si tratta di una stringa testuale andrebbe opportunamente racchiusa tra apici (o doppi apici) sulla chiamata della funzione nel codice JavaScript (eventualmente facendo l'adeguato escape); però non vedo alcun apice attorno a $tabella. Il problema potrebbe essere quello; puoi chiarire?
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Sì, credo sia un problema del genere essendo $tabella un testo, proverò appena possibile a verificare.
    Grazie.

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,691
    essendo $tabella un testo
    Allora la/una causa del problema è sicuramente questa. Se quel valore è una stringa, in JavaScript deve risultare racchiuso tra apici.
    In PHP dovresti avere un qualcosa del genere:
    Codice PHP:
    echo("<a href='#' onclick='javascript:conferma($id,\"$tabella\");'>Elimina</a>"
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Sì, funziona!
    Questa storia degli apici singoli e doppi mi è un po' ostica. Per come è configurato l'echo, mi viene da mettere i doppi apici all'esterno e dove occorre gli apici singoli all'interno, e nella prima versione di questa pagina, fatta mesi fa e poi accantonata, avevo messo \'$tabella\' che però non funzionava, sicché li avevo tolti del tutto come nel codice che ho pubblicato in apertura.

    Quindi la gerarchia degli apici non è rigida (all'interno di un blocco racchiuso da dei " ci possono stare soltanto dei ', sennò chiudi anticipatamente il blocco esterno, mi disse qualcuno...), se si usano i \ per passare il doppio apice come carattere e non come chiusura di una stringa!

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,691
    Questa storia degli apici singoli e doppi mi è un po' ostica. Per come è configurato l'echo, mi viene da mettere i doppi apici all'esterno e dove occorre gli apici singoli all'interno, e nella prima versione di questa pagina, fatta mesi fa e poi accantonata, avevo messo \'$tabella\' che però non funzionava, sicché li avevo tolti del tutto come nel codice che ho pubblicato in apertura.
    Capisco, in effetti quando si usano apici per diversi livelli di profondità del codice, la questione può diventare relativamente complessa a seconda del numero di livelli e delle specifiche sintassi che si possono adoperare per ciascuno dei diversi linguaggi coinvolti.

    Quindi la gerarchia degli apici non è rigida (all'interno di un blocco racchiuso da dei " ci possono stare soltanto dei ', sennò chiudi anticipatamente il blocco esterno, mi disse qualcuno...), se si usano i \ per passare il doppio apice come carattere e non come chiusura di una stringa!
    Sì, è rigida nel senso che normalmente bisogna tenere conto dell'alternanza tra apici singoli e apici doppi (a meno di non usare appunto l'escape). Quando si tratta di due livelli di profondità delle stringhe vale la regola che quel qualcuno ti disse; in vari casi, come in questo, si hanno però più livelli di profondità, quindi è necessario impostare opportunamente degli escape, da valutare a seconda del contesto.

    In questo caso hai esattamente 3 livelli di profondità delle stringe, partendo dal PHP per passare all'HTML e infine al JavaScript.
    Considera che tutti è 3 i linguaggi offrono la possibilità di usare sia gli apici singoli sia quelli doppi per delimitare una stringa, oltre alla possibilità di eseguire degli escape, ma ciascun linguaggio ha le sue peculiarità e la sua specifica sintassi.

    La tua situazione è questa:

    - livello 1 PHP -

    Partendo dal PHP devi racchiudere la stringa per poterla passare all'output (echo o quel che è). Anche se puoi usare gli apici singoli è preferibile usare quelli doppi perché, ad esempio, ti permettono di includere le variabili scrivendole direttamente dentro la stringa stessa ed ottenere quindi un codice più pulito; mentre con gli apici singoli dovresti concatenare le varie parti.

    Codice PHP:
    echo('output '$variabilePHP .' altro testo'); 
    Singoli

    Codice PHP:
    echo("output $variabilePHP altro testo"); 
    Doppi

    Consideriamo quindi di usare quelli doppi.

    - livello 2 HTML -

    Il codice generato dal PHP è un HTML che deve contenere dei valori definiti per gli attributi, per cui racchiusi anche questi tra apici. Qui puoi decidere se usare gli apici singoli (mantenendo quindi la semplice alternanza) senza ulteriori accorgimenti, oppure usare quelli doppi per i quali però sarebbe necessario fare un escape (nell'ambito PHP) perché altrimenti ti determinerebbero la chiusura della stringa PHP (come disse quel qualcuno).

    NOTA:
    L'escape in PHP può essere fatto usando un carattere backslash (\) (detto anche "carattere di escape") anteposto al carattere per "modificarne" il significato e inibirne la funzione che avrebbe normalmente nell'ambito del linguaggio di programmazione usato, in questo caso PHP.
    Questo procedimento è grossomodo uguale anche per JavaScript.
    ---

    Codice PHP:
    $variabilePHP "Valore da PHP";
    echo(
    "<tag attributo='valore' altro-attributo='$variabilePHP'>");

    // output: <tag attributo='valore' altro-attributo='Valore da PHP'> 
    Singoli (semplice alternanza)

    Codice PHP:
    $variabilePHP "Valore da PHP";
    echo(
    "<tag attributo=\"valore\" altro-attributo=\"$variabilePHP\">");

    // output: <tag attributo="valore" altro-attributo="Valore da PHP"> 
    Doppi (con escape)

    Anche in questo caso consideriamo la forma più pulita, quindi l'uso di apici singoli, evitando "inutili" escape.

    - Livello 3 JavaScript -

    Se negli attributi dei tag HTML deve essere incluso del JavaScript nel quale sono definite delle stringhe, è necessario chiaramente racchiudere anche queste tra i relativi apici. A questo punto però non si può continuare l'alternanza degli apici "doppi - singoli - doppi" perché il risultato sarebbe sempre quello di terminare la stringa PHP (livello 1) in cui stai usando gli apici doppi (sempre come disse quel qualcuno). Non puoi neppure usare gli apici singoli in modo diretto, perché andrebbero chiaramente in conflitto con quelli usati per definire il valore degli attributi stessi in HTML (livello 2).

    In questo caso è necessario quindi eseguire un escape. E' possibile eseguirlo principalmente in due modi, cioè considerando l'escape nel contesto PHP (da PHP verso l'output HTML), oppure nel contesto HTML (da HTML verso JavaScript).

    Nel contesto PHP puoi quindi usare l'escape per "passare" gli apici doppi al contesto JavaScript, perché in HTML (dove hai usato gli apici singoli per delimitare i valori degli attributi) non andranno in conflitto.

    Da qui la seguente forma (come suggerito nel precedente post):
    Codice PHP:
    $variabilePHP "Valore da PHP";
    echo(
    "<a href='#' onclick='alert(\"$variabilePHP\");'>...</a>");

    // output codice HTML: <a href='#' onclick='alert("Valore da PHP");'>...</a> 
    Nota che l'alternanza degli apici è mantenuta, infatti in HTML hai i singoli apici e in JavaScript hai quelli doppi.

    Quello che invece hai fatto tu, eseguendo l'escape degli apici singoli, non può funzionare:
    Codice PHP:
    echo("<a href='#' onclick='javascript:conferma($id,\'$tabella\');'>Elimina</a>")

    // output: <a href='#' onclick='javascript:conferma($id,'Valore da PHP');'>Elimina</a> 
    Fai caso alla sequenza degli apici nell'output. In questo caso infatti gli stessi apici singoli, che stai "passando" a JavaScript, sono usati da HTML per delimitare i valori degli attributi, per cui avresti un conflitto che genera la chiusura anticipata di tali valori e conseguenti problemi nella sintassi HTML che va a sfasciarsi.

    Ancora, andando ad usare gli apici doppi con escape, per il secondo livello, la cosa si potrebbe comunque risolvere in questo modo:
    Codice PHP:
    $variabilePHP "Valore da PHP";
    echo(
    "<a href=\"#\" onclick=\"alert('$variabilePHP')\">test</a>");

    // output codice HTML: <a href="#" onclick="alert('Valore da PHP');">...</a> 
    Per cui in HTML si otterrà una sequenza invertita rispetto al precedente caso ma, in questo specifico caso, gli escape applicati sono di più.

    L'altra strada, meno pulita ma comunque praticabile, è l'uso dell'escape nell'ambito HTML.

    NOTA:
    L'escape in HTML non può essere fatto con il backslash, come per il PHP, ma in questo caso è possibile tutt'al più usare le opportune entità html:
    - per " (apice doppio) &quot; oppure l'analoga entità numerica "
    - per ' (apice singolo) &apos; (non supportato in HTML 4 su alcuni browser poco recenti) o, meglio, l'analoga entità numerica '
    ---

    E possibile quindi impostare la cosa usando una di queste forme:
    Codice PHP:
    $variabilePHP "Valore da PHP";

    echo(
    "<a href='#' onclick='alert(&quot;$variabilePHP&quot;)'>test</a>");

    echo(
    "<a href='#' onclick='alert("$variabilePHP")'>test</a>");

    echo(
    "<a href='#' onclick='alert(&apos;$variabilePHP&apos;)'>test</a>");

    echo(
    "<a href='#' onclick='alert('$variabilePHP')'>test</a>"); 
    In questo modo, anche se le entità si riferiscono sempre a quegli stessi apici, non si avrà comunque conflitto perché il codice viene interpretato contestualmente tra i vari livelli.

    Il metodo più pratico e pulito è comunque quello già consigliato nel precedente post, quantomeno per questo particolare caso.

    Perdona la lungaggine ma era necessaria per poter spiegare adeguatamente tutti i passaggi; spero solo di non averti confuso maggiormente le idee

    Buon proseguimento
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    Grazie infinite per questa rinfrescata sull'uso degli apici , argomento trattato ma, come si sa durante i corsi di formazione, si tende a non entrare troppo nel sottile quando qualcuno inizia a restare indietro... A me poi non era mai capitata la necessità di gestire più di due livelli di apici, per cui non mi ero posto il problema di approfondire la tematica, dando per buono il discorso sulla gerarchia.

  8. #8
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,691
    Felice d'essere stato d'aiuto

    Correggo l'ultimo mio punto riguardo le entità html, mentre facevo l'anteprima il forum ha convertito quelle numeriche mostrando direttamente il carattere :
    - per " (apice doppio) &quot; oppure l'analoga entità numerica &#34;
    - per ' (apice singolo) &apos; (non supportato in HTML 4 su alcuni browser poco recenti) o, meglio, l'analoga entità numerica &#39;
    Ultima modifica di KillerWorm; 28-11-2019 a 16:05
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

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