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 :

Créer une variable avec plusieurs champs


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
    Avril 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut Créer une variable avec plusieurs champs
    Bonjour à tous,

    Voilà j'ai un formulaire tout bête avec différents champs.

    Je boss sur un site où la table est constituer de données membre dont un code client et un code fournisseur est présent :

    Le code client/fournisseur est formulé de la sorte :
    Exemple : 135016

    Le 1 correspond donc à Caviste/grossiste :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <label for="denomination">Dénomination:</label><select name="denomination" style="width:145px">
              <option value="1">Caviste/grossiste</option>
              <option value="3">Entreprise</option>
    <option value="5">Caves hôtels/restaurants</option>
    <option value="7">Particulier</option>
           </select><br /><br />

    Le 35 correspond au 2 premiers chiffre du code postal :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <label for="code_postal">Code Postal:</label><input type="text" name="code_postal" id="code_postal" /><br /><br />
    Et le reste à savoir 016 correspond à 3 chiffre générer aléatoirement (d'ailleurs mettre une securité pour verifier que le code n'existe pas déjà dans la bdd, si il existe alors en générer 1 nouveau automatiquement en prenant compte donc de la denomination + 2 premiers chiffre du cp),

    Ce que je veux faire, lors de l'insertion du nouveau membre, le code soit stoker dans un champs donc en recupeant la dénomination + les 2 preiers chiffre !

    Donc dans pour faire ma requête après je veux avoir une variable de cette forme :

    $code => dénomination + 2 premiers chiffre du code postal.

    Comment faire ?
    merci

    EDIT : J'ai essayé quelque chose de ce type :

    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
    cp = mysql_real_escape_string($_POST['cp']);
    $denomination = mysql_real_escape_string($_POST['denomination']);
    $nb_min = 100;
    $nb_max = 999;
     
    // Après je fais quelque chose de ce style ?
     
    $nombre = mt_rand($nb_min,$nb_max);
     
    $code_client = $denomination.$substr($cp,0,2).$nombre
     
    //Il faut que le code client n'ait jamais été utilisée
     
    $nombrecodeclient = mysql_result(mysql_query('SELECT COUNT(*) FROM arc_membres WHERE code_client = "'.$code_client.'"'), 0);
     
    if ($nombrecodeclient != 0)
    {
            $code_erreur1 = "Le code client est déjà utilisée par un de nos membre.";
            $i++;
    }
     
    //On balance le tout dans notre table
            mysql_query('
            INSERT INTO arc_membres (membre_email, code_client)
     
            VALUES ("'.$email.'" , "'.$code_client.'" ) ') or die(mysql_error());
    Il faut absolument que le code fasse 6 caractères (et UNIQUEMENT DES CHIFFRES) et ne soient pas utilisé actuellement dans la bdd

  2. #2
    Membre averti
    Inscrit en
    Avril 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut
    Re =)

    J'ai essayé comme cela :

    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
    $cp = mysql_real_escape_string($_POST['cp']);
    $denomination = mysql_real_escape_string($_POST['denomination']);
    $nb_min = 100;
    $nb_max = 999;
     
    // Après je fais quelque chose de ce style ?
     
    $nombre = mt_rand($nb_min,$nb_max);
     
    $code_client = $denomination.$substr($cp,0,2).$nombre
     
    //Il faut que le code client n'ait jamais été utilisée
     
    $nombrecodeclient = mysql_result(mysql_query('SELECT COUNT(*) FROM arc_membres WHERE code_client = "'.$code_client.'"'), 0);
     
    if ($nombrecodeclient != 0)
    {
            $code_erreur1 = "Le code client est déjà utilisée par un de nos membre.";
            $i++;
    }
     
    //On balance le tout dans notre table
            mysql_query('
            INSERT INTO arc_membres (membre_email, code_client)
     
            VALUES ("'.$email.'" , "'.$code_client.'" ) ') or die(mysql_error());
    Quel est mon erreur ?
    merci

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    je vois pas pourquoi tu génère une valeur aléatoire alors moi je ferais comme ca

    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
    $cp = 37;
    $denomination = 3;
    $nb_min = 100;
    $email = 'test@mondomaine.fr';
     
    $test_code_client = $denomination.$cp;
    $query = " SELECT code_client FROM arc_membres WHERE code_client LIKE '$test_code_client%' ORDER BY code_client DESC LIMIT 1";
     
    $log = mysql_connect('localhost', 'root', '');
    mysql_selectdb('test',$log );
    $result = mysql_query($query);
     
    if (!$result) {
        $message  = 'Requête invalide : ' . mysql_error() . "\n";
        $message .= 'Requête complète : ' . $query;
        die($message);
    }
    $total=mysql_num_rows($result);
     
    if($total==0){	
    	$code_client = $test_code_client.$nb_min;
    	mysql_query("INSERT INTO arc_membres   VALUES ('$email' , '$code_client' ) ") or die(mysql_error());
    	echo "création d'un ID pour le code de référence ".$test_code_client;	
    }else{
    	$code_client = mysql_result($result, 0);
    	$code_client = $code_client+1;
    	if (strlen($code_client)>6){		
    	echo "cota dépassé pour le code de référence ".$test_code_client;
     
    	}else{
    	mysql_query("INSERT INTO arc_membres   VALUES ('$email' , '$code_client' ) ") or die(mysql_error());
     
    	echo "ajout d'un ID pour le code de référence ".$test_code_client;
    	}	
    }

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    @ascito
    Tu pars avec un $nb_min = 100 alors que dans l'exemple il utilise 016.
    Ensuite, tu n'as aucune garantie de disponibilité sur la série $code_client +1, il se peut très bien qu'entre le moment où le script est exécuté et celui où l'insertion a lieu, il y ait une insertion qui utilise ton n° $code_client +1.
    Pour que cela fonctionne et vu qu'il n'y a pas possibilité de gérer des suites avec MySQL, ce travail d'insertion devrait être réalisé avec une procédure stockée.

    Ou, composer le $code_client avec à la fin une valeur provenant d'un champ autonum.
    Par exemple, sans procédure stockée :
    Tu insères l'enregistrement sans définir le code_client et tu rattaches un trigger après l'insertion qui complètera le code_client ainsi : groupe.cp.id(autonum généré)

  5. #5
    Membre averti
    Inscrit en
    Avril 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 52
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Bonsoir,

    @ascito
    Tu pars avec un $nb_min = 100 alors que dans l'exemple il utilise 016.
    Ensuite, tu n'as aucune garantie de disponibilité sur la série $code_client +1, il se peut très bien qu'entre le moment où le script est exécuté et celui où l'insertion a lieu, il y ait une insertion qui utilise ton n° $code_client +1.
    Pour que cela fonctionne et vu qu'il n'y a pas possibilité de gérer des suites avec MySQL, ce travail d'insertion devrait être réalisé avec une procédure stockée.

    Ou, composer le $code_client avec à la fin une valeur provenant d'un champ autonum.
    Par exemple, sans procédure stockée :
    Tu insères l'enregistrement sans définir le code_client et tu rattaches un trigger après l'insertion qui complètera le code_client ainsi : groupe.cp.id(autonum généré)
    Salut,

    Merci des informations ^^
    J'ai été aidé sur un autre forum, j'ai quasiment réussis le résultat voulu au niveau de la structure du code client :

    Voilà mon code :

    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
    cp_code_client = strtolower(substr($_POST['code_postal'], 0, 2));
     
     //On balance le tout dans notre table
           mysql_query("
    	INSERT INTO vinicom_clients (
    		code_client, 
    		email, 
    		password, 
    		raison_sociale, 
    		denomination, 
    		nom_responsable, 
    		activite, 
    		fax, 
    		tel, 
    		pays, 
    		code_postal, 
    		rue, 
    		ville
    	)
    	VALUES (
    		CONCAT('".$denomination.$cp_code_client."',LAST_INSERT_ID()), 
    		'".$email."' , 
    		'".$password."' , 
    		'".$raison_sociale."' , 
    		'".$denomination."' , 
    		'".$nom_responsable."' , 
    		'".$activite."' , 
    		'".$fax."' , 
    		'".$tel."' , 
    		'".$pays."' , 
    		'".$code_postal."', 
    		'".$rue."' , 
    		'".$ville."'
    	)
    	") or die(mysql_error());
    Mais LAST INSERT_ID retourne 0... ^^

    Exemple :

    Je récupère bien la dénomination (en faisant mon test j'ai choisis Particulier qui vaut ==> 7)
    En code postal j'ai mis 35260

    Au niveau du code client stoker j'ai dans la table :

    7350

    7 => OK
    35 => OK
    0 ??? (NUL !)

    MYSQL :


    Nom de l'index Type Unique Compressé Colonne Cardinalité Interclassement Null Commentaire
    PRIMARY BTREE Oui Non id 3 A

    id int(11) Non Aucune AUTO_INCREMEN

    Et Code client

    code_client int(11) Non Aucune

    Après viens email etc...

    Merci !!!

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    C'est normal que LAST_INSERT_ID() te renvoie 0 vu que l'enregistrement n'a pas encore été inséré. Pour avoir une valeur, il faut laisser le moteur insérer d'abord l'enregistrement -> regardes du côté des triggers

Discussions similaires

  1. Créer une expression avec un champ existant
    Par kissmytoe dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 16/06/2009, 23h59
  2. créer une fonction avec plusieurs paramètres
    Par SHERPAE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/01/2009, 17h41
  3. Pb Count dans une requete avec plusieurs champ retournés
    Par maxos75 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/06/2008, 14h01
  4. Créer une vue avec un champ Blob
    Par Taoueret dans le forum SQL
    Réponses: 4
    Dernier message: 16/05/2008, 16h18
  5. Impossible de créer une vue avec un champ spatial
    Par M Roncheau dans le forum SQL
    Réponses: 2
    Dernier message: 24/08/2007, 09h11

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