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 :

Vérification des doublons = Warning ! [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Par défaut Vérification des doublons = Warning !
    Bonjour ,

    J'ai ce script qui doit me permettre de vérifier si j'ai des doublons dans un champ d'un table :

    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
    $MM_fl="MM_insert";
    if (isset($_POST[$MM_fl])) {
     
    mysql_connect("mysqlxxx", "centphzuone", "xxxxx"); 
    mysql_select_db($database_centphzuone, $centphzuone);
     
    // recuperation de la valeur du formulaire
     
    $offre = $_POST['offre']; 
     
    // on regarde si la valeur exite déjà 
     
    $sql = "SELECT * FROM shop_offres WHERE offre='".$offre."'";
    $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
     
     
    // on compte le nombre de résultats 
    $res = mysql_num_rows($req); 
     
    if($res!=0) // Le nom existe déjà, on affiche un message d'erreur 
    { 
    echo '<font color="red">Désolé, mais ce nombre est déjà enregistré.</font>'; 
    } 
    else 
    { 
    // insertion de l'offre dans la base 
    $query = "insert into shop_offres values ('$offre')"; 
    $result= mysql_query($query); 
     
    }
    mysql_close(); 
    }
    Mais j'obtiens cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /homez.520/centphzu/www/Templates/panier400.php on line 54
     
    Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /homez.520/centphzu/www/Templates/panier400.php on line 54
    Or dans ma page , la ligne 54 est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
    Merci d'avance pour vos conseils,

    HAbroc

    PS : je n'utilise pas de clé unique car je souhaite rajouter des conditions dans le Where

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 416
    Par défaut
    Il faut une connexion ouverte pour utiliser cette fonction.

    Sinon ton test est inutile puisque mysql_real_escape_string est disponible depuis php 4.3...

  3. #3
    Membre éclairé
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Par défaut
    En regardant de plus près , j'ai vu que la ligne 54 était inclue ici :

    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
    if (!function_exists("GetSQLValueString")) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
    {
      $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
     
      // ligne 54
     
    $theValue = function_exists("mysql_real_escape_string") ? 
    mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
     
      switch ($theType) {
        case "text":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;    
        case "long":
        case "int":
          $theValue = ($theValue != "") ? intval($theValue) : "NULL";
          break;
        case "double":
          $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
          break;
        case "date":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;
        case "defined":
          $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
          break;
      }
      return $theValue;
    }
    }
    alors j'ai modifié mon script comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = sprintf("SELECT * FROM shop_offres WHERE offre=%s",GetSQLValueString($offre, "text"));
    Mais j'ai la même erreur...

    Il faut une connexion ouverte pour utiliser cette fonction.
    Connexion ouverte : concrètement , il faut que je fasse quoi ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 416
    Par défaut
    Par exemple tu peux supprimer la ligne 31 (mysql_close()) qui ferme la connexion à la bdd.

  5. #5
    Membre éclairé
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Par défaut
    Je viens de tester...mais dans ce cas , le doublon n'est pas rejeté...

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 416
    Par défaut
    Bah plus de message d'erreur c'est déjà un pb de réglé.
    Pour débugguer fais afficher ta requête après l'avoir écrite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = sprintf("SELECT * FROM shop_offres WHERE offre=%s",GetSQLValueString($offre, "text"));
    echo $sql;
    Apparemment tu ne rentre jamais dans la condition $res!=0,
    En faisant des echo à différentes étapes tu devrais trouver ce qui cloche.

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Connexion ouverte : concrètement , il faut que je fasse quoi ?
    Faudrait revoir le déroulement (ou chronologie) de ton code, de chaque étape de chaque page, entre autre cette partie là.

    Si la connexion à MySQL se fait après l'appel à toute fonction de MySQL (comme mysql_real_escape_string), il est normal que ça coince.
    L'erreur vient de là.

    Donc faut faire en sorte d'ouvrir cette connexion à MySQL avant.

    Faudrait peut être prévoir une certaine structure commune à toutes tes pages qui ont très certainement besoin d'une connexion à la Bdd.
    Comme créer un fichier connexion_mysql.php qui sera inclus (include) au tout début de chaque page.
    Exemple : (accueil.php, contact.php, etc ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    include 'configurations_divers.php';
     
    include 'connexion_mysql.php';
     
    include 'mes_fonctions.php';
     
    // ... etc  suite du script etc ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT * FROM shop_offres WHERE offre='".$offre."'";
    Faut éviter de faire ce genre de requêtes, surtout si c'est juste pour savoir si un élément existe ou pas.
    Là, on récupère l'intégralité des données de toute la table "shop_offres".
    S'il y a beaucoup de données, ou si on fait ça trop souvent, c'est des coups à mettre à genoux le serveur.
    MySQL à une fonction dédiée pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT COUNT(*) AS total_offre FROM shop_offres WHERE offre = '".$offre."'";
    La requête va obligatoire retourner un résultat (0 ou le nombre total comme valeur), et 1 seul ligne/valeur.
    Suffit de la récupérer avec un mysql_fetch_assoc(). (ici se sera -> total_offre)

    Comme cela on se garantie que la connexion est faite.
    Puis ça évite de faire du code répétitif


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sinon ton test est inutile puisque mysql_real_escape_string est disponible depuis php 4.3...
    Exacte.
    Php 4.3 ça date de l'antiquité (et encore, pas loin de la préhistoire).

    Même chose pour le code qui vérifie si le get_magic_quotes_gpc() est activé ou pas.
    Tous les hébergeurs permettent de le désactiver, quand bien même que par défaut il le soit.
    Tout codeur, même débutant doit savoir que cette directive doit être désactivé, sinon c'est pleins de problèmes qui s'enchainent.

    Bref. Ce genre de code c'est plutôt de la pollution qu'autre chose, la plus part du temps inutile.

    M'enfin, je dis ça comme ça.

  8. #8
    Membre éclairé
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Par défaut
    Je sais que mon code n'est pas optimisé; mais c'est parce que en tant que débutant , je travaille avec dreamweaver.

    En tout cas, grace à vos remarques, j'y suis presque . Voilà ce que j'ai fait :

    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
    $MM_fl="MM_insert";
    if (isset($_POST[$MM_fl])) {
     
      $MM_dupKey="page400.php";
      if (isset($_SERVER['QUERY_STRING'])) {
        $MM_dupKey .= (strpos($MM_dupKey, '?')) ? "&" : "?";
        $MM_dupKey .= $_SERVER['QUERY_STRING'];
      }
      header(sprintf("Location: %s", $MM_dupKey));
     
    // recuperation des valeurs du formulaire 
     
    $offre = $_POST['offre']; 
     
    // on regarde si les valeurs exitent déjà 
     
    $sql = sprintf("SELECT * FROM shop_offres WHERE offre=%s",GetSQLValueString($offre, "text"));
     
      mysql_select_db($database_centphzuone, $centphzuone);
      $req=mysql_query($sql, $centphzuone) or die(mysql_error());
     
     
    // on compte le nombre de résultats 
    $res = mysql_num_rows($req); 
     
    if($res!=0) // Le nom existe déjà, on affiche un message d'erreur 
    { 
    $MM_dupKey="requser=";
     header ("Location: $MM_dupKey");
        exit;
    } 
    else 
    { 
    // insertion de l'offre dans la base 
    $currentPage = $_SERVER["PHP_SELF"];
     
    $editFormAction = $_SERVER['PHP_SELF'];
    if (isset($_SERVER['QUERY_STRING'])) {
      $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
    }
    $insertSQL = sprintf("INSERT INTO shop_offres ( client, article, offre, date) VALUES ( %s, %s, %s, %s)",
     
                           GetSQLValueString($_POST['client'], "text"),
                           GetSQLValueString($_POST['article'], "int"),
                           GetSQLValueString($_POST['offre'], "text"),
                           GetSQLValueString($_POST['date'], "text"));
     
      mysql_select_db($database_centphzuone, $centphzuone);
      $Result1 = mysql_query($insertSQL, $centphzuone) or die(mysql_error());
     
      $insertGoTo = "suppr_panier400.php";
      if (isset($_SERVER['QUERY_STRING'])) {
        $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
        $insertGoTo .= $_SERVER['QUERY_STRING'];
      }
      header(sprintf("Location: %s", $insertGoTo));
    }
     
    }
    et j'ai mis ceci dans le body pour faire apparaitre un message en cas de doublon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php if (isset($_GET['requser'])) {?>Cette valeur est déjà enregistrée dans notre base<?php } ?>
    Tout ceci me semblait pas trop mal mais j'arrive sur une page introuvable : HTTP404 .
    Ce que je voudrais , c'est me retrouver sur la même page mais avec l'affichage du message dans une DIV. ça dépasse visiblement mes maigres compétences...

  9. #9
    Membre éclairé
    Homme Profil pro
    directeur hypermarché
    Inscrit en
    Avril 2009
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : directeur hypermarché

    Informations forums :
    Inscription : Avril 2009
    Messages : 227
    Par défaut
    Bon ...J'ai réussi ( Non sans mal ) .

    Script dans le Head :

    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
    $MM_fl="MM_insert";
    if (isset($_POST[$MM_fl])) {
    $row_Recordset1000['id']=$_GET['id'];
      $MM_dupKey='panier400.php?id='.$row_Recordset1000['id'];
     
     
    // recuperation des valeurs du formulaire 
     
    $offre = $_POST['offre']; 
     
    // on regarde si les valeurs exitent déjà 
     
    $sql = sprintf("SELECT * FROM shop_offres WHERE offre=%s",GetSQLValueString($offre, "text"));
     
      mysql_select_db($database_centphzuone, $centphzuone);
      $req=mysql_query($sql, $centphzuone) or die(mysql_error());
     
     
    // on compte le nombre de résultats 
    $res = mysql_num_rows($req); 
     
    if($res!=0) // Le nom existe déjà, on affiche un message d'erreur 
    { 
    $MM_qs = "?";
        //append the username to the redirect page
        if (substr_count($MM_dupKey,"?") >=1) $MM_qs = "&";
        $MM_dupKey = $MM_dupKey . $MM_qs ."requser=".$offre;
        header ("Location: $MM_dupKey");
        exit;
    } 
    else 
    { 
    // insertion de l'offre dans la base 
    $currentPage = $_SERVER["PHP_SELF"];
     
    $editFormAction = $_SERVER['PHP_SELF'];
    if (isset($_SERVER['QUERY_STRING'])) {
      $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
    }
    $insertSQL = sprintf("INSERT INTO shop_offres ( client, article, offre, date) VALUES ( %s, %s, %s, %s)",
     
                           GetSQLValueString($_POST['client'], "text"),
                           GetSQLValueString($_POST['article'], "int"),
                           GetSQLValueString($_POST['offre'], "text"),
                           GetSQLValueString($_POST['date'], "text"));
     
      mysql_select_db($database_centphzuone, $centphzuone);
      $Result1 = mysql_query($insertSQL, $centphzuone) or die(mysql_error());
     
      $insertGoTo = "suppr_panier400.php";
      if (isset($_SERVER['QUERY_STRING'])) {
        $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
        $insertGoTo .= $_SERVER['QUERY_STRING'];
      }
      header(sprintf("Location: %s", $insertGoTo));
    }
     
    }
    et message dans le body :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php if (isset($_GET['requser'])) {?><img src="images/mini/att.png" border="0" align="absmiddle"/> Cette valeur est déjà enregistrée dans notre base. Veuillez en saisir une nouvelle.<?php } ?>

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

Discussions similaires

  1. [DTS] Import de données avec des doublons
    Par Hotchotte dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/03/2005, 14h19
  2. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27
  3. 1 Table, Des doublons, ne rertenir que certains d'entre eux
    Par Dragano dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/01/2005, 12h06
  4. Effacer des doublons
    Par ben53 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/07/2004, 17h56
  5. Réponses: 2
    Dernier message: 07/07/2004, 17h44

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