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 :

INSERT INTO qui ne fonctionne pas mais qui fonctionne [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut INSERT INTO qui ne fonctionne pas mais qui fonctionne
    Bonjour à tous, voilà, j'ai un bug formidable et comme tous les trucs qui vous pourrissent la vie, je suis sûr que ce sera résolu au premier coup d'œil extérieur.

    C'est un panier => on enregistre la commande dans la base de données (truc classique)

    D'abord on créé la commande, ensuite on insère autant de lignes dans la commande que de produits.

    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
     
    <?php
     
    //  Connexion à la base de données
    		include("../fr_connexion_bdd_online.php");
     
    		$etat=1;
    		$reqcde = 
    		"
    			INSERT INTO commandes
    			(
    				idclient, 
    				datecde, 
    				prixtotal,
    				etat		
    			)
    			VALUES 
    			(
    				'" . $_SESSION['idclient'] . "', 
    				'" . time() . "',
    				'" . $_SESSION['total_prix_panier'] . "',
    				'" . $etat . "'
    			)
    		";
    		echo $reqcde;
    		echo("<br>");
    		$envoie_reqcde=mysql_query($reqcde);
    		$commande_id = mysql_insert_id();
     
    		for ($i=0; $i < count($_SESSION['achats']); $i++)
    		{
    			$reqlignecde = 
    			"
    				INSERT INTO lignecde 
    				(
    					idcde,
    					refproduit,
    					qte,
    					prix,
    					lg,
    					diam,
    					couleur,
    					texte,
    					idecrin
    				)
    				VALUES 
    				(
    					'" . $commande_id . "',
    					'" . $_SESSION['achats'][$i]['id'] . "',
    					'" . $_SESSION['achats'][$i]['qte'] . "',
    					'" . $_SESSION['achats'][$i]['prix'] . "',
    					'" . $_SESSION['achats'][$i]['lg'] . "',
    					'" . $_SESSION['achats'][$i]['diam'] . "',
    					'" . $_SESSION['achats'][$i]['couleur'] . "',
    					'" . $_SESSION['achats'][$i]['texte'] . "',
    					'" . $_SESSION['achats'][$i]['ecrin'] . "'
    				)
    			";
     
    			$envoie_reqlignecde=mysql_query($reqlignecde);
    			echo ("ligne ");
    			echo $i;
    			echo (" : ");
    			echo $reqlignecde;
    			echo("<br>");
    		}
    ?>
    Voilà, ce qu'il faut savoir, c'est que mes echo affichent ceci :

    INSERT INTO commandes ( idclient, datecde, prixtotal, etat ) VALUES ( '15', '1260365086', '215', '1' )

    ligne 0 : INSERT INTO lignecde ( idcde, refproduit, qte, prix, lg, diam, couleur, texte, idecrin ) VALUES ( '', 's004cln', '1', '65', '17.4', '3', '', '', '' )

    ligne 1 : INSERT INTO lignecde ( idcde, refproduit, qte, prix, lg, diam, couleur, texte, idecrin ) VALUES ( '', 'p005vrs', '1', '150', '17.4', '4.5', 'rose', '', '2' )

    Je vais dans ma BDD et là RIEN !! NÉANT !!!

    Alors je me pose la question sur la justesse de ma requête et je vais sagement copier coller ces quelques lignes (en prenant soin de mettre l'identifiant de la commande manuellement)...

    MIRACLE : ça marche...

    Quelqu'un peut m'expliquer ?

  2. #2
    Membre expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Points : 3 115
    Points
    3 115
    Par défaut
    Commence par mettre des "or die(mysql_error())" après tes mysql_query pour voir si il y a un plantage ou pas.

    Ton premier INSERT doit pas bien se passer vu qu'après $commande_id a l'air vide.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2008
    Messages : 294
    Points : 333
    Points
    333
    Par défaut
    Tu as essayer de faire un copier coller sans rien toucher à ta requête?
    Je pense que le fait que ton idcde soit vide pose souci.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Effectivement ça coupe et ça me met le message d'erreur suivant :

    Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

    Alors que juste avant j'ai une requête qui fonctionne


    En fait pour idcde, si la 1ere requete réussi la fonction

    $commande_id = mysql_insert_id();

    va me retourner l'id de la commande donc en fait ce que j'ai fait pour tester les lignes suivantes, c'est simplement de renseigner l'idcde manuellement.

  5. #5
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Tu peux donner la déclaration de tes deux tables stp ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bien sûr (enfin je crois ^^)

    CREATE TABLE `commandes` (
    `idcde` int(11) NOT NULL auto_increment,
    `idclient` int(11) NOT NULL,
    `datecde` int(11) NOT NULL,
    `prixtotal` float NOT NULL,
    `etat` int(2) NOT NULL,
    PRIMARY KEY (`idcde`)
    )

    CREATE TABLE `lignecde` (
    `idligne` int(11) NOT NULL auto_increment,
    `idcde` int(11) NOT NULL,
    `refproduit` varchar(10) collate latin1_german2_ci NOT NULL,
    `qte` int(11) NOT NULL,
    `prix` float NOT NULL,
    `lg` float NOT NULL,
    `diam` float NOT NULL,
    `couleur` varchar(10) collate latin1_german2_ci NOT NULL,
    `texte` varchar(255) collate latin1_german2_ci NOT NULL,
    `idecrin` int(11) NOT NULL,
    PRIMARY KEY (`idligne`)
    )

    C'est généré automatiquement par l'outil SQL que j'ai sur mon hébergeur.

  7. #7
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Déjà à cause des NOT NULL les insertion ne pourront se faire (INSERT avec des champs null <-> '' pour un int ....

    Reste l'index !

    Dans la table commandes l'insertion se fait ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Je comprends bien le truc avec les NOT NULL (bien que ce soit auto dans ma base de données, je dois pouvoir les virer)

    Par contre, quand je prends ma ligne

    INSERT INTO commandes ( idclient, datecde, prixtotal, etat ) VALUES ( '15', '1260366728', '215', '1' )

    (sortie avec echo) et que je la met dans la base de données, ça fonctionne, donc du coup, je pense pas forcément que les NOT NULL aient leur part de responsabilité.

    Enfin je me trompe peut-être mais si les NOT NULL posaient problème, l'insertion ne devrait pas se faire peu importe le moyen non ?

    EDIT : Oui quand je copie colle cette ligne dans la base ça marche

    Nombre d'enregistrements insérés : 1
    Identifiant de l'enregistrement inséré: 10 (traitement: 0.0000 sec.)
    requête SQL:
    INSERT INTO commandes( idclient, datecde, prixtotal, etat )
    VALUES (
    '15', '1260366728', '215', '1'
    )

  9. #9
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Au fait j'avais pas vu ton message d'erreur,

    Ton serveur tourne en ce moment ?

  10. #10
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Je parlais des NOT NULL pour les lignes de commandes et non de Commandes

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Sur la même base de données, je viens de créer un client à l'instant pour vérifier qu'elle tourne... ça fonctionne impeccable

    Je comprends pas ce message car il semble indiquer que le serveur ne tourne pas ou que je me suis planté dans mes identifiants.

    le problème c'est que toutes mes autres requêtes fonctionnent parfaitement (et y'en a pas peu...)

  12. #12
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    A tout hasard, ton fichier fr_connexion_bdd_online.php est correct ?

    Oui mets des "or die" un peu partout et evite de mettre trop d'instruction echo qui ralentissent ton code, vaut mieux tout mettre dans une variable dont tu fais l'echo ensuite

  13. #13
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Je crois avoir trouvé (enfin j'espére)

    Dans le manuel:
    mysql_insert_id() convertit le type de valeur retourné par la fonction C de MySQL C mysql_insert_id() en type PHP long (appelé int en PHP). Si votre colonne de type AUTO_INCREMENT est une colonne de type BIGINT, la valeur retournée par mysql_insert_id() sera incorrecte. À la place, utilisez la fonction interne MySQL LAST_INSERT_ID() dans une requête SQL.
    Ton int(11) n'est peut être pas bon,

    Malheureusement je travaille en Postgres et non Mysql alors je peux pas m'étendre là dessus mais à voir ....

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Oui Madfrix,

    comme je le disais auparavant, absolument TOUTES les autres requêtes de mon site fonctionnent (soit à peu près 50), et toutes sont faites après un appel à mon fichier fr_connexion_bdd_online.php

    Pour les echo, tu as raison, mais leur seul but ici est de voir avec mes yeux ou est-ce que ça plante... étant donné que le message d'erreur mysql ne me permet pas d'avancer

    Sinon j'ai mis des or die sur toutes mes instructions sql et elles passent toutes sans broncher

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bon...

    ça fonctionne, me demandez pas pourquoi j'en sais rien... j'ai fait refresh pour la 247463ème fois et c'est passé

    Je chercherais un jour quand je serai grand, la signification de tout ceci.

    Merci pour vos idées en tout cas.

    Bonne continuation.

  16. #16
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Le Père Noel est passé en avance

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/11/2011, 11h02
  2. Réponses: 4
    Dernier message: 05/04/2011, 11h42
  3. Réponses: 1
    Dernier message: 27/11/2010, 15h43
  4. fonction qui ne s'execute pas mais qui ne retourne pas d'erreur
    Par duplo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/06/2006, 21h43

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