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 :

Insérer des données avec identifiant autoincrémenté [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Insérer des données avec identifiant autoincrémenté
    Bonjour,

    Je lis le tuto "Le tutoriel pour grands débutants pressés" à ce chapitre : PHP Étape VI. Mail malgré le fait que le champ ID de ma table abonnement est en AUTOINCREMENT ( Structure Table_abonnement ), je n'arrive pas à y insérer les données automatiquement .Ça ne marche que si j'introduis manuellement les valeurs numériques dans la requête INSERT. Ce qui n'est guère pratique même pour un grand débutant ! Le message d'erreur que je reçois est tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Probleme de requête INSERT dans abonnement
    Incorrect integer value: '' for column 'id' at row 1
    Le problème vient donc de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $insert_rqst = 'INSERT INTO abonnement VALUES("", "'.$civilite.'", '.$nom.'","'	 .$prenom.'", "'.$age.'", "'.$adresse.'", "'.$ville.'", "'.$code.'", "'.$tel.'",  "'.$abo.'")';
    Voici le code intégral inspiré du tuto en question.

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
     <?php 
    include_once("fonctions.php");
    if(isset($_POST['valider']))
    {
    	// Connection à la base de données
    	do_connexion_for_root();
    	// Récupération des valeurs entrées par l'utilisateur: '
    	$civilite = mysql_real_escape_string(htmlspecialchars($_POST['civility']));
    	$nom = mysql_real_escape_string(htmlspecialchars($_POST['name']));
    	$prenom = mysql_real_escape_string(htmlspecialchars($_POST['firstname']));
    	$age = mysql_real_escape_string(htmlspecialchars($_POST['age']));
    	$adresse = mysql_real_escape_string(htmlspecialchars($_POST['adres']));
    	$ville = mysql_real_escape_string(htmlspecialchars($_POST['city']));
    	$code = mysql_real_escape_string(htmlspecialchars($_POST['postalcode']));
    	$tel = mysql_real_escape_string(htmlspecialchars($_POST['phonenumber']));
    	$abo = mysql_real_escape_string(htmlspecialchars($_POST['abonnements']));
    	// Gestion d'un nom de femme :
    	$dame = '';
    	if(($civilite=='Mme')||($civilite=='Mlle')){ $dame='e'; }
    	// Gestion du nom complet du magazine
    	$magazine = '';
        if ($abo == 'main'){ $magazine='J\'ai la main verte.'; }
        elseif ($abo == 'pied'){ $magazine='J\'ai le pied marin.'; }
        elseif ($abo == 'oeil'){ $magazine='J\'ai l\'oeil vif.'; }
        else{ $magazine = 'J\'ai la rate qui se dilate.'; }
     
    	echo 'Vous &Ecirc;TES : ' . $civilite . ' <br />' . $nom . ' '.  $prenom .
    	',ag&eacute '.$dame. '&nbsp;de ' .$age . ' ans <br /><br />' 
    	. '<strong>Votre adresse</strong> : ' .$adresse . '  '.$ville. ' '. $code .
    	'<strong><br />Votre t&eacute;l&eacute;phone : </strong>'.$tel.'<br/>VOUS AVEZ						  		CHOISI DE VOUS ABONNER &Agrave :'.'<h3>'. $magazine .'</h3>'. '<br />
    		Merci de vous &ecirc;tre abonn&eacute; '.$dame. '&agrave;  ce magazine ! <hr />';
    	do_connexion_for_root();
    	// Préparation de la commande sql d'insertion
    	$insert_rqst = 'INSERT INTO abonnement VALUES("", "'.$civilite.'", '.$nom.'","'	 .$prenom.'", "'.$age.'", "'.$adresse.'", "'.$ville.'", "'.$code.'", "'.$tel.'",  "'.$abo.'")';             
     
    	// Insertion proprement dite :
    	mysql_query($insert_rqst)or die('Probleme de requête INSERT dans abonnement <br />'
    									. mysql_error());
    	// Selection/Affichage des données entrées : 
    	$slct_rqst01 = mysql_query("SELECT * FROM abonnement ORDER BY id DESC")or die(							'Probleme de requête SELECT dans abonnement <br />'. mysql_error());
        // Selection/Affichage des données entrées : 
    	while($value_slct_rqst = mysql_fetch_array($slct_rqst01))
        {
    		echo $value_slct_rqst['civility']. ': ' . $value_slct_rqst['name']. 																	$value_slct_rqst['firstname'];
    	}
        // fermeture de la connection
    	mysql_close();
    }
    else
    {
    ?>
     
    <html >
    <head>
        ...
    </head> 
     
    <body>
       <h2>...
       <form name="abonnement" action="abonnement.php" method="post">
    	<label for="civility">Civilit&eacute;</label><br />
    	<input type="radio" id="civility" name="civility" value="Mr" />Monsieur<br />
    	<input type="radio" id="civility" name="civility" value="Mme" />Madame<br />
    	<input type="radio" id="civility" name="civility" value="Mlle" />Madmoiselle
    	<br /><br />
        <label for="name">Nom</label>
        <input type="text" id="name" name="name" />
        <label for="firstname">Pr&eacute;nom</label>
        <input type="text" id="firstname" name="firstname" />
        <label for="age">&Acirc;ge</label>
        <input type="text" id="age" name="age" />
        <fieldset>
    		<legend></legend>
    		<label for="adres">Adresse : </label>
       		<input type="text" id="adres" name="adres"  size="100" maxlength="100" />
    	    <label for="postalcode">Code Postal : </label>
       		<input type="text" id="postalcode" name="postalcode"  size="6" maxlength="6" />
       		<label for="city">Ville : </label>
       		<input type="text" id="city" name="city"  size="20" maxlength="20" /><br /><br />
       		<label for="phonenumber">T&eacute;l&eacute;phone:</label>
    		<input type="text" id="phonenumber" name="phonenumber" size="10" maxlength="10" />
    		<br />
    	</fieldset>
    	<label for="abonnements">Abonnement</label><br />
    	<input type="radio" id="abonnements" name="abonnements" value="main" />J&rsquo;ai la main verte.<br />
    	<input type="radio" id="abonnements" name="abonnements" value="pied" />J&rsquo;ai le pied marin.<br />
    	<input type="radio" id="abonnements" name="abonnements" value="oeil" />J&rsquo;ai l'oeil vif.<br />
    	<input type="radio" id="abonnements" name="abonnements" value="rate" />
    			J&rsquo;ai la rate qui se dilate.<br />
    	<br />
    	<input name="valider" type="submit" value="OK"><br />
       </form>
       <?php
       }
       ?>
    </body>
     
    </html>
    Je suis souvent confronté à ce problème. Est-ce dû à un problème de configuration de PHPMYADMIN ou MySQL? Je n'y crois pas personnellement mais vu que j'ai aucune explication ! Merci d'avance pour votre avis et votre coup de main pour m'éclairer sur cette question.

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    essaie ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $insert_rqst = 'INSERT INTO abonnement VALUES("'.$civilite.'", '.$nom.'","'	 .$prenom.'", "'.$age.'", "'.$adresse.'", "'.$ville.'", "'.$code.'", "'.$tel.'",  "'.$abo.'")';
    quand le champ ID est AUTOINCREMENT, c'est même pas la peine de l'indiquer dans votre requete SQL.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Difficulté d'inserer des données dans MySQL avec ID AUTOINCREMENT
    Merci pour votre réponse.

    J'ai modifié la requête INSERT comme vous le suggérez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $insert_rqst = 'INSERT INTO abonnement VALUES("'.$civilite.'",.$nom.'","'.$prenom.'", "'.$age.'", "'.$adresse.'", "'.$ville.'", "'.$code.'", "'.$tel.'", "'.$abo.'")';
    Mais ça ne résout pas le problème. Cette fois j'obtiens le message :

    Probleme de requête INSERT dans abonnement
    Column count doesn't match value count at row 1


    La structure de la table ne change pas.

    Je signale qu'auparavant j'avais utilisé cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $insert_rqst = "INSERT INTO abonnement (civility,name,firstname,age,adresse,city,postalcode,phonenumber,abonnements) VALUES($civilite, $nom, $prenom, $age,$adresse, $ville, $code, $tel,$abo)";
    Là j'obtenais comme mesage : 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 '(libelle du message)' at line 2

    Je ne vois cette erreur dans la requête.

  4. #4
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $
    insert_rqst = "INSERT INTO abonnement (id,civility,name,firstname,age,adresse,city,postalcode,phonenumber,abonnements) VALUES(0,$civilite, $nom, $prenom, $age,$adresse, $ville, $code, $tel,$abo)";
    Je viens de regarder dans la structure de la table, id est un entier (int(11)) il faut donc inserer un zero la ou il y a un autoincrément de type entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //table personne
    id INT AUTOINCREMENT
    Nom VARCHAR(30)
    // requette sql
    INSERT INTO personne VALUES(0,"Le nom");
    If you type Google into Google, you Can break the internet" - The IT Crowd

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    le probleme vient de la structure de la requete elle-meme dans le tuto (pardon Dendrite)
    car elle oblige a ecrire autant de valeurs qu'il y a de champs, et dans le bon ordre.

    Il vaut mieux ecrire (c'est plus facile a lire, et on n'est pas obligé d'ecrire tous les champs de la BD) :
    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
    <?php
    $insert_rqst = "INSERT INTO abonnement 
    (
    champ1,
    champ2,
    champ3 // (pas de virgule pour le dernier)	
    )
    VALUES
    ("
    ."'".$valeurchamps1."'," // (avec des ' pour les champs VAR, sans pour les champs NUMerique)
    ."'".$valeurchamps2."',"
    ."'".$valeurchamps3."'" // (pas de virgule pour le dernier)
    )";
    $insert_result = mysql_query($insert_rqst)  or die('Erreur SQL !<br />'.$insert_rqst.'<br />'.mysql_error());
    ?>
    Perso, j'ecris comme ca (quand j'ai peu de champs/valeurs a ajouter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $listechamps = "champ1,champ2,champ3";
    $listevaleurs = "'".$valeurchamps1."','".$valeurchamps2."','".$valeurchamps3."'";
     
    $insert_rqst = "INSERT INTO abonnement (".$listechamps.") VALUES(".$listevaleurs.")";
    $insert_result = mysql_query($insert_rqst)  or die('Erreur SQL !<br />'.$insert_rqst.'<br />'.mysql_error());?>
    ?>

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Points : 183
    Points
    183
    Par défaut
    En plus il y a un problème de " et de ' dans tes requêtes à chaque fois...
    Entre "civilté" et "nom"

  7. #7
    Invité
    Invité(e)
    Par défaut
    D'ou l'interet d'ecrire "proprement" le code...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Insérer des données avec identifiant autoincrémenté
    Merci pour vos précieuses indications.

    J'ai une dernière question pour buggen25.
    Je viens de regarder dans la structure de la table, id est un entier (int(11)) il faut donc inserer un zero la ou il y a un autoincrément de type entier.
    Ce zéro à insérer est-il une règle générale chaque fois qu'on utilise un ID en INT, TINYINT, BIGINT etc ou simplement avec INT? Bref j'aurais souhaité une petite explication sur cette particularité. C'était effective le problème. En gardant ce zéro tout se passe comme prévu.

    Pour les " et ' l'erreur était dans le POST. Dans mon script la requête INSERT est inspirée du tuto. Enfin merci pour les raccourcis de jreaux62 et pour la contribution de tout un chacun.


  9. #9
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Citation Envoyé par jrosenzw Voir le message
    Merci pour vos précieuses indications.
    J'ai une dernière question pour buggen25.
    Ce zéro à insérer est-il une règle générale chaque fois qu'on utilise un ID en INT, TINYINT, BIGINT etc ou simplement avec INT? Bref j'aurais souhaité une petite explication sur cette particularité. C'était effective le problème. En gardant ce zéro tout se passe comme prévu.
    Peut importe du moment ou c'est un entier qu'il soit tiny, Big ne pose pas de probleme particulier. l'essentiel est de mettre un zero pour obtenir la valeur courrante de l'autoincrément, si on veut assigner nous meme la valeur de l'autoincrément il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //table personne
    id INT AUTOINCREMENT
    Nom VARCHAR(30)
    // requette sql
    INSERT INTO personne VALUES(25,"Le nom"); // ou 25 est la valeur de l'autoincrément
    If you type Google into Google, you Can break the internet" - The IT Crowd

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

Discussions similaires

  1. [MySQL] insérer des données avec mysql_query
    Par tikigod dans le forum PHP & Base de données
    Réponses: 39
    Dernier message: 16/04/2013, 20h35
  2. Insérer des données avec une boucle while
    Par adnanedelphi dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 20/11/2011, 13h24
  3. Réponses: 3
    Dernier message: 08/06/2011, 10h36
  4. Réponses: 3
    Dernier message: 14/07/2009, 13h45

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