[RESOLU] DELETE RÉCALCITRANT AVEC JOINTURE

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] DELETE RÉCALCITRANT AVEC JOINTURE

Re: DELETE RÉCALCITRANT AVEC JOINTURE

par nestor94 » 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:

Re: DELETE RÉCALCITRANT AVEC JOINTURE

par Saian » 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.

Re: DELETE RÉCALCITRANT AVEC JOINTURE

par nestor94 » 07 oct. 2024, 13:08

oui, c'est le but recherché.

Re: DELETE RÉCALCITRANT AVEC JOINTURE

par @rthur » 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 ?

Re: DELETE RÉCALCITRANT AVEC JOINTURE

par nestor94 » 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...

Re: DELETE RÉCALCITRANT AVEC JOINTURE

par @rthur » 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.

DELETE RÉCALCITRANT AVEC JOINTURE

par nestor94 » 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.