Page 1 sur 1

La fonction DELETE, eviter les erreurs ?

Posté : 02 févr. 2007, 20:34
par Brice83
Bonsoir,

Pour mon espace membre,je suis en train de créer la fonction de désinscription :
DELETE FROM membres WHERE id='$id' AND pseudo='$pseudo'
Seulement,j'ai aussi d'autres tables ou le membre est susceptible d'y etre MAIS ce n'est pas obliger car cela dépend de ce qu'il a fait sur mon site !

Donc,si je demande un DELETE sur une table ou ce membre n'est pas présent, je suppose que ca finira avec une erreur ?

Et si oui, comment éviter cette erreur ?

merci

Posté : 02 févr. 2007, 21:28
par Brice83
Je vient d'essayer "manuellement" avec phpmyadmin et voici ce que j'ai en retour :
Nombre d'enregistrements effacés : 0 (traitement: 0.0003 sec.)requête SQL:DELETE FROM unetable WHERE pseudo = 'Anthony'
dois-je en conclure que même si un pseudo n'est pas présent dans une table,aucune erreur ne sera retourner ?

Posté : 02 févr. 2007, 21:51
par Ajoloca
Bonjour,

MySQL ne retourne pas d'erreur dans le sens ou tu l'entends, il va te retourner le nombre d'enregistrements affectés.

Si dans la table en question il ne trouve pas d'enregistrements correspondant à tes critères, il te dit tout simplement que le traitement c'est effectué sur 0 (zéro) enregistrements.

C'est la même chose que si tu fais un SELECT sur une table et il ne trouve pas d'enregistrements.

Posté : 02 févr. 2007, 21:51
par albat
Les membres inscrits doivent être identifiés selon leur... identifiant.
Donc pas besoin d'utiliser le pseudo.
$sql = "DELETE FROM membres WHERE id=".$id;       // si id est numérique
$sql = "DELETE FROM membres WHERE id='".$id."'";  // si id est alphanumérique

Posté : 02 févr. 2007, 21:52
par maïa
je ne crois pas que cela génère une erreur,
peut être que la question a se poser est : si il y a une suppression est ce que cela implique une autre action,
si oui fait un test sur le nombre de supression
si non bahhh quoi ?

Posté : 02 févr. 2007, 22:15
par Brice83
Merci de vos réponses !

albat ==> deux membres ne peuvent pas avoir le même pseudo donc que je sélectionne par rapport à l'id, a l'email , ou au pseudo, le code sélectionnera la bonne personne et sans erreur !

puis la sélection a l'id me parait un peu complexe car en fonction de ces actions sur mon site le membre qui a l'id n°4 dans la table membre peut très bien avoir l'id n° 59 dans la table commande... et l'id n° 197 dans la table 'commentaire'... !

donc la sélection à l'id me parait completement impossible dans mon cas..

car exemple :

mon tout premier membre s'inscrit, il a donc l'ID 1 dans la table membres et ne commande rien ! Un second membre s'inscrit,a donc l'ID 2 dans 'membres' et lui,passe une commande qui s'inscrit dans la table 'commande',il obtient donc l'id 1 dans cette table....!

tu vois ou je veut en venir ?

Posté : 02 févr. 2007, 22:22
par Ajoloca
Re,

Tu as un ÉNORME, MONSTRUEUX, ... problème de conception.

Posté : 02 févr. 2007, 22:27
par albat
Sans vouloir me montrer sévère, je dirais que ta base souffre d'un gros défaut de modélisation. :-*

Posté : 02 févr. 2007, 22:29
par albat
RTu as un ÉNORME, MONSTRUEUX, ... problème de conception.
Et moi qui craignais de paraître agressif... :roll:

Posté : 02 févr. 2007, 22:29
par Brice83
Re,

Tu as un ÉNORME, MONSTRUEUX, ... problème de conception.
Non, a chaque commande= 1 ligne !

donc mettre une clée primaire n'est pas possible !

A moins que j'insert cette clée ?

exemple :

le membre commande, j'utilise donc INSERT INTO commande VALUES ('$id',.....) et là oui, je pourrait selectionner par rapport au numéro d'identifiant !

cette solution est t'elle mieux ?

Posté : 02 févr. 2007, 22:34
par iclo
Regardes du côté des clés étrangères pour faire le lien entre la table membre et la table commande.

Posté : 02 févr. 2007, 23:01
par Ajoloca
Re,
Voici une structure, réduite à sa plus simple expression, mais qui respecte la notion d'identifiant.
Image
Et voici le code SQL pour un moteur InnoDB (Qui gère les contraintes référentielles)
CREATE TABLE membres (
  id_membre INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  nom VARCHAR(50) NULL,
  PRIMARY KEY(id_membre)
)
ENGINE=InnoDB;

CREATE TABLE commandes (
  num_commande INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  id_membre INTEGER UNSIGNED NOT NULL,
  date_cmde TIMESTAMP NULL,
  PRIMARY KEY(num_commande),
  FOREIGN KEY(id_membre)
    REFERENCES membres(id_membre)
      ON DELETE NO ACTION
      ON UPDATE NO ACTION
)
ENGINE=InnoDB;