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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Effet de bord... [Débutant(e)]


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 261
    Points : 125
    Points
    125
    Par défaut Effet de bord...
    30 éléves presque simultanément valident chacun un formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Form method="Post" action='traitement.php"
    input $note;
    Sur le serveur, on recupère $_POST[note] et on loge dans une base de données la note propre à l'éléve $_SESSION[nom_eleve]

    Tout cela fonctionne bien, mais certains dans certains cas auraient rencontré une note affectée à un autre élève.

    Question de débutant :
    La simultanéité peut-elle créer des effets de bord (je ne sais pas si vraiment c'est le terme) c'est à dire une mauvaise association entre la note et nom de l'élève ?

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Si tu gère bien ton truc non.

    Il faudrait voir un peu plus de ton code pour te dire...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 261
    Points : 125
    Points
    125
    Par défaut
    Essayons d'imaginer... le formulaire est envoyé.
    Sur le serveur est exécuté traitement.php
    $note = 20
    Je fais la connexion à la base de donnée pour enregistrement...
    Ah !!! le serveur est encombré - connexion difficile -
    Entre temps le serveur recoit un autre formulaire $note = 15
    Ca y est la conexion est ouverte... $note est enregistré dans la bas MySql... 15 ou 20 ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    fais nous voir un pe de code qui correspond a ton problème

  5. #5
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    logiquement le SGBD gère les problèmes de simultanéité, sinon quel serait l'interêt des SGBD

  6. #6
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    faudrait peut-être voir si ta version de sgbd supporte les transactions...

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Les insert ou update sont théoriquement atomiques.

    Il nous faut absolument ton code pour savoir si il y a un risque ou pas.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 261
    Points : 125
    Points
    125
    Par défaut
    Un script de formulaire ...extrait
    On expedie la variable Score sur le serveur et on attaque traitement.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var ResultForm = '<html><body><form name="Results" action="../../traitement.php" method="post" enctype="x-www-form-encoded">';
    ResultForm += '<input type="hidden" name="Exercise" value="TEST NAVIGATEUR"></input>';
    value="order:realname,Exercise,Score"></input>';
    ResultForm += '</form></body></html>';

    Traitement.php maintenant
    Connexion et recup varible session

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php session_start();
    require_once('../Connections/conn_intranet.php');
    $colname_rsActivite = "1";
    if (isset($_SESSION['Sess_ID_eleve'])) {
      $colname_rsActivite = (get_magic_quotes_gpc()) ? $_SESSION['Sess_ID_eleve'] : addslashes($_SESSION['Sess_ID_eleve']);
    }
    $colname2_rsActivite = "1";
    if (isset($_SESSION['Sess_ID_quiz'])) {
      $colname2_rsActivite = (get_magic_quotes_gpc()) ? $_SESSION['Sess_ID_quiz'] : addslashes($_SESSION['Sess_ID_quiz']);
    }
    Recup de la variabe score, mise sur 20 et affectation à la variable note


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ($_POST["Score"] == "") $score = "inconnu";
    	else { 
    	     $score = $_POST["Score"];
    		 $note = $score/5;
    		 }
    recherche d'une note deja present pour ce quiz ds la base et remplacement eventuel
    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
     
    if ($_SESSION['Sess_nom']<>'VISITEUR') {
     
    $quiz_ID=$_SESSION['Sess_ID_quiz'];	
    $eleve_ID=$_SESSION['Sess_ID_eleve'];
    $nom_classe=$_SESSION['Sess_classe'];
    $fait='O';
     
    mysql_select_db($database_conn_intranet, $conn_intranet);
    $query_rsActivite = sprintf("SELECT * FROM stock_activite WHERE eleve_ID = %s AND quiz_ID=%s", $colname_rsActivite,$colname2_rsActivite);
    $rsActivite = mysql_query($query_rsActivite, $conn_intranet) or die(mysql_error());
    $row_rsActivite = mysql_fetch_assoc($rsActivite);
    $totalRows_rsActivite = mysql_num_rows($rsActivite);
     
    if ($totalRows_rsActivite<>'0') 
    {
    $sql_delete = sprintf("DELETE FROM stock_activite WHERE eleve_ID = %s AND quiz_ID=%s", $colname_rsActivite,$colname2_rsActivite);
    mysql_query($sql_delete) or die('Erreur SQL !'.$sql_delete.mysql_error()); 
     
    }
     
    $sql = "INSERT INTO stock_activite VALUES('$ID_activite','$eleve_ID','$nom_classe','$quiz_ID','$note','$debut','$fin','$fait')"; 
     
    mysql_query($sql) or die('Erreur SQL !'.$sql.mysql_error()); 
    mysql_close();  
    }
    ?>
    et affichage note dans une popup ...
    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
    <HTML>
    <link href="../style_jaune.css" rel="stylesheet" type="text/css">
    <script language="JavaScript" type="text/JavaScript">
    <!--
    function MM_callJS(jsStr) { //v2.0
      return eval(jsStr)
    }
    //-->
    </script>
    <title>Enregistrement des notes</title><BODY >
    <p><img src="../patate.jpg" width="324" height="39" align="top"> </p>
    <p>
    <script type="text/javascript" language="javascript">
    <!-- Debut
    function lien(url) {
      var maitre; 
      if (opener.closed) {
        // si la fenêtre principale est fermée
        maitre=window.open("","nomprincipal","height=200,witdth=150,left=120,top=150","toolbar=no, location=yes,status=yes,menubar=no, scrollbars=no,resizable=yes,copyhistory=no");
        maitre.location.href = url;
      } else {
        // Si la fenêtre principale est ouverte
        opener.location.href = url;
     
      }
      // Ferme le pop-up automatiquement
      NewName=window.close();
    }
    // Fin -->
    </script>
      <?
    echo '<strong>'.$_SESSION['Sess_nom']." ".$_SESSION['Sess_prenom']." ".$_SESSION['Sess_classe'].'</strong><BR><BR> ';
    echo "Note : ".$note." /20  ";
     
    if ($_SESSION['Sess_nom']<>'VISITEUR')
    { echo "<BR>Note enregistrée."; 
    } ?> </body>
    </html>
    <?php
    if ($_SESSION['Sess_nom']<>'VISITEUR') {
    mysql_free_result($rsActivite);
    }
    ?>

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 261
    Points : 125
    Points
    125
    Par défaut
    En depouillant mon code pour le présenter, j'ai remarqué au debut de mon traitement php cette redondance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    require_once('../Connections/conn_intranet.php');
    session(start)
    require_once('../Connections/conn_intranet.php');
     
    ...
    Quel peut etre l'impact de ce type d'erreur ?

  10. #10
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    hmm a priori pas grand chose puisque tu utilises require_once mais bon moi je m'inquiéterais plutot du session_start entre les deux...

  11. #11
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    A priori aucun puisque ce sont des require_once
    Quand au session_start, cf la doc :
    Depuis PHP 4.3.3, l'appel à session_start alors que la session a déjà débuté, retournera une erreur de niveau E_NOTICE . Le second appel à la fonction sera tout simplement ignoré
    donc aucun impact

  12. #12
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    recherche d'une note deja present pour ce quiz ds la base et remplacement eventuel
    Qu'est ce que ca veut dire ?

  13. #13
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    SELECT * FROM stock_activite WHERE eleve_ID = %s AND quiz_ID=%s
    Ne faudrait-il pas écrire :
    SELECT * FROM stock_activite WHERE eleve_ID = '%s' AND quiz_ID='%s'
    ?

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 261
    Points : 125
    Points
    125
    Par défaut
    Si un enregistrement existe pour cet eleve et ce quiz, je modifie sa note sinon je crée un nouvel enregistrement

    Pouvez vous m'en dire plus sur cette erreur de quote...

    Cela pourrait-il avoir une incidence sur le choix d'un élève qui ne serait pas le bon et affectation de la note à ce dernier... ?

  15. #15
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il faut en effet te tourner vers les transactions.

    Mise à part ça, il y a l'instruction UPDATE pour pouvoir modifier une donnée dans ta table. Ce n'est pas la peine de supprimer puis de réinsérer pour faire une modification...
    EDIT : laisse tomber ce commentaire

  16. #16
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/07/2006, 00h40
  2. Effet de bord
    Par Clad3 dans le forum OpenGL
    Réponses: 11
    Dernier message: 04/10/2005, 15h38

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