IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Erreur mysql type 0, 0, 0, 0) avec requête JOIN <-> ON + AND + AND -> WHERE [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 93
    Points
    93
    Par défaut Erreur mysql type 0, 0, 0, 0) avec requête JOIN <-> ON + AND + AND -> WHERE
    Bonjour à toutes et à tous.

    Je doit importer des données via un fiichier CSV. Aucun problème de ce côté.

    Alors j'ai une table taclist qui contient:
    - VARCHAR tac un numéro
    - VARCHAR manufacturer une marque
    - VARCHAR model un modèle.
    - VARCHAR grade, heu... différente valeur qui servent à calculer un prix
    dsl je n'en dit pas plus sur ce que c'est, puisque c'est une entreprise un peu secrète, seule sur un marché.

    J'ai créé une table taclist_tmp ou j'insert toutes les lignes de mon CSV (entre 20 000 et 30 000 enregistrements)

    Donc ce que je veux c'est:
    insert les nouveaux tac
    update le grade si le grade est différent.
    Ha oui il le tac peut être le même pour différent marque/modèles (ce qui complique la chose. Et pour encore plus compliqué, la marque/modèle peut avoir plusieur tacs différents. En fait la différence se fait au niveau du grade. Donc aucun doublons.

    Pour le insert des new tacs, je compare les deux tables. c'est OK
    Pour le update idem, c'est OK.

    Mon problème est le suivant, je veux comparer les deux tables pour trouver si pour un même tac, il y a pas des marques/modèles dans taclist_tmp qui ne sont pas dans taclist.


    Voici ma requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT LPAD(taclist_tmp.tac, 8, 0) AS TAC, taclist_tmp.manufacturer AS MANUFACTURER, taclist_tmp.model AS MODEL, taclist_tmp.grade AS GRADE, taclist.tac AS "TAC from taclist"
    FROM taclist_tmp 
    LEFT JOIN taclist ON taclist.tac = LPAD( taclist_tmp.tac , 8 , 0 ) 
    AND taclist.model = taclist_tmp.model 
    AND taclist.manufacturer = taclist_tmp.manufacturer 
    WHERE taclist.tac IS NULL
    Donc voilà cette requête fonctionne niquel sur phpMyAdmin
    Mais hélas quand je l'exporte dans mon script PHP, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 0, 0, 0, 0)' at line 1
    erreur pas trop explicite, après recherche sur le net, je n'ai pas trouvé de réponse :s

    Quelqu'un aurait-il une idée pour me donner des pistes. Ou bien une requête faisant la même chose mais différente pour éviter de générer cette erreur.


    Merci par avance
    Gailup.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu es sur que c'est cette requete la qui provoque l'erreur ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 39
    Points : 47
    Points
    47
    Par défaut
    Fais voir comment tu fais ta requête en PHP ? Et affiche-la juste avant de l'exécuter, au passage

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Je vous mais tout le code de mon script. Il est long mais simplement le début vous intéresse (3e paragraphe) (juste pour voir mon fonctionnement).
    Donc oui car au début n'ayant pas pensé au tac déja connu mais marque/modèle différent j'avais mais une requete plus simple et tout fonctionnait parfaitement (différents test).
    Donc dans le code juste en dessous de //INSERT nouveaux tacs (vous pourrez voir également mon ancienne request qui marchait.

    Merci de vos réponses

    Ce que je comprend pas c'est qu'avec phpmyadmin ca fonctionne bien, je click sur créer source php puis copier coller dans mon script. Donc normalement il ne devrait pas avoir de prob!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
        function importTac() {
            //Affichage formulaire pour les import et export
            $out ="<table><tr><th>Import Tac list</th></tr>";
            $out.="<tr><td>";
            $out.="<form name='uploadTac' method='post' action='#' enctype='multipart/form-data'>
            File <input type='file' name='tacCSV'><input type='submit' value='upload'>
            </form>";
            $out.="</td></tr>";
            $out.="<tr><th>Export tac list</th></tr>";
            $out.="<tr><td><div class='validate'><a href='incs/tools/exportTac.php' >Export</a></div></td></tr>";
            $out.="</table>";
     
     
     
            //Si fichier spécifié dans le formulaire
            //Si fichier de type CSV
            if(file_exists($_FILES['tacCSV']['tmp_name']) && $_FILES['tacCSV']['type']=="text/comma-separated-values") {
              //Copie du CSV dans table temporaire : taclist_tmp et sauvegarde du fichier dans docs/imports/tacs
                //on vide la table dans un 1er tps
              mysql_query("TRUNCATE taclist_tmp")or die(mysql_error());
              move_uploaded_file($_FILES['tacCSV']['tmp_name'], 'docs/imports/tacs/'.date('Ymd').'.csv');
              $sql="LOAD DATA LOCAL INFILE 'C:/wamp/www/REGENERSIS/docs/imports/tacs/".date('Ymd').".csv' INTO TABLE taclist_tmp FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' (`tac`,`manufacturer`,`model`,`grade`)";
              mysql_query($sql) or die(mysql_error());
                //Récupération nombre d'enregistrements
              $q=mysql_query("SELECT COUNT(*) FROM taclist_tmp") or die(mysql_error());
              $r=mysql_fetch_row($q);
              $nbLine=($r[0]-1);
     
     
              //INSERT des nouveaux tac
              /*echo $sql = 'SELECT LPAD(taclist_tmp.tac, 8, 0) AS TAC, taclist_tmp.manufacturer AS MANUFACTURER, taclist_tmp.model AS MODEL, taclist_tmp.grade AS GRADE, taclist.tac AS "TAC from taclist"'
              . ' FROM taclist_tmp'
              . ' LEFT JOIN taclist ON taclist.tac=LPAD(taclist_tmp.tac, 8, 0)'
              . ' WHERE taclist.tac IS NULL'
              . ' ORDER BY taclist_tmp.tac ASC';*/
              $sql = 'SELECT LPAD(taclist_tmp.tac, 8, 0) AS TAC, taclist_tmp.manufacturer AS MANUFACTURER, taclist_tmp.model AS MODEL, taclist_tmp.grade AS GRADE, taclist.tac AS "TAC from taclist"'
              . ' FROM taclist_tmp '
              . ' LEFT JOIN taclist ON taclist.tac = LPAD( taclist_tmp.tac , 8 , 0 ) '
              . ' AND taclist.model = taclist_tmp.model '
              . ' AND taclist.manufacturer = taclist_tmp.manufacturer '
              . ' WHERE taclist.tac IS NULL LIMIT 0, 1000 ';
              $q = mysql_query($sql) or die(mysql_error());
              $actions = "<br /><u>Work :</u><br />";
     
              //init des compteurs
              $newTac=0;
              $newManufacturer=0;
              $newModel=0;
              $updateGrade=0;
              while($tac = mysql_fetch_array($q)){
                $newTac++;
     
     
                  //Recherche si le manufacturer existe, sinon création du model
                $sqlManufact='SELECT COUNT(*)'
                . ' FROM manufacturers'
                . ' WHERE name=UPPER("'.$tac['MANUFACTURER'].'")';
                $qManufact=mysql_query($sqlManufact) or die(mysql_error());
                $manufacturer=mysql_fetch_row($qManufact);
                if($manufacturer[0]==0){
                  $newManufacturer++;
                  mysql_query('INSERT INTO manufacturers VALUES (NULL, UPPER("'.$tac['MANUFACTURER'].'"))') or die(mysql_error());
                  $actions.="<font color=blue>Add new manufacturer : <b>".$tac['MANUFACTURER']."</b></font><br />";
                }
     
                  //Recherche si le model du manufacturer existe, sinon création du model
                $sqlModel='SELECT COUNT(*)'
                . ' FROM models'
                . ' WHERE model=UPPER("'.$tac['MODEL'].'") AND manufacturer=UPPER("'.$tac['MANUFACTURER'].'")';
                $qModel=mysql_query($sqlModel) or die(mysql_error());
                $model=mysql_fetch_row($qModel);
                if($model[0]==0){
                  $newModel++;
                  $sqlManufactId='SELECT manufacturerId FROM manufacturers WHERE name=UPPER("'.$tac['MANUFACTURER'].'")';
                  $qManufactId=mysql_query($sqlManufactId);
                  $manufacturerId=mysql_fetch_row($qManufactId);
                  $sqlGradeId='SELECT gradeId FROM grades WHERE grade=UPPER("'.$tac['GRADE'].'")';
                  $qGradeId=mysql_query($sqlGradeId);
                  $gradeId=mysql_fetch_row($qGradeId);
                  mysql_query('INSERT INTO models VALUES(NULL, UPPER("'.$tac['MODEL'].'"), "'.$manufacturerId[0].'", UPPER("'.$tac['MANUFACTURER'].'"), 1, '.$gradeId[0].', 0, 0, 0, 0)') or die(mysql_error());
                  $actions.="<font color=green>Add new model <b>".$tac['MODEL']."</b> of manufacturer <b>".$tac['MANUFACTURER']."</b></font><br />";
                }
     
     
                  //Ajout du tac dans taclist et models2tac
                mysql_query('INSERT INTO taclist (tac, manufacturer, model, grade, displayName) VALUES("'.$tac['TAC'].'", "'.$tac['MANUFACTURER'].'", "'.$tac['MODEL'].'", "'.$tac['GRADE'].'", "'.$tac['MANUFACTURER'].' - '.$tac['MODEL'].' - '.$tac['TAC'].'")') or die(mysql_error());
                $qModelId=mysql_query('SELECT modelId FROM models WHERE manufacturer=UPPER("'.$tac['MANUFACTURER'].'") AND model=UPPER("'.$tac['MODEL'].'")');
                $modelId=mysql_fetch_row($qModelId);
                $qTacId=mysql_query('SELECT MAX(tacId) FROM taclist');
                $tacId=mysql_fetch_row($qTacId);
                mysql_query('INSERT INTO models2tac VALUES(NULL, '.$modelId[0].', '.($tacId[0]).')') or die(mysql_error());
                $actions.="Add new tac : <b>".$tac['TAC']."</b> -> modelId n°".$modelId[0].", tacId n°".$tacId[0]."<br />";
              }
     
     
              //UPDATE des grades si besoin
              $sql = 'SELECT  taclist.tac, taclist.manufacturer, taclist.model, taclist_tmp.grade'
              . ' FROM taclist_tmp'
              . ' JOIN taclist ON taclist.tac = LPAD( taclist_tmp.tac , 8 , 0 ) AND taclist.model = taclist_tmp.model AND taclist.manufacturer = taclist_tmp.manufacturer AND taclist.grade != taclist_tmp.grade ORDER BY `taclist_tmp` . `tac`';
              $q=mysql_query($sql);
              while($data=mysql_fetch_array($q)){
                $updateGrade++;
                $actions.="<font color=grey><i>update TAC n°<b>".$data['tac']."</b>, manufacturer <b>".$data['manufacturer']."</b>, model <b>".$data['model']."</b>, grade <b>".$data['grade']."</b></i></font><br />";
                $sqlUpdate='UPDATE taclist SET grade="'.$data['grade'].'" WHERE manufacturer="'.$data['manufacturer'].'" AND model="'.$data['model'].'" AND tac="'.$data['tac'].'"';
                mysql_query($sqlUpdate) or die(mysql_error());
              }
     
     
              //Affichage du travail effectué
              $out.= "<b>".$newTac." new tacs.</b><br />";
              $out.= "<b>".$newManufacturer." new manufacturers.</b><br />";
              $out.= "<b>".$newModel." new models.</b><br />";
              $out.= "<b>".$updateGrade." update grades.</b><br />";
              $out.= $actions;
     
            }
     
     
            return $out;
        }
    Gailup.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que ton SELECT te renvoit bien quelque chose ?

    Parce que je dirais que non, donc toute la suite dérape en particulier l'INSERT qui se retrouve avec des valeurs à 0 ... ce qui donne 0,0,0,0
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Ma requete sous phpmyadmin ca me retourne a peu près 300 enregistrements
    Gailup.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et dans php ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Et dans php ?
    Dans PHP l'erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 0, 0, 0, 0)' at line 1
    Gailup.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non dans php que renvoit le select ?
    L'erreur que tu indiques vient de l'insert pour moi.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Excusez moi de mon absences (d'autres pb plus urgent à résoudre).

    Donc tu voit au 3e paragraphe (//Insert nouveaux tac)
    Il y a une requête mis en commentaire. Quand j'utilise cette requpete tout fonctionne sans problème. C'est à dire j'ai bien mes insert, j'ai bien mes updates.

    Donc le problème vient bien de ma requête avec des AND dans mon ON. Mais sur phpMyAdmin cette requête fonctionne. Bizarre.


    Je vais essayer d'utiliser des sous-requêtes, pour voir s'il y a une possibilité d'utiliser une autre requête.
    Gailup.

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as quand meme des requetes qui se presentent beaucoupl plus comme l'erreur que tu as, que ton update.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mysql_query('INSERT INTO models VALUES(NULL, UPPER("'.$tac['MODEL'].'"), "'.$manufacturerId[0].'", UPPER("'.$tac['MANUFACTURER'].'"), 1, '.$gradeId[0].', 0, 0, 0, 0)') or die(mysql_error());
    si j'etais toi je ferrais des die("erreur requete ligne x") pour etre sur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 93
    Points
    93
    Par défaut
    Merci bien,

    en fait l'erreur vient du fichier CSV. Des données dont on va chercher son id, inconnu dans la db, donc forcément derrière ca merde.


    Merci à tous.
    Gailup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/01/2012, 21h56
  2. Problème avec requête JOIN
    Par joy74 dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/10/2010, 08h53
  3. Problème avec une erreur de type [DCC Erreur]
    Par colorid dans le forum Langage
    Réponses: 5
    Dernier message: 24/09/2007, 20h04
  4. Réponses: 2
    Dernier message: 16/01/2006, 11h38
  5. Réponses: 1
    Dernier message: 12/12/2005, 03h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo