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 :

Protéger l'accès à la base de données lors d'un update [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 27
    Par défaut Protéger l'accès à la base de données lors d'un update
    Bonjour,

    En php j'accède à l'attribut d'une table et je l'incrémente.

    en code c'est plus clair:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $auteur = mysql_query("SELECT * FROM matable  where id='$id' ");
    $auteur2 = mysql_fetch_array($auteur);
    $vu=$auteur2['hit'];
    $vu++;
    mysql_query("UPDATE matable  SET hit='$vu' where  id='$id' ");
    Ce code est exécuté quand un internaute ouvre une pageweb.
    Cette page web est visité par des centaines d'internaute au même temps.

    Le problème c'est que parfois la valeur de mon attribut hit se met à 0, vu le nombre élevé de personne qui essaye de l'incrémenter au même temps.

    Auriez-vous une méthode en php pour protéger l'attribut en modification lorsque ce dernier est entrain d'être incrémenté par un internaute.

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Pourquoi ne pas le faire en une seule requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = "UPDATE matable
    SET hit = hit + 1
    WHERE id = $id"
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 27
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Pourquoi ne pas le faire en une seule requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = "UPDATE matable
    SET hit = hit + 1
    WHERE id = $id"
    Oui c'est une bonne idée.
    Je pense que comme ça y aura moins de problème.
    Mais avec cette méthode est ce que y'aura plus de problème? je pense que si comme même...

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Même si il y a plusieurs requêtes identiques qui arrivent les unes après les autres, elles s'exécuteront... l'une après l'autre ! Donc la requête fonctionnera toujours.

    Le problème dans ta solution c'est que tu utilisais deux requêtes donc le hit récupéré par la première pouvait être incrémenté par une autre requête avant que la seconde requête s'exécute. Ainsi la seconde requête affectait la même valeur que celle déjà existante.

    Par contre, pourquoi ça repassait à zéro ? Mystère !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 27
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Par contre, pourquoi ça repassait à zéro ? Mystère !
    Oui c'est bizarre!
    je vais adopter ta méthode, et j'espère que ça va régler le problème.
    Merci pour ton aide.

    Je vais mettre le post a résolu.

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

Discussions similaires

  1. [C#] Accés à une base de données AS400
    Par Green Hornet dans le forum Accès aux données
    Réponses: 8
    Dernier message: 14/11/2011, 11h26
  2. Accès à la base de donnée lors d'hébergement
    Par fishingman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/05/2010, 23h45
  3. Réponses: 4
    Dernier message: 29/01/2009, 09h21
  4. Réponses: 6
    Dernier message: 29/03/2008, 15h36
  5. [TestStand] Erreur lors d'un accès à une Base de données
    Par capblans dans le forum Autres langages
    Réponses: 1
    Dernier message: 20/07/2005, 10h29

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