Signaler

Effacer le texte qui vient de s'inscrire dans un minichat [Résolu]

Posez votre question sunev 39Messages postés dimanche 29 mai 2016Date d'inscription 16 mai 2017 Dernière intervention - Dernière réponse le 19 mai 2017 à 18:18 par sunev
Bonjour,

Dans un minichat aprés avoir appuyer sur "envoyer" le message s'affiche sur la page.
J'aimerai a laide d'un bouton "effacer" enlever le texte qui vient de s'inscrire.
j'avais trouvé un code qui le faisait mais je l'ai perdu.
le bouton "Effacer" appelait une fonction javascript.
Si quelqu'un a la solution, merci d'avance, je suis pas assez calé en js pour le refaire,
pourtant c'était un code tout simple, quand on faisait "reset " le texte qui venait d'apparaitre s’effaçait.

Afficher la suite 
Utile
+0
plus moins
Bonjour,

Il suffit de taper sur l'élément contenant tes messages via son id.. puis d'utiliser la propriété innerHTML pour la mettre à vide.
function effacer(){
  var elm = document.getElementById('id_de_ton_container');  
       elm.innerHTML = '';
}



Donnez votre avis
Utile
+0
plus moins
OK merci ça fonctionne, merci

  <script type="text/javascript">   
function effacer(){
var elm = document.getElementById('effa');
elm.innerHTML = '';
} </script>

<input type="button" onclick="effacer()" value="Reset" />

<?php
// Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
while ($donnees = $reponse->fetch()){
echo '<p id="effa"> ' . $donnees['date_fr']. ':<strong> ' . htmlspecialchars($donnees['pseudo']) . '</strong> :
' . htmlspecialchars($donnees['message']) . '</p>';
}


le petit bémol c'est que ça n’efface que le message que l'on vient d'envoyer,
(la date reste) le code que j'avais avant, si on appuyait plusieurs fois, le dernier message de la liste s’effaçait complétement au fur et a mesure (date compris) jusqu’à plus de message.
jordane45 17902Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 21 juillet 2017 Dernière intervention - 15 mai 2017 à 10:29
Y'a un petit problème dans ton code .... tu mets le même ID à TOUS tes messages ....
hors un ID ( comprendre : identifiant....) se doit d'être UNIQUE !

De plus .. le code que je t'ai donné n'éfface que "visuellement" le message ... il est toujours présent en BDD ...
Pour l'éffacer également de la BDD ... il faudra le faire en AJAX.


Pour pouvoir t'en dire plus... il faudra que tu nous donnes la structure de ta table de ta BDD (celle qui contient les messages).
Répondre
Donnez votre avis
Utile
+0
plus moins
BDD minichat
TABLE chatcheurs


id INT AUTO_INCREMENT,
speudo VARCHAR (50),
message text,
date_creation datetime
PRIMARY KEY(id)
Donnez votre avis
Utile
+0
plus moins
Ok,

Donc on va non pas "vider" le contenu de ta balise <p> .. mais complètement la retirer...


Dans ton script d'origine :

<input type="button" onclick="effacer()" value="Reset" />

<?php
// Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
$last_id = 0;
while ($donnees = $reponse->fetch()){
  echo '<p id="msg_'.$donnees['id'].'"> ' . $donnees['date_fr']. ':<strong> ' . htmlspecialchars($donnees['pseudo']) . '</strong> :
          ' . htmlspecialchars($donnees['message']) . '</p>';
  $last_id = $donnees['id'];
}


?>

<!-- Javascript à placer A LA FIN de ton document juste avant le </body> -->
<script type="text/javascript">   
/**
* Fonction pour supprimer un message en AJAX
*/
function effacer(){
  var last_id = '<?php echo $last_id; ?>';
  
  //on fait un ajax pour supprimer en bdd:
  var urlAjx = "delete_msg.ajx.php";
  var data = {id:last_id};
  $.ajax({ 
      type: "POST",
      url: urlAjx,
      data: data,
      async: async,
      dataType: "json",
      success: function(reponse){
         //on retire la ligne
         $('#msg_'+last_id).fadeOut(300, function(){ $(this).remove();});
       },
      error:function(jqXHR, textStatus){
        var error = formatErrorMessage(jqXHR, textStatus);
            alert('error :' + error);
        }
     }); 
}
 
 /**
  Format les messages erreurs AJAX pour les afficher
 */
 function formatErrorMessage(jqXHR, exception) {
 var errorTxt="";
 var err = jqXHR.responseText ;
    if (jqXHR.status === 0) {
        errorTxt = ('Not connected.\nPlease verify your network connection.');
    } else if (jqXHR.status == 404) {
        errorTxt = ('The requested page not found. [404]');
    } else if (jqXHR.status == 500) {
        errorTxt = ('Internal Server Error [500].');
    } else if (exception === 'parsererror') {
        errorTxt = ('Requested JSON parse failed.');
    } else if (exception === 'timeout') {
        errorTxt = ('Time out error.');
    } else if (exception === 'abort') {
        errorTxt = ('Ajax request aborted.');
    } else {
        errorTxt = ('Uncaught Error.\n' + jqXHR.responseText);
    }
    
    return errorTxt + " : " +err;
}  
</script>



