Requête SQL
Numbyscuit
Messages postés
18
Date d'inscription
Statut
Membre
Dernière intervention
-
Numbyscuit Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
Numbyscuit Messages postés 18 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'aurai un petite question concernant les requêtes SQL.
Tout d'abord, la requête suivante :
M'affiche ce tableau :
http://sd-2.archive-host.com/membres/up/162483317445951997/tableau.jpg
J'aimerai maintenant supprimer tous les champs adresses n'étant pas liés à la table clients via la table avoir.
Ainsi, j'utilise une requête DELETE :
Cependant, PhpMyAdmin me renvoie le message d'erreur suivant :
#1241 - Operand should contain 1 column(s)
Et je ne comprend pas pourquoi ni ce qui peut clocher dans ma requête.
Je vous remercie d'avance pour vos éclaircissements.
J'aurai un petite question concernant les requêtes SQL.
Tout d'abord, la requête suivante :
SELECT * FROM adresses LEFT OUTER JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse WHERE avoir.ID_Client IS NULL OR avoir.ID_Adresse IS NULL
M'affiche ce tableau :
http://sd-2.archive-host.com/membres/up/162483317445951997/tableau.jpg
J'aimerai maintenant supprimer tous les champs adresses n'étant pas liés à la table clients via la table avoir.
Ainsi, j'utilise une requête DELETE :
DELETE FROM adresses WHERE ID_Adresse IN( SELECT * FROM adresses LEFT OUTER JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse WHERE avoir.ID_Client IS NULL OR avoir.ID_Adresse IS NULL)
Cependant, PhpMyAdmin me renvoie le message d'erreur suivant :
#1241 - Operand should contain 1 column(s)
Et je ne comprend pas pourquoi ni ce qui peut clocher dans ma requête.
Je vous remercie d'avance pour vos éclaircissements.
A voir également:
- Requête SQL
- Logiciel sql - Télécharger - Bases de données
- Sql lister les tables ✓ - Forum Programmation
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Jointure sql ✓ - Forum MySQL
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
5 réponses
DELETE FROM adresses WHERE ID_Adresse IN( SELECT ID_Adresse FROM adresses LEFT OUTER JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse WHERE avoir.ID_Client IS NULL OR avoir.ID_Adresse IS NULL)
DELETE adresses.*
FROM adresses
LEFT JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse
WHERE avoir.ID_Adresse IS NULL
Ce SQL supprime toute ligne de la table "adresses" dont la valeur de "ID_Adresse" n'est pas présente dans avoir.ID_Adresse, autrement dit toute adresse non-utilisée par la table "avoir", qu'importe que le client existe ou non.
Est-ce vraiment ce qui est souhaité ?
FROM adresses
LEFT JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse
WHERE avoir.ID_Adresse IS NULL
Ce SQL supprime toute ligne de la table "adresses" dont la valeur de "ID_Adresse" n'est pas présente dans avoir.ID_Adresse, autrement dit toute adresse non-utilisée par la table "avoir", qu'importe que le client existe ou non.
Est-ce vraiment ce qui est souhaité ?
PhpMyAdmin m'a renvoyé le message d'erreur suivant :
#1052 - Column 'ID_Adresse' in field list is ambiguous
J'ai donc adapté la requête SQL :
Et j'ai eu l'erreur suivante :
#1093 - You can't specify target table 'adresses' for update in FROM clause
#1052 - Column 'ID_Adresse' in field list is ambiguous
J'ai donc adapté la requête SQL :
DELETE FROM adresses WHERE adresses.ID_Adresse IN( SELECT adresses.ID_Adresse FROM adresses LEFT OUTER JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse WHERE avoir.ID_Client IS NULL OR avoir.ID_Adresse IS NULL)
Et j'ai eu l'erreur suivante :
#1093 - You can't specify target table 'adresses' for update in FROM clause
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
J'aurai une autre question.
J'aimerai que le client puisse mettre à jour son nom et prénom (jusqu'ici, aucun problème), mais que ça renvoie un message d'erreur si un client partageant la même adresse que lui a déjà le même nom et prénom.
Voici tout d'abord le formulaire qui renvoie les informations :
Voilà maintenant la connexion à la BDD et la définition des variables de post, de session, et de la fonction "anti-doublon".
Le tout sera vérifié par cette condition :
Or, le code semble totalement ignorer ces conditions. Sauriez-vous où est le problème, s'il vous plait ?
J'aurai une autre question.
J'aimerai que le client puisse mettre à jour son nom et prénom (jusqu'ici, aucun problème), mais que ça renvoie un message d'erreur si un client partageant la même adresse que lui a déjà le même nom et prénom.
Voici tout d'abord le formulaire qui renvoie les informations :
<form method="post" action="ciblezone.php"> <br /> <h5>- Les champs marqués d'un <span class=\"ast\">*</span> sont obligatoires.<br /> - L'identifiant doit être compris entre 3 et 20 caractères. <br/> - Le mot de passe entre 5 et 20 caractères. <br/> - Le nom et le prénom doivent être compris entre 2 et 20 caractères.<br/> - Si vous remplissez un des champs de l'adresse postale, il vous sera demandé de remplir les autres.<br /> </h5> <fieldset class="inscr"> <legend>Informations sur le site</legend> <span class="ast">*</span><label for="pseudo">Identifiant : </label> <input type="text" name="pseudo" id="pseudo" class="champ" value="<?php echo htmlspecialchars($_SESSION['pseudo']) ?>" required /> <br /><br /> <span class="ast">*</span><label for="psw">Mot de passe : </label> <input type="password" name="psw" id="psw" class="champ" required value ="<?php echo htmlspecialchars($_SESSION['psw']) ?>" /> <br /><br /> <span class="ast">*</span><label for="repsw">Confirmez votre mot de passe : </label> <input type="password" name="repsw" id="repsw" class="champ" value="<?php echo htmlspecialchars($_SESSION['repsw']) ?>" required /> <br /> <br /> <span class="ast">*</span><label for="mail">Email : </label> <input type="email" name="mail" id="mail" class="champ" required value="<?php echo htmlspecialchars($_SESSION['mail']) ?>" /> <br /> </fieldset> <br /> <fieldset class="inscr"> <legend>Informations personnelles de l'utilisateur</legend> <span class="ast">*</span><label for="nom">Nom : </label> <input type="text" name="nom" id="nom" class="champ" value="<?php echo htmlspecialchars($_SESSION['nom']) ?>" required /> <br /><br /> <span class="ast">*</span><label for="prenom">Prénom : </label> <input type="text" name="prenom" id="prenom" class="champ" value="<?php echo htmlspecialchars($_SESSION['prenom']) ?>" required /> <br /><br /> <label for="tel">Numéro de téléphone : </label> <input type="text" name="tel" id="tel" class="champ" value="<?php echo htmlspecialchars($_SESSION['tel']) ?>" /> <br /> </fieldset> <br /> <br /> <div class="inscr"> <input type="submit" value="Mettre à jour" /> <input type="reset" value="Réinitialiser" /> </div> </form>
Voilà maintenant la connexion à la BDD et la définition des variables de post, de session, et de la fonction "anti-doublon".
<?php /*Connexion à BDD */ try { // On se connecte à MySQL $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:host=localhost;dbname=bdd_exiastore', 'root', '', $pdo_options); $bdd->exec('SET NAMES utf8'); } catch(Exception $e) { // En cas d'erreur, on affiche un message et on arrête tout die('Erreur : '.$e->getMessage()); } // Paramètres pour un pseudo unique $log = $_POST['pseudo']; $currentLog = $_SESSION['pseudo']; // Définition du pseudo courant, pour ne pas que ça affiche d'erreur si le login reste inchangé $sql = "SELECT * FROM clients WHERE clients.PseudoClient ='".$log."' AND clients.PseudoClient <> '".$currentLog."' "; $req = $bdd->query($sql); $req->setFetchMode(PDO::FETCH_OBJ); // Paramètres pour un mail unique $courriel = $_POST['mail']; $currentMail = $_SESSION['mail']; // Définition du mail courant, pour ne pas que ça affiche d'erreur si le mail reste inchangé $sqlDeux = "SELECT * FROM clients WHERE clients.EmailClient ='".$courriel."' AND clients.EmailClient <> '".$currentMail."' "; $reqDeux = $bdd->query($sqlDeux); $reqDeux->setFetchMode(PDO::FETCH_OBJ); // Nom $name = $_POST['nom']; $currentName = $_SESSION['nom']; // Prénom $prename = $_POST['prenom']; $currentPrename = $_SESSION['prenom']; // Vérification $checkAdd = $bdd->query("SELECT adresses.RueAdresse, adresses.CPAdresse, adresses.VilleAdresse, adresses.PaysAdresse, clients.NomClient, clients.PrenomClient FROM( (adresses INNER JOIN avoir ON avoir.ID_Adresse = adresses.ID_Adresse) INNER JOIN clients ON clients.ID_Client = avoir.ID_Client ) WHERE clients.NomClient ='".$name."' AND clients.NomClient <> '".$currentName."' AND clients.NomClient ='".$prename."' AND clients.NomClient <> '".$currentPrename."' "); $checkAdd->setFetchMode(PDO::FETCH_OBJ);
Le tout sera vérifié par cette condition :
else if($ligneAdd = $checkAdd->fetch() ) { echo "Un autre compte possède déjà les mêmes nom, prénom, et adresse. " ; header("Refresh: 3; URL= zone.php" ) ; }
Or, le code semble totalement ignorer ces conditions. Sauriez-vous où est le problème, s'il vous plait ?