Eu tenho uma variável em PHP e preciso do seu valor no meu código JavaScript. Como posso obter minha variável de PHP para JavaScript?
Eu tenho um código que se parece com isso:
<?php
...
$val = $myService->getValue(); // Makes an API and database call
?>
Eu tenho um código JavaScript que precisa val
e se parece com:
<script>
myPlugin.start($val); // I tried this, but it didn't work
<?php myPlugin.start($val); ?> // This didn't work either
myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails
</script>
javascript
php
Fantasma de Madara
fonte
fonte
myPlugin.start(<?=$val?>
intencional? É verdade que "isso funciona às vezes"?"42)"
que vai funcionar bem: DRespostas:
Na verdade, existem várias abordagens para fazer isso. Alguns exigem mais despesas gerais do que outros, e alguns são considerados melhores que outros.
Em nenhuma ordem particular:
Nesta postagem, examinaremos cada um dos métodos acima e veremos os prós e os contras de cada um, além de como implementá-los.
1. Use AJAX para obter os dados necessários do servidor
Esse método é considerado o melhor, porque os scripts do lado do servidor e do cliente são completamente separados .
Prós
Contras
Exemplo de Implementação
Com o AJAX, você precisa de duas páginas, uma é onde o PHP gera a saída e a segunda é onde o JavaScript obtém essa saída:
get-data.php
index.php (ou qualquer que seja o nome da página atual)
A combinação acima dos dois arquivos alertará
42
quando o arquivo terminar de carregar.Um pouco mais de material de leitura
2. Faça eco dos dados na página em algum lugar e use JavaScript para obter as informações do DOM
Este método é menos preferível ao AJAX, mas ainda tem suas vantagens. Ainda é relativamente separado entre PHP e JavaScript, no sentido de que não há PHP diretamente no JavaScript.
Prós
Contras
<input type=hidden>
armazenamento de informações, porque é mais fácil obtê-lasinputNode.value
, mas isso significa que você tem um elemento sem sentido no HTML. O HTML possui o<meta>
elemento para dados sobre o documento, e o HTML 5 apresentadata-*
atributos para dados especificamente para leitura com JavaScript que podem ser associados a elementos específicos.Exemplo de Implementação
Com isso, a idéia é criar algum tipo de elemento que não será exibido ao usuário, mas é visível no JavaScript.
index.php
3. Faça eco dos dados diretamente no JavaScript
Este é provavelmente o mais fácil de entender.
Prós
Contras
Exemplo de Implementação
A implementação é relativamente direta:
Boa sorte!
fonte
json_encode
?<?php $output = '<!--<script>'; echo json_encode($output); ?>
. Veja esta pergunta para detalhes. Solução: UseJSON_HEX_TAG
para escapar<
e>
(requer PHP 5.3.0).Vou tentar uma resposta mais simples:
Explicação do problema
Primeiro, vamos entender o fluxo de eventos quando uma página é veiculada em nosso servidor:
Realmente, a principal coisa a lembrar aqui é que o HTTP é sem estado . Depois que uma solicitação sai do servidor, o servidor não pode tocá-lo. Então, isso deixa nossas opções para:
Soluções
Essa é a pergunta principal que você deve se perguntar:
Estou escrevendo um site ou aplicativo?
Os sites são baseados principalmente em páginas e o tempo de carregamento da página precisa ser o mais rápido possível (por exemplo - Wikipedia). Os aplicativos da Web são mais pesados para o AJAX e realizam várias viagens de ida e volta para obter informações rápidas do cliente (por exemplo - um painel de ações).
Local na rede Internet
O envio de mais solicitações do cliente após a conclusão da solicitação inicial é lento , pois requer mais solicitações HTTP com sobrecarga significativa. Além disso, requer assincronicidade, pois fazer uma solicitação AJAX requer um manipulador para quando estiver completo.
Eu não recomendaria fazer outra solicitação, a menos que seu site seja um aplicativo para obter essas informações do servidor.
Você deseja tempos de resposta rápidos, com uma enorme impacto nos tempos de conversão e carregamento. Fazer solicitações do Ajax é lento para o tempo de atividade inicial nesse caso e desnecessário.
Você tem duas maneiras de resolver o problema
Definir um cookie não é realmente muito difícil, basta atribuir um valor a ele:
Em seguida, você pode lê-lo com JavaScript usando
document.cookie
:Aqui está um analisador de rolagem manual, mas a resposta que eu vinculei logo acima tem os melhores:
Os cookies são bons para um pouco de dados. É isso que os serviços de rastreamento costumam fazer.
Quando tivermos mais dados, podemos codificá-los com JSON dentro de uma variável JavaScript:
Supondo que
$value
sejajson_encode
capaz no lado do PHP (geralmente é). Essa técnica é o que o Stack Overflow faz com seu bate-papo, por exemplo (apenas usando .NET em vez de PHP).Inscrição
Se você estiver escrevendo um aplicativo - de repente, o tempo de carregamento inicial nem sempre é tão importante quanto o desempenho contínuo do aplicativo e começa a valer a pena carregar dados e códigos separadamente.
Minha resposta aqui explica como carregar dados usando o AJAX em JavaScript:
Ou com jQuery:
Agora, o servidor só precisa conter uma
/your/url
rota / arquivo que contenha código que pegue os dados e faça algo com eles, no seu caso:Dessa forma, nosso arquivo JavaScript solicita os dados e os mostra em vez de solicitar código ou layout. Isso é mais limpo e começa a valer a pena à medida que o aplicativo aumenta. Também é uma melhor separação de preocupações e permite testar o código do lado do cliente sem a necessidade de qualquer tecnologia do servidor, o que é outra vantagem.
Postscript: Você deve estar muito ciente dos vetores de ataque XSS ao injetar algo do PHP ao JavaScript. É muito difícil escapar dos valores corretamente e é sensível ao contexto. Se você não tiver certeza de como lidar com o XSS ou não o conhecer - leia este artigo da OWASP , esta e esta pergunta .
fonte
{}
é um objeto JSON válido - veja json.org\u2028
etc. Você teria que dizer explicitamente para não fazer isso.Eu normalmente uso atributos de dados * em HTML.
Este exemplo usa jQuery, mas pode ser adaptado para outra biblioteca ou JavaScript vanilla.
Você pode ler mais sobre a propriedade do conjunto de dados aqui: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
fonte
div
está bem, mas você pode usar qualquer tag que desejar; tem que estar nobody
entanto.json_encode () requer:
$PHPVar
codificado como UTF-8, Unicode.fonte
Basta usar um dos seguintes métodos.
OU
fonte
document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Eu gosto bastante da maneira como o WordPress trabalha com suas funções de enfileiramento e localização , então, seguindo esse modelo, escrevi uma classe simples para colocar scripts na página de acordo com as dependências do script e para disponibilizar dados adicionais para o script.
A chamada para a
enqueue_script()
função é para adicionar script, definir a origem e dependências em outros scripts e dados adicionais necessários para o script.E, o
print_scripts()
método do exemplo acima enviará esta saída:Independentemente do fato de o script 'jquery' ser colocado na fila após o 'jquery-ui', ele é impresso anteriormente porque está definido em 'jquery-ui' que depende do 'jquery'. Dados adicionais para o 'script personalizado' estão dentro de um novo bloco de script e são colocados na frente dele; ele contém
mydata
objetos que contêm dados adicionais, agora disponíveis para 'script personalizado'.fonte
Tente o seguinte:
-
-Depois de tentar isso por um tempo
Embora funcione, no entanto, diminui o desempenho. Como o PHP é um script do lado do servidor, enquanto o JavaScript é do lado do usuário.
fonte
$phpVariable = '42"; alert("I am evil!");';
Não funciona porque
$val
é indefinido no que diz respeito ao JavaScript, ou seja, o código PHP não produziu nada para ele$val
. Tente visualizar a fonte no seu navegador e aqui está o que você verá:E
Isso não funciona porque o PHP tentará tratar
myPlugin
como uma constante e, quando isso falhar, tentará tratá-lo como a string'myPlugin'
que tentará concatenar com a saída da função PHPstart()
e, como isso é indefinido, produzirá um fatal erro.E
Embora seja mais provável que funcione, como o código PHP está produzindo JavaScript válido com os argumentos esperados, se falhar, é provável que seja porque
myPlugin
ainda não está pronto. Verifique sua ordem de execução.Além disso, você deve observar que a saída do código PHP é insegura e deve ser filtrada com
json_encode()
.EDITAR
Porque eu não notei o parêntese ausente em
myPlugin.start(<?=$val?>
: - \Como o @Second Rikudo salienta, para funcionar corretamente
$val
seria necessário conter o parêntese de fechamento, por exemplo:$val="42);"
Isso significa que o PHP agora produzirá
myPlugin.start(42);
e funcionará conforme o esperado quando executado pelo código JavaScript.fonte
myPlugin.start(<?=json_encode($val)?>);
Eu vim com um método fácil para atribuir variáveis JavaScript usando PHP.
Ele usa atributos de dados HTML5 para armazenar variáveis PHP e, em seguida, é atribuído ao JavaScript no carregamento da página.
Um tutorial completo pode ser encontrado aqui .
Exemplo:
Aqui está o código JavaScript
fonte
Exemplo:
PASSO 1
PASSO 2
fonte
Aqui está um que eu não vejo postado como uma opção. É semelhante ao uso do Ajax, mas claramente diferente.
Primeiro, defina a fonte de um script diretamente para um arquivo PHP.
Você pode até passar uma variável de volta ao arquivo PHP, como neste exemplo:
Em seguida, em "your_php_file.php":
fonte
var1=value1
. Como está, seu script será interrompido se os dados incluírem um'
caractere.var1 != [some HTML code]
... CLARAMENTEvar1=="value1"
. Simplificando, você está errado que eu perdi alguma coisa. o script EXAMPLE está completo e, como você pode ver, não está gerando nenhum HTML - e o OP não mencionou o HTML. ele não merece um voto negativo por algum acionador feliz bypasser - retrai o$val
e que às vezes funciona e às vezes não:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Aqui está o truque:
Aqui está o seu 'PHP' para usar essa variável:
Agora você tem uma variável JavaScript chamada
'name'
e aqui está o seu código JavaScript para usar essa variável:fonte
Digamos que sua variável seja sempre inteira. Nesse caso, isso é mais fácil:
Saída :
Digamos que sua variável não seja um número inteiro, mas se você tentar o método acima, obterá algo como isto:
Mas em JavaScript, este é um erro de sintaxe.
Portanto, no PHP, temos uma chamada de função
json_encode
que codifica string para um objeto JSON.Como
abcd
no JSON é"abcd"
, fica assim:Você pode usar o mesmo método para matrizes:
E seu código JavaScript fica assim:
Saída do console
fonte
Após muita pesquisa, descobri que o método mais fácil é passar todos os tipos de variáveis facilmente.
No script do servidor, você tem duas variáveis e está tentando enviá-las para os scripts do cliente:
Em qualquer código JavaScript chamado na página, basta chamar essas variáveis.
fonte
Vou assumir que os dados a transmitir são uma string.
Como outros comentadores declararam, o AJAX é uma solução possível, mas os contras superam os profissionais: ele possui uma latência e é mais difícil de programar (ele precisa do código para recuperar o valor no servidor e no cliente), quando é mais simples. a função de escape deve ser suficiente.
Então, voltamos a escapar.
json_encode($string)
funciona se você codificar a sequência de origem como UTF-8 primeiro, caso ainda não o seja, porquejson_encode
requer dados UTF-8. Se a sequência estiver na ISO-8859-1, você poderá simplesmente usarjson_encode(utf8_encode($string))
; caso contrário, você sempre pode usariconv
para fazer a conversão primeiro.Mas há uma grande pegadinha. Se você o estiver usando em eventos, precisará executar
htmlspecialchars()
o resultado para torná-lo o código correto. E então você deve ter cuidado ao usar aspas duplas para incluir o evento ou sempre adicionarENT_QUOTES
a htmlspecialchars. Por exemplo:No entanto, você não pode usar
htmlspecialchars
o código JavaScript comum (código incluído em<script>
...</script>
tags). Isso faz com que essa função seja propensa a erros, esquecendo-se dehtmlspecialchars
o resultado ao escrever o código do evento.É possível escrever uma função que não tenha esse problema e pode ser usada tanto em eventos quanto no código JavaScript comum, desde que você coloque seus eventos sempre entre aspas simples ou sempre entre aspas duplas. Aqui está a minha proposta, exigindo que eles estejam entre aspas duplas (o que eu prefiro):
A função requer PHP 5.4+. Exemplo de uso:
fonte
Conforme seu código
Agora você pode obter valor usando DOM, use innerHTML do span id, neste caso você não precisa fazer nenhuma chamada para o servidor, ou Ajax ou outra coisa.
Sua página será impressa em PHP e o JavaScript obterá valor usando o DOM.
fonte
<
e>
. Além disso, soluções semelhantes já foram sugeridas.fonte
PHP
JS (yourexternal.js)
RESULTADO
fonte
Para aqueles que têm algum problema ao usar o código abaixo e ele continua aparecendo
<?php echo $username?>
ou algo assim, edite o httpd.conf na seção mime_module e adicione este 'aplicativo AddType / x-httpd-php .html .htm', pois ele pode estar desabilitado por padrão.fonte
$username === "hello"
, então você tem ovar myData = hello;
que vai quebrar horrivelmente.Usar:
e isso vai funcionar. É apenas atribuir uma variável JavaScript e depois passar o valor de uma variável PHP existente. Como o PHP grava as linhas JavaScript aqui, ele tem o valor da variável PHP e pode transmiti-lo diretamente.
fonte