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

Requêtes MySQL Discussion :

J'ai de nouveau une requête qui ne marche pas


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    515
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 515
    Points : 131
    Points
    131
    Par défaut J'ai de nouveau une requête qui ne marche pas
    Voici mon code :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                $query="INSERT INTO Appels VALUES(NULL, NOW(), " . $Ut["Numero"] . ", " . $_SESSION["Val3"] . ", '" . $_SESSION["IP"] . "', 'RAS')";
                mysqli_query($conn,"LOCK TABLES Appels WRITE") or die(mysqli_error($conn));        //Astuces trouvées sur le NET
                mysqli_query($conn,"SET AUTOCOMMIT = 0") or die(mysqli_error($conn));              //pour être sûr de récupérer
                mysqli_query($conn,$query) or die(mysqli_error($conn));
                $result = mysqli_query($conn,"SELECT LAST_INSERT_ID()") or die(mysqli_error($conn));
                mysqli_query($conn,"COMMIT") or die(mysqli_error($conn));                          //le bon numéro...
                mysqli_query($conn,"UNLOCK TABLES") or die(mysqli_error($conn));                   //en bloquant un autre utilisateur
                $numero=mysqli_fetch_row($result); 
                mysqli_free_result($result);
               //Enregistrement de la nouvelle IP dans la table "Lieux"
                $query="UPDATE Lieux SET IP = '" . $_SESSION['IP'] . "', Appel = " . $numero[0] . " WHERE Numero = " . $_SESSION['Val3'] . " AND Utilisateur = ". $_SESSION['Val1'];
    var_dump($query);
                mysqli_query($conn,$query) or die(mysqli_error($conn));
                $number=mysqli_affected_rows($conn);
                var_dump($number);
    Et l'affichage obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string(84) "UPDATE Lieux SET IP = '192.168.1.51', Appel = 7 WHERE Numero = 2 AND Utilisateur = 1"
    int(1)
    J'ai bien vérifié les ";".

    Je vois avec phpMyAdmin que la table "Appels" répond normalement.
    Elle a pour premier item 'Numero' qui est auto_increment. Il faut donc être sûr qu'il n'y a pas un autre
    "auto_incrément" qui passe oar là par hasard. Ai-je bien compris l'astuce trouvée sur le net ?

    La fonction "affected_rows" me dit que 1 enregistrement de "Lieux" est affecté, ce que j'attendais.

    Et pourtant phpMyAdmin me montre que la table "Lieux" n'est pas mise à jour...

    Merci de m'aider encore une fois.

    AMIcalement.

  2. #2
    Nb
    Nb est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 148
    Points : 417
    Points
    417
    Par défaut
    Bonjour,
    Je pense que ton update n est pas commit.

  3. #3
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    515
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 515
    Points : 131
    Points
    131
    Par défaut
    Ah, ça doit bien être ça. Voila ce que c'est que de pomper des bouts de code qu'on ne comprend pas.

    J'ai ajouté une ligne après la lecture du numéro d'enregistrement auto_incrément, et ça marche.

    Merci !

    AMIcalement.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    Je vois avec phpMyAdmin que la table "Appels" répond normalement.
    Elle a pour premier item 'Numero' qui est auto_increment. Il faut donc être sûr qu'il n'y a pas un autre
    "auto_incrément" qui passe oar là par hasard. Ai-je bien compris l'astuce trouvée sur le net ?
    L'auto_increment est affecté pour un thread, il n'y a aucun risque de récupérer la valeur d'un autre thread par la fonction LAST_INSERT_ID() !



    Citation Envoyé par L'AMI Yves Voir le message
    J'ai ajouté une ligne après la lecture du numéro d'enregistrement auto_incrément, et ça marche.
    Il est essentiel de comprendre la notion de transaction, de commit et de rollback. Il ne faut pas coder au hasard en repompant des bouts de code sans comprendre ces fondamentaux !

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut à tous.

    Quelques remarques :

    a) il est préférable d'indiquer l'ordre des colonnes dans un INSERT, ce que vous ne faites pas.

    b) au lieu de mettre NULL dans votre INSERT, il est préférable d'indiquer dans la déclaration de la table pour cette colonne "default NULL".
    Et bien sûr de ne pas référencer cette colonne dans votre INSERT. Le NULL sera automatiquement affecté si aucune valeur n'est présente.

    c) il est préférable d'indiquer dans le fichier "my.ini" (ou my.cnt) le mode transactionnel que vous utiliser.
    Le "set autocommit=0" n'a pas lieu d'être dans votre script.

    d) une transaction commence par un "start transaction" et se termine soit par un "commit", soit par un "rollback". Où sont-ils ?

    e) on peut en effet récupérer la dernière valeur de votre identifiant "id".
    Il me semble que cela pourrait se résoudre par un déclencheur, ce qui éviterait de surcharger inutilement votre script.
    N'ayant pas plus d'information à ce sujet, je ne peux pas me prononcer sur la validité de ce que je viens de dire.

    f) pourquoi utilisez vous mysqli qui est ancien et non pas pdo ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. une requète qui ne passe pas
    Par JeanNoel53 dans le forum SQL
    Réponses: 0
    Dernier message: 14/12/2010, 10h47
  2. [MySQL] Une requête qui ne marche pas sur tous les enregistrements
    Par Marc22 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/04/2010, 13h20
  3. Requête qui ne marche pas sur une table Joomla.
    Par tintin72 dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/02/2010, 17h51
  4. Réponses: 8
    Dernier message: 26/01/2006, 14h47
  5. Une requête qui ne reconnait pas is not null
    Par LeBauw dans le forum Access
    Réponses: 2
    Dernier message: 08/09/2005, 12h29

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