Requête,pourquoi tu veux pas fonctionner

theNoob!
Invité n'ayant pas de compte PHPfrance

23 mai 2006, 19:03

Code : Tout sélectionner

$query= "DELETE FROM contenu_fac AS tab1 WHERE tab1.id_fac = ('SELECT tab2.num_fac FROM facture AS tab2 WHERE tab2.etat_fac = 'nonfacture' AND tab2.date_fac < ($aujourdhui - 604800)')";
Pourriez-vous m'aider,je désespère

Belinda92
Invité n'ayant pas de compte PHPfrance

23 mai 2006, 19:13

C 'est bizarre ça me semble correct pourtant...

Je vois vraiment pas,désolé !!!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 mai 2006, 22:52

Salut,

Tu aurait pu donner le message d'erreur qui te faire dire que celà ne fonctionne pas :wink:

Mais je dirais qu'il y a déjà une erreur au niveau des apostrophes encapsulant la sous requête.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

23 mai 2006, 22:55

Essaie en virant les apostrophes qui délimitent ta sous-requête...
$query= "DELETE
         FROM   contenu_fac AS tab1
         WHERE  tab1.id_fac = (SELECT tab2.num_fac
                               FROM   facture AS tab2
                               WHERE  tab2.etat_fac = 'nonfacture'
                                 AND  tab2.date_fac < ($aujourdhui - 604800))";

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 mai 2006, 09:58

En complément de ce qu'on dit mes collègue, je voudrais te rappeller que les sous-requetes pour MySQL ne sont gérées que depuis MySQL 4.1 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

theNoob!
Invité n'ayant pas de compte PHPfrance

24 mai 2006, 16:03

Sorry!
J'ai fait les modifs de albat, mais l'erreur existe encore...

Code : Tout sélectionner

Erreur de syntaxe près de 'WHERE tab1.id_fac = (SELECT tab2.num_fac ' à la ligne 3

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

24 mai 2006, 16:06

As-tu vérifié si ta sous-requête SELECT te retourne bien un enregistrement et un seul ?

Si cette requête retourne plusieurs enregistrements,
remplace : WHERE tab1.id_fac = (SELECT
par : WHERE tab1.id_fac IN (SELECT

theNoob!
Invité n'ayant pas de compte PHPfrance

28 mai 2006, 23:25

Bon ben je désepère, ça me fait toujours la même erreur:

Erreur de syntaxe près de 'WHERE tab1.id_fac IN (SELECT tab2.num_fac ' à la ligne 3

je redonne la requête, peut-être que quelqu'un pourra me dire d'où ça vient:

Code : Tout sélectionner

$query= "DELETE FROM contenu_fac AS tab1 WHERE tab1.id_fac IN (SELECT tab2.num_fac FROM facture AS tab2 WHERE tab2.etat_fac = 'nonfacture' AND tab2.date_fac < ($aujourdhui - 604800))";

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 mai 2006, 23:34

Le message d'erreur débute juste avant le WHERE il manque peut être un espace à cet endroit entre l'alias et WHERE.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 mai 2006, 23:35

:idea: TROUVÉ !

1. Il faut extraire les variables PHP des chaînes de caractères, c'est plus propre.

2. Si ta variable $aujourdhui a pour valeur 704800,
la requête qui va être générée contiendra la clause
AND  tab2.date_fac < (704800 - 604800)
au lieu de :
AND  tab2.date_fac < 100000
Ceci devrait mieux fonctionner...
$query= "DELETE
         FROM   contenu_fac AS tab1
         WHERE  tab1.id_fac IN (SELECT tab2.num_fac
                                FROM   facture AS tab2
                                WHERE  tab2.etat_fac = 'nonfacture'
                                  AND  tab2.date_fac < ".($aujourdhui - 604800).")";

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 mai 2006, 23:37

Y a quand même un truc qui me chiffonne... J'suis pas sûr à 300% de ma solution... :-k :ordi:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 mai 2006, 23:39

Et en virant les retours chariot ?
$query = "DELETE FROM contenu_fac AS tab1 WHERE tab1.id_fac IN (SELECT tab2.num_fac FROM facture AS tab2 WHERE tab2.etat_fac = 'nonfacture' AND tab2.date_fac < ".($aujourdhui - 604800).")";

theNoob!
Invité n'ayant pas de compte PHPfrance

28 mai 2006, 23:52

Nan désolé toujours rien :(

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

28 mai 2006, 23:52

Le problème vient certainement de l'alias, donc il faut retirer le "AS tab1" et "tab1."

De plus, il vaudrait mieux utiliser un DELETE multi-table en réécrivant la sous-requête sous la forme d'une jointure pour des raisons de performances.

theNoob!
Invité n'ayant pas de compte PHPfrance

28 mai 2006, 23:56

C'est bon ça marche !!! :D

J'ai simplement supprimé tab1 et AS tab1