[RESOLU] DELETE RÉCALCITRANT AVEC JOINTURE

Eléphant du PHP | 345 Messages

28 sept. 2024, 12:43

$pdostat = $bdd->prepare('SELECT pos_x FROM membres WHERE id = :id');
$pdostat->bindvalue(':id', $idMembreSession, PDO::PARAM_INT);
$pdostat->execute();
$membreSession = $pdostat->fetch();
if (!empty($membreSession )) { 
$pos_x = $membreSession['pos_x'];
}
if($pos_x === -1) 
{
$pdostat = $bdd->prepare("DELETE pos_x, pos_y FROM map INNER JOIN membres ON membres.pos_x=map.pos_x AND membres.pos_y=map.pos_y WHERE membres.id=:id");
$pdostat->bindvalue(':id', $idMembreSession, PDO::PARAM_INT);
$pdostat->execute();
}
Principe:
Si le joueur est arrivé sur une position négative (pos_x= -1) ,il faut deleter en table les infos précédemment sauvegardées (car il change de map lorsque position négative atteinte)...
Ce delete ne fonctionne pas.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 sept. 2024, 11:32

Quel est le message d'erreur ?
:arrow: Lien utile pour activer l'affichage des erreurs SQL en warning : https://www.php.net/manual/fr/pdo.error-handling.php
Sinon tu peux aussi tester ta requête avec phpmyadmin.

Pour ma part, j'évite toujours les jointures dans les DELETE, je préfère faire 2 requêtes séparées pour ne pas avoir de souci.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 345 Messages

30 sept. 2024, 17:53

Je n'ai aucun message erreur... mais j'ai fait plus simple (ça marche dans mysql)
$pdostat = $bdd->prepare('SELECT pos_x FROM membres WHERE id = :id');
$pdostat->bindvalue(':id', $idMembreSession, PDO::PARAM_INT);
$pdostat->execute();
$membreSession = $pdostat->fetch();
if (!empty($membreSession )) { 
$pos_x = $membreSession['pos_x'];
}
if($pos_x === -1) 
{
$sql= "DELETE FROM map WHERE pos_x=-1";
$pdostat = $bdd->prepare($sql);
$pdostat->execute();
A voir en direct live avec php...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 oct. 2024, 11:24

Je ne sais pas ce que ton code est censé effectuer, mais on est d'accord que si tu exécutes ta requête "DELETE FROM map WHERE pos_x=-1", ça va supprimer tous les enregistrements où pos_x=-1 sans distinction de membre ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 345 Messages

07 oct. 2024, 13:08

oui, c'est le but recherché.

Avatar du membre
Mammouth du PHP | 1609 Messages

08 oct. 2024, 15:26

Je dis ça je dis rien mais si tu veux supprimer toutes les lignes qui ont pos_x égale à -1 le SELECT sert à rien. Juste le DELETE suffira et il supprimera, comme le souligne @rthur, toutes les lignes avec pos_x égale à -1 peu importe leur id.

Si tu veux supprimer seulement LA ligne d'id $idMembreSession si et seulement si pos_x est égale à -1 alors il manque tout de même une condition dans le WHERE du DELETE. WHERE pos_x = -1 AND id = :id

Et dans ce cas le SELECT n'est pas indispensable non plus puisque le DELETE ne supprimera la ligne d'id $idMembreSession que si pos_x est égale à -1.
Développeur web depuis + de 20 ans

Eléphant du PHP | 345 Messages

10 oct. 2024, 00:59

Merci pour ces remarques éclairées, et oui, en effet, j'ai supprimé le SELECT inutile dans ce cas présent ! :idea: