Supprimer les messages d'un chat dont la date est plus vieille q'une date dans une variable mois un intervalle de temps

Epsonscandu37
Invité n'ayant pas de compte PHPfrance

14 août 2019, 17:02

Bonjour, j'ai deux scripts, un formulaire et post pour remplir et delete dans la table des messages.
Je précise que je ne veux pas utiliser NOW() même si ça serait plus facile, je souhaite être capable d'utiliser une date en variable dans ma requête SQL.
Cordialement,
Joce
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" type="text/css" href="style.css" />
    <title>Les Tortues aquatiques et leur habitat domestique</title>
</head>

<body>
<?php include("header.php"); ?>

    <?php include("nav.php"); ?>

    <div>
        <h3>Le chat</h3>

            Veuillez taper votre pseudo
        <form action="minichat_post.php" method="post">
            <p>
                <input type="text" name="pseudo" />
                <input type="text" name="message" />
                <input type="submit" value="Valider" />
            </p>
        </form>
    </div>
<?php
// Connexion à la base de données
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}


// Récupération des 10 derniers messages
$reponse = $bdd->query('SELECT pseudo, message,date FROM chat ORDER BY ID DESC LIMIT 0, 40');
// Affichage de chaque message (toutes les données sont protégées par htmlspecialchars)
while ($donnees = $reponse->fetch())
{
    echo '<p><strong>' . htmlspecialchars($donnees['pseudo'])." à " . htmlspecialchars($donnees['date']) . '</strong> : ' . htmlspecialchars($donnees['message']) . '</p>';
}

$reponse->closeCursor();

?>


<footer id="pied_de_page">
    <p><a href="mailto:nospam@laposte.net">contact</p>
</footer>

</body>
</html>

<?php
// Connexion à la base de données
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
$date=date("Y-m-d H:i:s");
$sql=$bdd->prepare("DELETE FROM chat WHERE DATE_SUB(:date_current,INTERVAL 5 MIN)>date");
$sql->execute(array(
    date_current=>$date
));
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO chat (pseudo, message,date) VALUES(?, ?, ?)');
$req->execute(array($_POST['pseudo'], $_POST['message'], $date));

// Redirection du visiteur vers la page du minichat
header('Location: chat.php');
?>

Epsonscandu37
Invité n'ayant pas de compte PHPfrance

14 août 2019, 17:51

Ah oui au fait j'ai inversé le <, mais cela ne fonctionne toujours pas.
COrdialement,
Joce

Eléphant du PHP | 144 Messages

16 août 2019, 02:14

Bonjour, bonsoir

Tu as une erreur de syntaxe dans ta requête, la bonne syntaxe pour "INTERVAL" en utilisant des minutes est : "INTERVAL 5 MINUTE"

Pour aller plus vite la prochaine fois n'hésite pas à tester ta requête directement dans MySQL
Tu aurais pu par exemple essayer cette requête :

Code : Tout sélectionner

SELECT * FROM chat WHERE DATE_SUB(:date_current,INTERVAL 5 MIN)>date

Tu pourras ainsi tester ta condition sans risquer de perdre la moindre données.
MySQL te renverra alors les erreurs de syntaxe :

Code : Tout sélectionner

ERROR 1064 (42000): Erreur de syntaxe près de 'MIN) > date' à la ligne 1
Cordialement
Naroth

Epsonscandu37
Invité n'ayant pas de compte PHPfrance

19 août 2019, 11:26

Bonjour, merci j'ai corrigé mais cela ne fonctionne toujours pas,
voici un nouveau code :


<?php
// Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$date=date("Y-m-d H:i:s");
$sql="DELETE FROM chat WHERE DATE_SUB($date,INTERVAL 1 MINUTE)<date";
$bdd->query( $sql) ;
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO chat (pseudo, message,date) VALUES(?, ?, ?)');
$req->execute(array($_POST['pseudo'], $_POST['message'], $date));

// Redirection du visiteur vers la page du minichat
header('Location: chat.php');
?>

Eléphant du PHP | 144 Messages

19 août 2019, 20:48

Bonsoir,

Tu peux mettre ta requête dans un try catch pour récupérer l'erreur

Code : Tout sélectionner

// Connexion à la base de données try { $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } try { $date=date("Y-m-d H:i:s"); $sql="DELETE FROM chat WHERE DATE_SUB($date,INTERVAL 1 MINUTE)<date"; $bdd->query( $sql) ; // Insertion du message à l'aide d'une requête préparée $req = $bdd->prepare('INSERT INTO chat (pseudo, message,date) VALUES(?, ?, ?)'); $req->execute(array($_POST['pseudo'], $_POST['message'], $date)); // Redirection du visiteur vers la page du minichat header('Location: chat.php'); } catch( Exception $e) { echo $e->getMessage(); }
Regarde le message d'erreur en sortie.
Cordialement
Naroth

Petit nouveau ! | 3 Messages

20 août 2019, 15:00

Bonjour, ok j'ai fait ça :
try {

$date=date("Y-m-d H:i:s");
$sql="DELETE FROM chat WHERE DATE_SUB($date,INTERVAL 1 MINUTE)<date";
$bdd->query( $sql) ;

// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO chat (pseudo, message,date) VALUES(?, ?, ?)');
$req->execute(array($_POST['pseudo'], $_POST['message'], $date));

// Redirection du visiteur vers la page du minichat
//header('Location: chat.php');
}
catch( Exception $e) {
echo $e->getMessage();
}

Et aucun message d'erreur ne s'affiche, j'ai juste une page blanche.

Petit nouveau ! | 3 Messages

20 août 2019, 15:03

pardon j'ai inversé le <, mais ça ne marche toujours pas

Eléphant du PHP | 144 Messages

Hier, 23:43

Juste au cas ou : Tu n'es pas redirigé ? Ta page chat.php n'est pas vide ?

Tu peux activer la remontée de toutes les erreurs et warnings de PHP

Ajoute juste la ligne suivante au début de ton fichier.

Code : Tout sélectionner

ini_set("display_errors", "1")
https://www.php.net/manual/fr/errorfunc ... lay-errors

Si toujours rien va falloir debug un peu plus énervé.
A base de echo un peu partout pour savoir où le script s'arrête.
Cordialement
Naroth