DELETE FROM `users` WHERE `last_visit` < `2021-01-01 00:00:00`

hikaru-59
Invité n'ayant pas de compte PHPfrance

25 avr. 2021, 12:47

Bonjour,
J'aimerais supprimer tous les utilisateurs non connectés depuis une date, mais ça ne marche pas :

Code : Tout sélectionner

DELETE FROM `users` WHERE `last_visit` < `2021-01-01 00:00:00`
Message d'erreur :
#1054 - Champ '2021-01-01 00:00:00' inconnu dans where clause

hikaru
Invité n'ayant pas de compte PHPfrance

25 avr. 2021, 13:30

C'est bon, j'ai trouvé. Il ne fallait pas mettre `` mais des guillemets comme ça autour des dates : ''

Maintenant, je dois mettre le code php :

Code : Tout sélectionner

$last_login = '2013-01-01'; // Pour test $query = $db->prepare("DELETE FROM users WHERE last_visit < :last_login"); $query->bindValue(':last_login', $last_login, PDO::PARAM_STR); if ($query->execute()) { echo '<h2>Les membres inactifs ont été supprimés !</h2>'; }
Là, ça ne marche pas.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 avr. 2021, 14:02

Si ce n'est pas déjà fait, utilise la gestion d'erreurs PDO à PDO::ERRMODE_WARNING, ça aide beaucoup lors du débugage
https://www.php.net/manual/fr/pdo.error-handling.php
Quand tout le reste a échoué, lisez le mode d'emploi...

hikaru-59
Invité n'ayant pas de compte PHPfrance

25 avr. 2021, 15:08

En fait, c'est bon, ça marche avec la méthode prepare.

C'était avec la méthode sans prepare qui ne marchait pas. Je sais qu'il ne faut pas faire, mais j'aimerais quand même comprendre pourquoi ça ne marche pas :

Code : Tout sélectionner

$last_login = '2021-01-01'; // Pour test $db->query("DELETE FROM users WHERE last_visit < $last_login"); // $db->query("DELETE FROM users WHERE last_visit < '$last_login'"); // Ne marche pas non plus if ($query->execute()) { $count = $query->rowCount(); // rowCount() retourne le nombre de lignes effacées dans la BDD echo "<p>$count membre(s) inactif(s) depuis le $last_login supprimé(s) !</p>"; }
Est-ce un problème de syntaxe ?

Message d'erreur sur la ligne : if ($query->execute()) :
Notice: Undefined variable: query in ... on line 72

Fatal error: Uncaught Error: Call to a member function execute() on null in ... :72 Stack trace: #0 {main} thrown in ... on line 72

Mammouth du PHP | 2703 Messages

25 avr. 2021, 15:13

il faut donner une valeur à $query avant de l'utiliser.

hikaru-59
Invité n'ayant pas de compte PHPfrance

25 avr. 2021, 15:40

Merci, ça marche :

Code : Tout sélectionner

$query = $db->query("DELETE FROM users WHERE last_visit < '$last_login'");
Par contre, bizarrement :

Code : Tout sélectionner

$count = $query->rowCount();

n'a pas l'air de marcher avec la méthode sans prepare. J'obtiens 0 tout le temps. Alors qu'avec la méthode prepare, ça marchait bien.

Comment ça se fait ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 avr. 2021, 20:53

https://www.php.net/manual/fr/pdostatement.rowcount.php
rowCount — Retourne le nombre de lignes affectées par le dernier appel à la fonction execute()
Du coup si tu ne fais pas d'execute() bah ça retourne 0...
Quand tout le reste a échoué, lisez le mode d'emploi...

hikaru-59
Invité n'ayant pas de compte PHPfrance

25 avr. 2021, 22:54

Si, j'ai bien fait execute :

Code : Tout sélectionner

$query->execute(); $count = $query->rowCount(); // Obtient le nb de lignes effacées. Ca marche pour la requete préparée
J'ai fait un test avec la méthode sans requete prepare. C'est très bizarre, cela marche si je fais rowCount() avant execute :

Code : Tout sélectionner

$count = $query->rowCount(); // Obtient le nb de lignes effacées. Ca marche sans requete prepare $query->execute(); // $count = $query->rowCount(); // Ne marche pas ici