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 :

Accéder à une variable dans un tableau [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Par défaut Accéder à une variable dans un tableau
    Salut !

    Eh voila, mon tout premier post!

    Je débute en PHP et je suis confronté à un problème sur lequel je butte depuis quelques heures maintenant..

    Problématique:

    J'aimerais vérifier si une valeur que je souhaite envoyer en base est déjà présente dans un champ de ma table.
    Ce n'est peut-être pas très clair, mais vous devriez vite comprendre, grâce à ce petit bout de code ultra-simplifié illustrant mon problème.

    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
     
    // 1) Recupération des var de mon formulaire
    $vartest = $_POST['mavartest'];
     
    // 2) Creation de mon tableau de valeurs
    $query2 = "SELECT chp1 FROM table1";
    $result2 = mysql_query ($query2, $connexion);
     
    $list=array(); 
     
    if($result2){			 		    
    while($alist=mysql_fetch_object($result2)){
    	$list[]=$alist;}
    		}
    	else{
    	echo mysql_error();
    	}
     
    // 3) Verification de l'unicité de la valeur en base
    if (in_array ($vartest, $list)) {
        print "variable déjà présente en base !";
      }
     
    // 4) Valeur absente, donc je peux inserer ma variable dans ma table
    else{
    $query3 = "INSERT INTO table1 (id,chp1) VALUES (NULL,'$vartest')";
    $result3 = mysql_query ($query3, $connexion);
      echo "Nouvelle variable ajoutée: $vartest";
    }
    Le problème? En fait, ce code ne fonctionne tout simplement pas, puisque même si la valeur est présente dans mon tableau, j'insere une nouvelle valeur, identique à la première, dans ma table..

    Si quelqu'un pouvait m'aider, ca serait super sympa! Je vous remercie d'avance,

    Cordialement,

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    C'est parce que tu n'utilises pas la bonne fonction fetch : mysql_fetch_object construit un objet (type complexe) avec le résultat de la requête. Tu ne récupères pas simplement la valeur. Pour récupérer la valeur, utilise plutôt mysql_fetch_field, par exemple.

    Sinon, personnellement, je procèderais autrement : je ferais une requête select avec une clause WHERE. Ta méthode fonctionne mais le souci c'est qu'elle ramène toute la base en mémoire, ce qui n'est pas top. Avec un WHERE, pour peu que tu aies constuit un index sur ta colonne chp1, sera beaucoup plus léger et rapide. Genre, fais ceci :
    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
    // 1) Recupération des var de mon formulaire
    $vartest = $_POST['mavartest'];
     
    // 2) Creation de mon tableau de valeurs
    $query2 = printf("SELECT * FROM table1 WHERE chp1 = %s", mysql_real_escape_string($vartest));
    $result2 = mysql_query ($query2, $connexion);
     
    // 3) Verification de l'unicité de la valeur en base
    if(mysql_num_rows($result2) > 0){
        print "variable déjà présente en base !";
      }
     
    // 4) Valeur absente, donc je peux inserer ma variable dans ma table
    else{
    $query3 = "INSERT INTO table1 (id,chp1) VALUES (NULL,'$vartest')";
    $result3 = mysql_query ($query3, $connexion);
      echo "Nouvelle variable ajoutée: $vartest";
    }
    mysql_ free_ result($result2);

  3. #3
    Membre expérimenté
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Par défaut
    Bonjour a toi, alors peut etre pour toi un debut de réponse :

    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
     
     
    // 1) Recupération des var de mon formulaire
    $vartest = $_POST['mavartest'];
     
    // 2) Creation de mon tableau de valeurs
    $query2 = "SELECT chp1 FROM table1";
    $result2 = mysql_query ($query2, $connexion);
     
    $TABLEAU=mysql_fetch_array($result2) //cela va te créer un tableau avec tout tes résultats
     
    $cpt=0;
     
    foreach ($TABLEAU as $value) //va te permettre de parcourir tout le tableau $value va prendre a chaque boucle une nouvelle valeur
     {
     
       if($value==$vartest) //si la valeur est la meme
      { 
      $cpt=$cpt+1 //on augmente le compteur
      }
    }
     
    If($cpt=0) //si la valeur egal 0, donc elle n'éxiste pas dans la BDD
    {
    requete d'insertion
    }
    else
    {
    echo'la valeur existe déjà dans la bdd';
    }
    Bon il a peut etre des petites erreurs de code j'ai pas tester mon code mais voila un principe qui peut t'aider sans doute.

    Ps: J'arrive toujours après les autres

  4. #4
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 55
    Par défaut
    en plus simple

    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
    16
    17
    18
    19
     
    //Recupération des var de mon formulaire
    $vartest = $_POST['mavartest'];
     
    //requete qui vérifie si la valeur est deja présente
    $query2 = "SELECT chp1 FROM table1 where chp1"=$vartest;
    $result2 = mysql_query ($query2, $connexion);
     
    //récupération du nombre de résultats
    $nbRes=mysql_num_rows($result2);
     
    if($nbRes==0)
    {
    insérer la valeur
    }
    else
    {
    la valeur est deja insérée
    }

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Par défaut Tests non concluants.. :(
    Re bonsoir et tout d'abord, bien bon merci à tous les deux pour vos réponses!

    Malheureusement, je reviens à vous pour vous faire part de mes tests, qui ne furent pas très brillants !

    - Mac,

    je te remercie déjà pour tes explications sur l'utilisation des fonctions jointes à ton code, qui m'ont fait prendre conscience de la différence notable entre ce que je voulais faire et ce que je faisais vraiment!

    Cela dit, j'ai testé ta facon de faire, avec pour résultats des erreurs signalées sur les requête mysql_num_rows() et mysql_free_result() :

    Une erreur sur la requête? J'ai ajouté un die(..), et j'ai obtenu comme erreur, très explicite,

    " You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '34' at line 1 "

    Je pensais à une erreur de type entre les données envoyées à MySQL et celles retournées, mais je ne trouve pas... donc si tu as une idée n'hésite pas ca me ferait grand plaisir de comprendre, et ce serait même, pour tout te dire, un vrai soulagement!!

    - Alex,

    ton code proche de ce que je cherchais à faire au départ, et avec ces quelques p'tites erreurs de syntaxe, me pose le même problème que le mien: Le compteur n'est jamais nul, meme quand il devrait l'être et du coup toutes les valeurs envoyées, même celles déjà présentes, sont insérées!! Une idée en révision?

    Merci encore à tous les deux pour votre aide.. vraiment !
    Dès que ca marche, vous en serez les premiers informés.

    Bonne soirée Messieurs!

  6. #6
    Membre expérimenté
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2007
    Messages : 267
    Par défaut
    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
     
     
    // 1) Recupération des var de mon formulaire
    $vartest = "TEST"; //je rempli pour mes tests
     
    // 2) Creation de mon tableau de valeurs avec ma base de données
    $query2 = "SELECT nom FROM test";
    $result2 = mysql_query ($query2);
     
    $TABLEAU=mysql_fetch_array($result2); //cela va te créer un tableau avec tout tes résultats
     
    $cpt=0;
     
    foreach ($TABLEAU as $value) //va te permettre de parcourir tout le tableau $value va prendre a chaque boucle une nouvelle valeur
    {
     
    if($value==$vartest) //si la valeur est la meme
      {
      $cpt=$cpt+1;//on augmente le compteur
      }
    }
     
    If($cpt==0) //si la valeur egal 0, donc elle n'éxiste pas dans la BDD
    {
    $rq_ins="INSERT INTO test VALUES ('".$vartest."')";
    $rq_query = mysql_query ($rq_ins) or die (mysql_error());
    echo"Valeur insérée";
    }
    else
    {
    echo'la valeur existe déjà dans la bdd';
    }
    Et cela marche chez moi. Je présise que je ne teste qu'une colonne somme nous d'accord, et est ce que cela fonctionne pour toi ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Par défaut remerciements
    Effectivement, vos code à toi et à mayers fonctionnent parfaitement!
    Ils sont dans la lignée de ce que Mac m'avait conseillé de faire au départ, et j'étais en cours d'écriture justement..

    Ceci étant, j'aimerais comprendre notamment pour le code de Mac, en quoi la syntaxe de la requête sql est mauvaise. Si vous en avez une idée, n'hésitez pas!
    Désolé d'être insistant mais .. c'est que ma p'tite tête a envie de comprendre!

    Je vous remercie encore une fois tous les trois.

    Je passerais le message à son statut "résolu" en fin de soirée, quoiqu'il en soit, pour éviter de déranger les gens comme vous sur des bricoles d'esprit!

    Bonne soirée à tous,

    Cordialement,

  8. #8
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Citation Envoyé par niunia Voir le message
    Je pensais à une erreur de type entre les données envoyées à MySQL et celles retournées, mais je ne trouve pas... donc si tu as une idée n'hésite pas ca me ferait grand plaisir de comprendre, et ce serait même, pour tout te dire, un vrai soulagement!!
    Quel est le type de la colonne chp1 ? Je partais du principe que c'était une colonne de type "chaîne de caractères" (TEXT, VARCHAR, etc.). Si c'est le cas, il faut peut-être encadrer le %s par des ' :
    [CODE]$query2 = printf("SELECT * FROM table1 WHERE chp1 = '%s'", mysql_real_escape_string($vartest));[/QUOTE]

    Mais si c'est un nombre, il faut adapter :
    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
    // 1) Recupération des var de mon formulaire
    $vartest = $_POST['mavartest'];
     
    // 2) Creation de mon tableau de valeurs
    $query2 = printf("SELECT * FROM table1 WHERE chp1 = %d", $vartest);
    $result2 = mysql_query ($query2, $connexion);
     
    // 3) Verification de l'unicité de la valeur en base
    if(mysql_num_rows($result2) > 0){
        print "variable déjà présente en base !";
      }
     
    // 4) Valeur absente, donc je peux inserer ma variable dans ma table
    else{
    $query3 = "INSERT INTO table1 (id,chp1) VALUES (NULL,'$vartest')";
    $result3 = mysql_query ($query3, $connexion);
      echo "Nouvelle variable ajoutée: $vartest";
    }
    mysql_ free_ result($result2);

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 4
    Par défaut en guise de conclusion ..
    Oui voilà, c'est bien ca!

    J'ai décidé de consacrer quelques minutes de mon cours d'ADO tout à l'heure pour en apprendre un peu plus sur le fonctionnement des différentes fonctions mysql_fetch_*, et j'y vois nettement plus clair maintenant.

    Pour information pour mon champs "Chp1", il s'agissait bien d'un entier, d'où l'erreur.

    Encore merci Mac, & merci à vous tous,
    Je saurais sûr qui compter lorsque je bloquerai à l'avenir ..
    .. en continuant, tout de même et avant toute chose, à chercher à éclairer mes doutes grâce aux tutoriaux bien sûr !

    Le sujet est clos!

    Bonne soirée Mac,
    Bonne soirée à tous,

    & à bientôt!

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

Discussions similaires

  1. accéder à une variable dans un objet dans un tableau
    Par eprevot dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2013, 08h53
  2. Réponses: 2
    Dernier message: 15/02/2008, 21h45
  3. Réponses: 3
    Dernier message: 16/11/2007, 11h03
  4. Réponses: 13
    Dernier message: 01/09/2007, 20h49
  5. Réponses: 3
    Dernier message: 22/03/2007, 13h09

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