J'essaye de traiter un formulaire. S'il y a une erreur, l'utilisateur sera redirigé vers le formulaire, où les erreurs seront affichées et tout ce que l'utilisateur essayait de soumettre sera renvoyé à la zone de texte du formulaire. De cette façon, l'utilisateur n'aura plus à tout réécrire. Tout fonctionne bien sauf que la variable de session ne fait pas écho dans l'éditeur tinymce après la redirection de l'utilisateur. La variable de session est définie et a la valeur correcte. Si je fais écho aux variables de session en dehors de Tinymce, cela apparaît comme prévu. Il n'apparaîtra tout simplement pas dans la zone de texte. Comment puis-je réparer ça?
De plus, je sais que cela est sensible à xss. Je veux permettre aux utilisateurs de mettre en forme leur message, donc je l'exécuterai plus tard via HTML Purifier.
addnewthread.php:
<!DOCTYPE html>
<html>
<?php
session_start();
?>
<head>
<!-- title, meta, stylesheet, etc. -->
<script type="text/javascript" src="jquery.js"></script>
<script src="https://cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
<script>tinymce.init({selector:"#threadCont", height: 300, resize: false
});</script>
</head>
<body>
<?php
if($_GET['submit']==="error")
{
if((isset($_SESSION['forum_titErr'])&&!empty($_SESSION['forum_titErr']))||
(isset($_SESSION['forum_thrContErr'])&&!empty($_SESSION['forum_thrContErr'])))
{
echo $_SESSION['forum_titErr'];
echo $_SESSION['forum_thrContErr'];
session_unset($_SESSION['forum_titErr']);
session_unset($_SESSION['forum_thrContErr']);
}
}
?>
<form action='addnewthread.php' method='post'>
<input type='text' name='thread-title' id='thread-title' placeholder='Type title here' class='user-input'
<?php
if(isset($_SESSION['threadTitle'])&!empty($_SESSION['threadTitle'])
{
echo "value='{$_SESSION['threadTitle']}'";
}
?>
>
<textarea id='threadCont' name='threadCont'>
<?php
if(isset($_SESSION['threadCont'])&!empty($_SESSION['threadCont'])
{
echo $_SESSION['threadCont'];
}
?>
</textarea>
<button id='submit' type='submit' name='submit'value='success'>Submit</button>
</form>
</body>
</html>
formulaire html:
<?php
session_start();
if($_SERVER['REQUEST_METHOD']==='POST')
{
if(isset($_POST['submit'])&&$_POST['submit']==='success')
{
if (empty(trim($_POST['thread-title'])))
{
$_SESSION['forum_titErr'] = "<p class='error text-center'>Error message</p>";
}
else
{
$_SESSION['threadTitle'] = $_POST['thread-title'];
}
if (empty(trim($_POST['thread-content'])))
{
$_SESSION['forum_thrContErr'] = "<p class='error text-center'>Error message </p>";
}
else
{
$_SESSION['threadCont'] = $_POST['thread-content'];
}
if((isset($_SESSION['forum_titErr'])&&!empty($_SESSION['forum_titErr']))|| (isset($_SESSION['forum_thrContErr'])&&!empty($_SESSION['forum_thrContErr'])))
{
header("Location: newthread.php?submit=error");
}
else
{
//insert into database and redirect to readtopic.php if insert is successful; else redirect to form and show insert is not successful
}
}
else{
header("Location: newthread.php");
}
}
else
{
exit('invalid request');
}
?>
3 Réponses :
Je pense que vous devez le faire comme ceci
<form action='addnewthread.php' method='post'>
<input type='text' name='thread-title' id='thread-title' placeholder='Type title here' class='user-input'
<?php
if(isset($_SESSION['threadTitle']) && !empty($_SESSION['threadTitle']))
{
echo "value='{$_SESSION['threadTitle']}'";
}
?>
>
<textarea id='threadCont' name='threadCont'>
<?php
if(isset($_SESSION['threadCont']) && !empty($_SESSION['threadCont']))
{
echo $_SESSION['threadCont'];
}
?>
</textarea>
<button id='submit' type='submit' name='submit'value='success'>Submit</button>
</form>
Faites simplement écho à la variable, prenez simplement soin de " et ' à cause de la concaténation de chaînes.
Pour l'entrée:
<textarea id='threadCont' name='threadCont'>
<?php
if(isset($_SESSION['threadCont'])&!empty($_SESSION['threadCont'])
{
echo $_SESSION['threadTitle'];
}
?>
</textarea>
J'ai vérifié votre code et j'ai constaté que vous aviez oublié d'ajouter des crochets:
<form action='addnewthread.php' method='post'>
<input type='text' name='thread-title' id='thread-title' placeholder='Type title here' class='user-input'
<?php
if(isset($_SESSION['threadTitle'])&&!empty($_SESSION['threadTitle']) <--here
{
echo "value='{$_SESSION['threadTitle']}'";
}
?>
>
<textarea id='threadCont' name='threadCont'>
<?php
if(isset($_SESSION['threadCont'])&&!empty($_SESSION['threadCont']) <--and here
{
echo $_SESSION['threadCont'];
}
?>
</textarea>
<button id='submit' type='submit' name='submit'value='success'>Submit</button>
</form>
Vous devez également remplacer & par && .
J'ai corrigé le code et découvert que la raison pour laquelle la zone de saisie / texte ne fait pas écho aux variables de session est que j'utilisais session_unset ($ _ Session ['variable']) au lieu de unset ($ _ Session ['variable']). Quand j'utilise unset ($ _ Session ['variable']) ou que je déplace session_unset ($ _ Session ['variable']) jusqu'au bas de la page, cela fonctionne. Je ne comprends pas vraiment pourquoi cela se produit. Je pensais que session_unset ($ _ Session ['variable']) ne désarmera que la variable entre parenthèses, mais il semble désarmer toutes les variables de session existantes dans la session?
Vos constructions
if (isset ($ _ SESSION ['threadTitle']) &! Empty ($ _ SESSION ['threadT itle'])n'ont pas beaucoup de sens. Tout d'abord, vide inclut la vérification de est déjà défini, il n'est donc pas nécessaire d'utiliser les deux. Et deuxièmement,&serait un bit à bit et, vous voudriez un logique et ici, c'est&& < / code>