Ensuite il faut créer un fichier ajax php pour le traitement...
=> fichier nommé delete_msg.ajx.php par exemple
<?php

//connexion à la bdd (mettre ton fichier de connexion)
require_once "cnxbdd.php";


//récupération propre des variables AVANT de les utiliser
$id = !empty($_POST['id']) ? $_POST['id'] : NULL

$result = $_POST;
if($id){
  $sql = 'DELETE FROM  chatcheurs WHERE id = :id'
  $datas = array(":id"=>$id);

  try{
    $req=$bdd->prepare($sql);
    $result = $req->execute();
  }catch(Exception $e){
    echo "Erreur :".$e->getMessage();
    echo "<br>Requete :".$sql;
    
  }
}

echo json_encode($result);
?>


NB: Tu auras, au préalable, chargé la librairie JQUERY dans ton site.... ( récupérable ici : https://code.jquery.com/jquery-3.2.1.min.js et à enregistrer sous (et le mettre sur ton site))
puis l'inclure dans ton html (en général .. dans le HEAD de ta page ou au moins au début de celle ci au début de ton body)
<script src="jquery-3.2.1.min.js"></script>


NB² : En cas de soucis, pense à regarder dans la CONSOLE de ton navigateur si il n'y a pas des messages d'erreurs et/ou le résultat de l'appel ajax.
pour ça.. soit tu utilises Firefox .. soit tu penses à installer le plugin : ajax debuger pour Chrome.

NB3 : Tu utilises PDO ... penses à activer la gestion de erreurs PDO : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

.

Donnez votre avis
Utile
+0
plus moins
Merci jordane45 de toutes tes réponses.

Je vais essayer de faire comme tu m'a dis, mais l'ajax je n'y connais rien,
je me défend bien en html, css, j'ai étudié le php que je commence a peine a comprendre, le javascript un peu ça ressemble au php avec une autre syntaxe, les BDD, mais l'ajax c'est l'inconnue, en plus ça a l'air d'une vraie usine a gaz, je m'y intéresserais que quand j'aurais bien intégré php , js et sql
Merci encore de ton aide que j’apprécie d'autant plus que ce n'est pas la première fois que tu m'indique la marche à suivre.
jordane45 17902Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 21 juillet 2017 Dernière intervention - 15 mai 2017 à 14:08

mais l'ajax c'est l'inconnue

L'ajax n'est rien de "nouveau" pour toi ... après tout ce n'est qu'une méthode pour faire appel à du PHP dans du code javascript ...
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjours jordane45

jusqu'a maintenant je pensais que l'on pouvait mettre du javascript dans du php mais pas le contraire.

J'ai tout bien mis ton code mais ça m'affiche une erreur de la variable
$reponse, pourtant cette variable existe et fonctionnait bien avec l’ancien
code:
<?php
while ($donnees = $reponse->fetch()){
echo '<p id="effa"> ' . $donnees['date_fr']. ':<strong> ' . htmlspecialchars($donnees['pseudo']) . '</strong> :
' . htmlspecialchars($donnees['message']) . '</p>';
}
$reponse->closeCursor(); ?>


Erreurs qui s'affichent avec le nouveau:

Notice: Undefined variable: reponse in C:\EasyPHP-12.1\www\00siteencourdu092016\mini_chat.php on line 108

Fatal error: Call to a member function fetch() on a non-object in C:\EasyPHP-12.1\www\00siteencourdu092016\mini_chat.php on line 108

La ligne 108 est soulignée et mis en gras dans le code
le code de la page complet:
<script src="jquery-3.2.1.min.js"></script> <!-- appel du fichier pour le code ajax -->
</head>

<body>
<form action="mini_chat_post.php" method="post">
<p><label for="pseudo">Pseudo :</label><input type="text" name="pseudo" id="pseudo" /></p>
<p><label for="message">Message :</label><textarea id="message" name="message" cols="40" rows="4" autofocus></textarea></p>

<p><input type="submit" value="Envoyer" /></p>
<input type="button" onclick="effacer()" value="Reset" />

<?php
$last_id = 0;
while ($donnees = $reponse->fetch()){
echo '<p id="msg_'.$donnees['id'].'"> ' . $donnees['date_fr']. ':<strong> ' . htmlspecialchars($donnees['pseudo']) . '</strong> :
' . htmlspecialchars($donnees['message']) . '</p>';
$last_id = $donnees['id'];
} ?>
</form>

<?php // Connexion à la base de données
try{
$bdd = new PDO('mysql:host=localhost;dbname=minichat', 'root', '');
}
catch(Exception $e){
die('Erreur : '.$e->getMessage());
}
// Récupération des 15 derniers messages
$reponse = $bdd->query('SELECT pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y a %Hh%i\')
AS date_fr FROM chatcheurs ORDER BY ID DESC LIMIT 0, 15');
?>


<!-- Javascript à placer A LA FIN de ton document juste avant le </body> -->
<script type="text/javascript">
/*** Fonction pour supprimer un message en AJAX*/
function effacer(){
var last_id = '<?php echo $last_id; ?>';
//on fait un ajax pour supprimer en bdd:
var urlAjx = "delete_msg.ajx.php";
var data = {id:last_id};
$.ajax({
type: "POST",
url: urlAjx,
data: data,
async: async,
dataType: "json",
success: function(reponse){
//on retire la ligne
$('#msg_'+last_id).fadeOut(300, function(){ $(this).remove();});
},
error:function(jqXHR, textStatus){
var error = formatErrorMessage(jqXHR, textStatus);
alert('error :' + error);
}
});
}

/**Format les messages erreurs AJAX pour les afficher*/
function formatErrorMessage(jqXHR, exception) {
var errorTxt="";
var err = jqXHR.responseText ;
if (jqXHR.status === 0) {
errorTxt = ('Not connected.\nPlease verify your network connection.');
} else if (jqXHR.status == 404) {
errorTxt = ('The requested page not found. [404]');
} else if (jqXHR.status == 500) {
errorTxt = ('Internal Server Error [500].');
} else if (exception === 'parsererror') {
errorTxt = ('Requested JSON parse failed.');
} else if (exception === 'timeout') {
errorTxt = ('Time out error.');
} else if (exception === 'abort') {
errorTxt = ('Ajax request aborted.');
} else {
errorTxt = ('Uncaught Error.\n' + jqXHR.responseText);
}
return errorTxt + " : " +err;
}
</script>
</body>
jordane45 17902Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 21 juillet 2017 Dernière intervention - 16 mai 2017 à 13:28
Tu as oublié de mettre le code de connexion à ta bdd ....AVANT de faire ta requête et ta boucle while ...
De plus .. appliques ceci : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
Répondre
Donnez votre avis
Utile
+0
plus moins
Je viens de faire ce que tu m’a dis, maintenant ça met entre les messages qui s’affiche sur la page du minichat qui s'ouvre :

Notice: Undefined index: id in C:\EasyPHP-12.1\www\00siteencourdu092016\mini_chat.php on line 132

Notice: Undefined index: id in C:\EasyPHP-12.1\www\00siteencourdu092016\mini_chat.php on line 130

les lignes 132 et 130 sont soulignées en gras dans le code:

<?php try{
$bdd =new PDO('mysql:host=localhost; dbname=minichat; charset=utf8', 'root', '');
// Activation des erreurs PDO
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
die('Erreur : ' . $e->getMessage());
}
?>
<?php
// Récupération des 15 derniers messages
$reponse = $bdd->query('SELECT pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y a %Hh%i\')
AS date_fr FROM chatcheurs ORDER BY ID DESC LIMIT 0, 15');
?>

<?php
// Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
$last_id = 0;
while ($donnees = $reponse->fetch()){
echo '<p id="msg_'.$donnees['id'].'"> ' . $donnees['date_fr']. ':<strong> ' . htmlspecialchars($donnees['pseudo']) . '</strong> :
' . htmlspecialchars($donnees['message']) . '</p>';
$last_id = $donnees['id'];
}
?>
Donnez votre avis
Utile
+0
plus moins
salut
Je ne comprends pas

echo '<p id="msg_'.$donnees['id'].'">
il est demandé d'afficher une chaine de carractéres ayant comme identifiant msg_( on est ici en html ?) puis on concaténe le php qui est la $donnees, mais ou ce trouve cet identifiant msg_ placé derrière la balise P on devrait le retrouver en css ?
Il y a une erreur quelque part

je ne comprends pas cette commande, sur php.net
on trouve :
msg_receive — Reçoit un message depuis une file de messages
msg_remove_queue() - Détruit une file de messages
msg_send() - Envoie un message dans une file
msg_stat_queue() - Retourne des informations sur la file de messages
msg_set_queue() - Modifie des informations dans la file de messages

mais msg_ tout court ça n'existe pas
jordane45 17902Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 21 juillet 2017 Dernière intervention - 18 mai 2017 à 21:32
oula ;... de quoi tu me parles avec les fonctions php msg ????
J'ai mis msg comme j'aurai pu mettre toto ....
Je donne juste un identifiant à ta balise p ....

Pour ce qui est du message
Notice: Undefined index: id in C:\EasyPHP-12.1\www\00siteencourdu092016\mini_chat.php on line 130

Ta requête (que je n'avais pas jusqu'à maintenant.... )
ne retourne pas le champ id ... Il faudrait donc la modifier en mettant (par exemple )
 <?php
// Récupération des 15 derniers messages
$reponse = $bdd->query('SELECT id,pseudo, message, DATE_FORMAT(date_creation, \'%d/%m/%Y a %Hh%i\') 
AS date_fr FROM chatcheurs ORDER BY ID DESC LIMIT 0, 15');
?>
Répondre
Donnez votre avis
Utile
+0
plus moins
Ok l'erreur est corrigée et ne s'affiche plus, mais je ne comprends pas le but de l'id
<p id="msg_'.$donnees['id'].'">
De toute façon quand j’appuie sur "reset" rien ne se passe.

Alors j'ai créé le fichier "delete_id.php" qui fonctionne trés bien et efface la derniére ligne de la table"chatcheurs" ;

<?php
// effacer_les_derniéres données d'une table
$serveur ="127.0.0.1";
$login ="root";
$pass ="";
try {
$connexion = new PDO("mysql:host=$serveur;dbname=minichat",$login,$pass);
$connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
$requete = "DELETE FROM chatcheurs ORDER BY id DESC LIMIT 1";
$connexion->exec($requete);
}
catch (PDOException $e) {
echo 'Echec de la connection :'.$e->getMessage();
}
?>


Mais je n'arrive pas a le lancer avec
<input type="button" onclick="delete_id.php" value="Reset" /> 

j'ai essayé avec une fonction, mais je ne trouve pas le code, si quelqu'un a une idée merci de m'instruire, je suis sur que c'est tout simple mais je suis pas assez calé, alors je cherche .............
Donnez votre avis
Utile
+0
plus moins
ça y est j'ai réussi a le faire fonctionner

le fichier "delete_id.php" avec une redirection a lafin:
<?php
// effacer_les_donnes d'une table
$serveur ="127.0.0.1";
$login ="root";
$pass ="";

try {
$connexion = new PDO("mysql:host=$serveur;dbname=minichat",$login,$pass);
$connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$requete = "DELETE FROM chatcheurs WHERE id=1";
$requete = "DELETE FROM chatcheurs ORDER BY id DESC LIMIT 1";

$connexion->exec($requete);
echo "Valeurs bien effacees dans la table chatcheurs de la BDD minichat<br/>";
}

catch (PDOException $e) {
echo 'Echec de la connection :'.$e->getMessage();
}
header('Location: mini_chat.php');
exit();
?>


et le bouton "reset": dans une deuxiéme balise <form action="delete_id.php">:

<form action="mini_chat_post.php" method="post">
<p><label for="pseudo">Pseudo :</label><input type="text" name="pseudo" id="pseudo" /></p>
<p><label for="message">Message :</label><textarea id="message" name="message" cols="40" rows="4" autofocus></textarea></p>
<p><input type="submit" value="Envoyer" /></p>
</form>

<form action="delete_id.php" method="post">
<input type="submit" value="Reset" />
</form>

si ça peut intéresser quelqu'un, et merci de vos réponces.
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !