Passer paresseux une variable à un élément HTML dans une page PHP ou la remplacer par une valeur mise à jour
P粉253800312
2023-08-17 22:55:08
<p><br /></p>
<pre class="brush:bash;toolbar:false;">/public/register.php ## [1] Formulaire d'inscription "public"
/public/js/checkout.js ## [2] Traitement des paiements "publics"
/src/register.php ## [3] Traitement supplémentaire "privé"
≪/pré>
<ul>
<li>[1] Charger via <code><script src="js/checkout.js"></script></code>
<li>[1] via <code>require __DIR__ '/../src/register.php';</code>
</ul>
<p>[1] contient un élément HTML (inclus sous forme de code HTML dans le fichier PHP, c'est à dire en dehors de la balise <code><php ... ?></code>) : </p> ;
<pre class="brush:html;toolbar:false;"><div id="secret" style="display: none;">
<?php
echo htmlspecialchars($secret_var);
?>
</div>
≪/pré>
<p><code>$secret_var</code> est déclaré/instancié dans [3]. </p>
<p>[2] Ce fichier JS contient </p>
<pre class="brush:js;toolbar:false;">var div = document.getElementById("secret");
var secret_var = div.textContent;
console.log(secret_var)
≪/pré>
<p>[3] contient</p>
<pre class="brush:php;toolbar:false;">session_start();
// Code de traitement du partenaire de paiement, réponse
$secret_var = json_encode(array(secret_var);
$_SESSION['secret_var'] = $secret_var;
≪/pré>
<p><code>$secret_var</code> est transmis en tant que variable <code>$_SESSION</code> de [3] à [1] où [2] le récupère. </p>
<p>Lors de l'écho de <code>$secret_var</code> dans le navigateur à partir de l'instruction <code>console.log</code>, il renvoie <code>null</code>. </p>
<p>Lors de l'écho de <code>$secret_var</code> à partir de <code>src/register.php</code> (affiché dans la page <code>registration.php</code> rendue a la valeur (chaîne) correcte. </p>
<p>Comment puis-je retarder la transmission de <code>$secret_var</code> à l'élément <code>#secret</code> ou le remplacer par une valeur mise à jour (non nulle) ? </p>
Je suppose que vous avez un problème avec l'ordre d'exécution, comme s'il n'y avait même pas de
<div id="secret">
时,[2]脚本就已经执行了。您可以在输出<script src="js/checkout.js"></script>
之前,简单地在[1]处添加类似于<script>var secret_var = <?= json_encode($secret_var); ?>;</script>
的内容,这样它就在checkout.js
执行之前就是公开的并且已知的,而且已经作为变量存在,无需读取元素内容。或者只需使用事件,如window.onload
dans le DOM pour effectuer [2] la lecture des éléments.Si cette valeur secrète change et que vous devez la mettre à jour, vous pouvez vérifier périodiquement les modifications ou, mieux encore, demander la dernière valeur avant de l'utiliser.
Veuillez noter que tout ce que vous envoyez au client n'est plus un secret, si vous voulez vraiment protéger une valeur, vous devez la conserver uniquement côté serveur, ce qui est très important dans des cas comme les clés API pour les passerelles de paiement, etc. . Côté serveur signifie stocker le secret dans une base de données ou une session. Ensuite, chaque fois que vous avez besoin d'interagir avec le service distant, appelez simplement un script PHP (par exemple ajax) pour effectuer cette tâche côté serveur, de cette façon vous séparez l'utilisation du secret du côté serveur uniquement et vous n'avez alors pas besoin de le faire. transmettez-le au terminal client ou demandez une mise à jour.