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 :

problème de syntaxe [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut problème de syntaxe
    j'essaye de faire un mise a jour en sql avec un update en php.
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("UPDATE variable SET civilite='$vciv', nom='$nom', prenom='$prenom', daten='$daten'WHERE variable.ref_prod=(SELECT max(ref_prod) from variable)") or die (mysql_error());
    easyphp, me met cette erreur lorsque je transforme mes variables en valeur :

    MySQL a répondu:
    #1093 - You can't specify target table 'variable' for update in FROM clause

    Voici ma table variable :
    id_var est en auto_increment
    VARIABLE(id_var,ref_prod, civilite, nom, prenom, daten)

    Merci par avance.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par bonnet85 Voir le message
    MySQL a répondu:
    #1093 - You can't specify target table 'variable' for update in FROM clause
    Traduction : tu n'as pas le droit de faire une recherche sur la table que tu es en train de modifier. Donc, opération à réaliser en deux étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rq_sel = "SELECT max(ref_prod) from variable";
    mysql_query(rq_sel) or die ('erreur sur '.rq_sel.' : '.mysql_error());
    rq_update = "UPDATE variable SET civilite='$vciv', nom='$nom', prenom='$prenom', daten='$daten'WHERE variable.ref_prod=()";
    mysql_query(rq_update) or die ('erreur sur '.rq_update.' : '.mysql_error());
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "UPDATE variable SET civilite='$vciv', nom='$nom', prenom='$prenom', daten='$daten'WHERE variable.ref_prod=(SELECT max(ref_prod) from variable FOR UPDATE)"
    ne pourrait pas convenir ici ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Problème de syntaxe
    Ce que je veux faire avec cette requête c'est faire une mise à jour de ma table variable en séléctionnant le dernier id_var saisie. Je dois donc faire une requête UPDATE et dans le where un select pour sélectionner mon dernier id_var de ma table variable, je sais que c'est possible mais c'est un problème de syntaxe je pense.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 81
    Points
    81
    Par défaut
    Non comme l'a expliqué Celira (et mysql), vous ne pouvez pas faire un select sur une table que vous êtes en train de modifier car l'update lock la table et rend les accès dessus impossible.

    En ce qui concerne le mot clef 'FOR UPDATE', il sert juste à locker la table sur laquelle il travaille comme le ferait une requête 'UPDATE', mais pas de permettre au select d'accèder à une table locké.

    En bref, vous devez réaliser votre action en deux temps comme l'a expliqué Celira.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut problème de syntaxe
    Je n'avais pas compris de cette manière la. Mais concrêtement au niveau du code sa donne quoi parce que je ne vois pas comment l'écrire.
    Ce qu'a écrit Celira est peut etre juste mais je ne le comprend pas comment il ma requête update va retrouver le dernier identifiant de la requête select avec max(id_var). Merci

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 81
    Points
    81
    Par défaut
    En fait la colonne qui sert de clef primaire (et appelé généralement 'id') est en général un entier auto-incrémenté (vous l'aurez sans doute remarqué), ce qui permet de faire la requête SQL suivante :

    rq_sel = "SELECT max(ref_prod) from variable";
    La fonction SQL 'MAX()' sert à renvoyer parmis tous les enregistrements de la table la valeur la plus haute pour le champs indiqué.

    En d'autres termes "MAX(ref_prod)" renvoi la valeur "ref_prod" la plus haute parmis les enregistrements, et donc le dernier à avoir été ajouté.

    Edition :

    Oups. Je crains avoir répondu à côté
    Je n'ai pas fait attention que cette requête était la votre.
    En faite Celira a rapidement découpé votre requête pour l'exemple, mais en effet elle est incomplète, vous devez récuperer le résultat de la première requête et le passer dans votre clause WHERE comme vous l'avez fait pour les autres variables, où est le soucis ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 514
    Points : 631
    Points
    631
    Par défaut
    Bonsoir,
    quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
      $res = mysql_query('SELECT MAX(`ref_prod`) FROM `variable`');
      $last_id = mysql_result($res, 0);
     
      $res = mysql_query("UPDATE `variable` "
       ."SET `civilite` = '$vciv', `nom` = '$nom', `prenom` = '$prenom', `daten` = '$daten' "
       ."WHERE `ref_prod` = $last_id");
     
    ?>
    Cordialement,
    DaRiaN.

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    'fectivement, j'ai fait une réponse un peu rapide, sur le principe davantage que sur la requête exacte.
    Tu peux récupérer soit la valeur maximum de ref_prod et mettre à jour l'enregistrement qui y correspond à cette valeur(ce que te propose DaRiaN), soit récupérer l'id_var de l'enregistrement pour lequel ref_prod est maximum et mettre à jour l'enregistrement correspondant à cet id.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $res = mysql_query('SELECT `id_var` FROM `variable` WHERE ref_prod=MAX(`ref_prod`) ') or die (mysql_error());
      $last_id = mysql_result($res);
     
      $res = mysql_query("UPDATE `variable` "
       ."SET `civilite` = '$vciv', `nom` = '$nom', `prenom` = '$prenom', `daten` = '$daten' "
       ."WHERE `id_var` = $last_id");
    Les deux devraient fonctionner...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

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

Discussions similaires

  1. Problème de syntaxe - elements['x'].value
    Par Equus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/02/2005, 11h22
  2. [Interbase] Problème de syntaxe SQL
    Par navis84 dans le forum InterBase
    Réponses: 4
    Dernier message: 22/12/2004, 17h07
  3. Problème de syntaxe
    Par Mister_FX dans le forum ASP
    Réponses: 5
    Dernier message: 30/06/2004, 10h01
  4. Problème de syntaxe ADO ...
    Par bendev dans le forum ASP
    Réponses: 2
    Dernier message: 15/04/2004, 14h38
  5. Réponses: 2
    Dernier message: 08/03/2004, 15h10

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