Jump to content
joao b silva

como pegar conteudo de uma variavel javascript e passar pra uma variavel php

Recommended Posts

ao criar a funcao javascript eu pego o valor de um input (produto) e passo pra uma variavel javascript. dentro do java script eu inicio uma sessao php e preciso passar o valor da variavel javascript para uma variavel php. Resumindo: como podem ver no codigo abixo eu preciso fazer a variavel php vProduto ter o mesmo conteúdo que a variavel javascript vCodPro

 

    function ValorItem() {
        var vCodPro = parseFloat(document.getElementById('produto').value);
     

        <?php
        $vProduto = "document.write(vCodPro)";
        
        var_dump(vProduto);
        document.getElementById('idpro').value = 
        
        $Par = "EM={$_SESSION['userlogin']['emCODIGO']}";
        $Fil = " where emCODIGO = :EM";
        ?>

    }
 

Share this post


Link to post
Share on other sites

Dessa forma não é possível.

Veja o javascript é executado do lado do usuário ou seja na máquina dele.

Enquanto que o php é executado no lado do servidor, ou seja se o usuário já interage ou acessa o conteúdo o php já foi executado e não tem seus dados alterados mais.

 

Em resumo digamos isso:

<?php
$exemplo = 'console.log(`Olá mundo`)';
?>
<script>
  function exemplo() {
    console.log('Dizer:');
    <?php echo $exemplo ?>
  }
</script>

Na verdade o que é:

<script>
  function exemplo() {
    console.log('Dizer:');
    console.log(`Olá mundo`);
  }
</script>

Então não é o php que é executado dentro do script, o script já está pronto e foi escrito pelo php antes do hardware do usuário terminar o download do mesmo.

 

A coisa que se pode fazer é se você quer alguma informação do usuário obrigatoriamente essa informação deve ser enviada para o servidor. Uma vez a informação lá você renderiza novo conteúdo html para o usuário.

 

Ainda em sua lógica....

Escrever PHP dentro de tag's javascript de forma que seu conteúdo seja alterado conforme o php modificar é meter os pés pelas mão mesmo que em muitos casos isso possa até funcionar você está criando uma carga de armazenamento demais para os usuários.

Citar

É por essa má prática entre mais outras que muitas pessoas bloqueiam sites de enviarem javascript.

 

Fora a questão da manutenção que vai virar o verdadeiro inferno.

 

Não se deve alterar funções javascript com escrita do php.

O cache é uma coisa que se deve pensar, se escreve todo ou alguma parte de um escopo de função do javascript no php ao solicitar a mesma função novamente o cache ainda está ativo e caso a função agora seja diferente a uma infinidade de erros que podem ocorrer.

No caso crie a função a mesma só irá trabalhar com dados vindo de parâmetros, então se desejar re-executar a função basta então apenas charmar-la novamente enviando outra informação como parâmetro.

// JavaScript
function exemplo(parametro) {
  console.log('Função executada com a informação:\n' + parametro);
}
<?php
$a = "João e Maria foram a padaria";
$b = "E joão queria comprar bolachas";
$c = "Mas Maria só queria pão";
$d = "E ambos só tinham dinheiro para uma coisa";
?>
<script>
  exemplo(`<?= $a ?>`);
  exemplo(`<?= $b ?>`);
  exemplo(`<?= $c ?>`);
  exemplo(`<?= $d ?>`);
</script>

 

Share this post


Link to post
Share on other sites

eu preciso pegar duas informações no banco de dados (mysql). primeiro eu pego a ID de um produto usando o select do html, mas preciso tb pegar alem da ID o valor desse produto. entao a minha ideia seria pesquisar a id do produto para encontar o registro correspondente e pegar o valor. se alguem puder me dar uma ideia de como fazer isso usando apenas um formulario, eu agradeço.

Share this post


Link to post
Share on other sites

O que você está tentando fazer exige AJAX, pois o ID do produto será definido pelo usuário utilizando o select, mas os produtos estão na sua aplicação/banco.

 

Para isso você pode usar:

1 - Fetch, nativo do navegador: https://developer.mozilla.org/pt-BR/docs/Web/API/Fetch_API/Using_Fetch

2 - ou, se estiver usando jQuery, $.get: https://api.jquery.com/jquery.get/

 

Você apenas precisa criar um endereço na sua aplicação que receba um ID e retorne o valor. (Exemplo: example.com/valor-produto.php?id=32).

Daí com AJAX (JS) você busca o valor informando o ID em resposta ao evento change do seu select.

Share this post


Link to post
Share on other sites

Apenas complementando o que o Omar já explicou:

 

Existe um processo de execução dos serviços:

 

1 - O usuário faz a requisição.

2 - Seu servidor a recebe e chama o programa (PHP) responsável pelo processamento dela.

2 - O PHP faz o que precisa ser feito e responde com o conteúdo (HTML/JS/CSS crús) que servirá para que o navegador renderize o que você instruiu. Você pode nessa etapa inserir uma variável do PHP, assim por exemplo:

var id = parseInt( <?php echo $id ?> );

Pois após o PHP processar e responder, o que chega ao navegador é isso:

var id = parseInt( 5 );// se $id fosse 5...

Por isso código PHP é inacessível ao usuário, pois ele é executado dentro da máquina que está servindo a aplicação (servidor).

 

Entenda que não tem como eu executar PHP novamente após a interação do usuário, ao menos que eu mande OUTRA (uma segunda) requisição em background (sem que o usuário perceba) utilizando JS. A esse tipo de requisição em background damos o nome de AJAX: https://developer.mozilla.org/pt-BR/docs/Web/Guide/AJAX

 

Resumindo: PHP roda no servidor, HTML/CSS/JS roda no navegador. São camadas e momentos totalmente diferentes.

 

Sacou?

Share this post


Link to post
Share on other sites

Além do ajax que é o mais comum de uso existe outra possibilidade.

Carregar os dados que deseja no carregamento do documento. Dessa forma não se precisa enviar nova requisição toda vez que algum produto é selecionado.

 

Qual melhor alternativa?

R: Ambas, pois depende do resultado a obter e da proposta da função.

 

Veja nesse exemplo onde simulo um resultado da query quando se acessa a página, assim uso esse resultado para criar um json com todos registros.

Com o json uso ele para criar um seletor de produtos, que ao ser alterado busco novamente no json os dados e informo mais conteúdos.

<?php
// SELECT produto_id, produto_nome, produto_preco FROM tabela_produtos
$exemplo_do_resultado = [
    // 'id' => produto_id, 'nome' => produto_nome, 'preco' => produto_preco
    ['id' => 0, 'nome' => 'Maçã', 'preco' => '11'],
    ['id' => 1, 'nome' => 'Banana', 'preco' => '22'],
    ['id' => 2, 'nome' => 'Laranja', 'preco' => '33'],
    ['id' => 3, 'nome' => 'Melancia', 'preco' => '44'],
    ['id' => 4, 'nome' => 'Melão', 'preco' => '55']
];
?>

<div id="local_do_seletor"></div>
<div id="local_para_mostrar">
    <p>Selecione um produto</p>
</div>

<script>
    var selecionar = document.getElementById('local_do_seletor');
    var mostrar = document.getElementById('local_para_mostrar');

    var produtos = JSON.parse('<?= json_encode($exemplo_do_resultado) ?>');
    // ou dependendo de como está trazendo o array do banco de dados
    // var produtos = '<?= json_encode($exemplo_do_resultado) ?>';

    function carregarLista() {
        var seletor = document.createElement('select'), opcao = {};
        window.produtos.forEach(function (coluna, indice) {
            opcao = document.createElement('option');
            opcao.value = coluna.id;
            opcao.innerText = coluna.nome;
            seletor.appendChild(opcao);
        });
        selecionar.addEventListener('change', verProduto, false);
        selecionar.appendChild(seletor);
    }

    function verProduto(evento) {
        var idAlvo = parseInt(evento.target.value), texto = '';
        window.produtos.forEach(function (coluna, indice) {
            if (coluna.id === idAlvo) {
                texto = 'Você selecionou o produto ID (' + coluna.id + ') ';
                texto += 'de nome (' + coluna.nome + ') ';
                texto += 'e seu valor é (' + coluna.preco + ') ';
            }
        });
        if (texto.length > 1) {
            mostrar.children[0].innerText = texto;
        }
    }

    carregarLista(); // Cria o seletor com as opções
</script>

Prós: Não é necessária uma nova requisição sempre que selecionar algum produto.

Contras: Quanto mais registros existirem mais lento a página é carregada. (Depende mais do hardware do usuário e sua conexão)

 

Citar

!!IMPORTANTE!!

Cuidado ao passar informações sigilosas com essa técnica, qualquer informação carregada nesse método o usuário terá acesso e ficará salva na máquina dele.

 

Share this post


Link to post
Share on other sites

Vou estudar  a opçãodo ajax, visto que a depender do cadastro de produtos fica inviável usar o json. Tenho um cliente que possui mais de 10.000 ítens em cadastrados, então como você mesmo disse, a lentidão será inevitável.

Mais uma vez muito obrigado a ambos.

Share this post


Link to post
Share on other sites

 

 

<input type="text" class="form-control" id="produto" name="produto"  onblur="BuscaPr()">

 

 

Ola. eu chamo a função JS a seguir  no onblur do input acima. cikiqyeu is alerts para confirmar a chamada da função. ta chamando. mas alem dos alerts nao acontece mais nada. segue a função JS e o arquivo php que é chamado no ajax:

 

 

FUNSAO JS

 

    function BuscaPr(){
        var buscaTexto = document.getElementById('produto').value
        alert(buscaTexto) 
        alert(buscaTexto.length) 
        $.ajax({
            method: 'post',
            url: 'sistema/produto/buscapr.php',
            data: {busca: 'sim', texto: buscaTexto},
            dataType: 'json',
            success: function(retorno){
                    if(retorno.qtd == 0){
                        alert('q = 0')
                            $('#resbuscapro').html('<p>Não encontramos resultados para sua busca</p>');
                    }else{
                        alert('q + 0')
                            $('#resbuscapro').html(retorno.dados);
                    }
            }
        });
    }


O ARQUIVO PHP:

 

<?php

if (!session_id()):
    session_start();
endif;

require_once('_app/Config.inc.php');
require_once('./Lib.php');

if (isset($_POST['busca']) && $_POST['busca'] == 'sim'):
    $textoBusca = strip_tags($_POST['texto']);
    $retorno = array();
    $Par = "EM={$_SESSION['userlogin']['emCODIGO']}";
    $Fil = " where emCODIGO = :EM and prDESCRICAO like '%{$textoBusca}%' ";
    $Produto = new Read;
    $Produto->FullRead("select * from produto {$Fil}", $Par);
    if ($Produto->getResult()):
        $retorno['qtd'] = $Produto->getRowCount();
        foreach ($Produto->getResult() as $pro):
            extract($pro);
            $retorno['dados'] .= '<a href="#" id='.$prCODIGO.':'.$prVENDA.'">'. utf8_encode($prDESCRICAO).'</a>';
        endforeach;
    endif;
    echo json_encode($retorno);
endif;
?>
 

Share this post


Link to post
Share on other sites

Ao inves de usar o JavaScript, por que não usar o método $_GET ou $_POST?

 

comeca_aqui.html

<form method=get action=procuraproduto.php>

<input name=produto placeholder=produto>

<input type=submit>

</form>

procurarproduto.php

<?php
$produto=$_GET['produto'];

$sql="select produto from tbproduto where produto like ' %$produto%' ";

etc...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • By ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • By First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • By landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • By ILR master
      Pessoal, pergunta bem simples. Abaixo tenho o seguinte código:
       
      <script>
      function alerta()
      {
        if (window.confirm("Você realmente quer sair?")) {
          window.open("sair.html");
      }
      }
      </script>
       
      Funciona perfeitamente, só que está abrindo em outra janela e quero que abra na mesma janela.
       
      Alguém pode me ajudar?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.