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

SQL Oracle Discussion :

Champs AUTO_INCREMENT qui ne fonctionne pas (PHP)


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 80
    Points
    80
    Par défaut Champs AUTO_INCREMENT qui ne fonctionne pas (PHP)
    Bonjour,

    J'ai une table tout simple (fonctions_generiques) avec quelques champs, dont un champs IDFG en NUMBER de précision 5, qui est l'ID de chaque ligne en clé primaire de la table.
    Je voudrais en faire un auto increment comme sur MySQL.

    Après avoir faire quelques recherches j'ai donc utilisé une séquence et un trigger qui sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE SEQUENCE sequencefg
    START WITH 1
    INCREMENT BY 1;
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TRIGGER incrementfg
    BEFORE INSERT ON fonctions_generiques
    FOR EACH ROW
    BEGIN
        SELECT sequencefg.nextval INTO :NEW.idfg FROM dual;
    END;
    Et voici ma requête d'insertion (en PHP grâce à PDO) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $req = $bdd->prepare('INSERT INTO FONCTIONS_GENERIQUES VALUES(\'\', :code_fonction, :code_contrat, :code_generique, :quantite, :frequence,
                                     :datedeb, :datefin, :identifiant, :date_modif)');
     
                $req->execute(array('code_fonction' => $_POST['code_fonction'],
                                    'code_contrat' => $_POST['code_contrat'],
                                    'code_generique' => $_POST['code_generique'],
                                    'quantite' => $_POST['quantite'],
                                    'frequence' => $_POST['frequence'],
                                    'datedeb' => timestamp($_POST['datedeb']),
                                    'datefin' => timestamp($_POST['datefin']),
                                    'identifiant' => $_SESSION['user']['identifiant'],
                                    'date_modif' => time()
                                    )) or die(print_r($bdd->errorInfo()));
    Que je mette le champs idfg vide ('') ou sequencefg.nextval, j'ai cette erreur qui apparait :
    Array ( [0] => HY000 [1] => 1722 [2] => OCIStmtExecute: ORA-01722: Nombre non valide (ext\pdo_oci\oci_statement.c:146) ) 1
    Et si je ne mentionne rien devant :code_fonction en ignorant l'id, comme le montrent certains exemples, il m'affiche une erreur du même style : nombre de paramètres insuffisants (ou quelques comme comme ça).

    Sauriez-vous d'où peut venir ce problème ?

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Ca marche 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
    $req = $bdd->prepare('INSERT INTO FONCTIONS_GENERIQUES VALUES(:val, :code_fonction, :code_contrat, :code_generique, :quantite, :frequence,
                                     :datedeb, :datefin, :identifiant, :date_modif)');
     
                $req->execute(array
    (
    'val' => 0,
    'code_fonction' => $_POST['code_fonction'],
                                    'code_contrat' => $_POST['code_contrat'],
                                    'code_generique' => $_POST['code_generique'],
                                    'quantite' => $_POST['quantite'],
                                    'frequence' => $_POST['frequence'],
                                    'datedeb' => timestamp($_POST['datedeb']),
                                    'datefin' => timestamp($_POST['datefin']),
                                    'identifiant' => $_SESSION['user']['identifiant'],
                                    'date_modif' => time()
                                    )) OR die(print_r($bdd->errorInfo()));

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 80
    Points
    80
    Par défaut
    Non malheureusement toujours la même erreur je n'arrive vraiment pas à comprendre pourquoi ...

    Si jamais ça peut aider voici ma 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
    33
     
      CREATE TABLE "DOTNAV"."FONCTIONS_GENERIQUES" 
       (	"IDFG" NUMBER(5,0) NOT NULL ENABLE, 
    	"CODE_FONCTION" NUMBER(5,0), 
    	"CODE_CONTRAT" VARCHAR2(3 BYTE), 
    	"CODE_GENERIQUE" VARCHAR2(30 BYTE), 
    	"QUANTITE" NUMBER(9,0), 
    	"FREQUENCE" NUMBER(3,0), 
    	"DATEDEB" NUMBER(12,0), 
    	"DATEFIN" NUMBER(12,0), 
    	"IDENTIFIANT" VARCHAR2(20 BYTE), 
    	"DATE_MODIF" NUMBER(12,0), 
    	 CONSTRAINT "FONCTIONS_GENERIQUES_PK" PRIMARY KEY ("IDFG")
      USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "DOTNAV"  ENABLE
       ) SEGMENT CREATION IMMEDIATE 
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "DOTNAV" ;
     
     
      CREATE OR REPLACE TRIGGER "DOTNAV"."INCREMENTFG" 
    before insert on FONCTIONS_GENERIQUES
    for each row
    begin
        select SEQUENCEFG.nextval into :new.idfg from dual;
    end;
     
    /
    ALTER TRIGGER "DOTNAV"."INCREMENTFG" ENABLE;

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Il faut préciser les colonnes de l'insert et oublier celle où vous avez le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO "DOTNAV"."FONCTIONS_GENERIQUES"
    ("CODE_FONCTION", "CODE_CONTRAT", "CODE_GENERIQUE",
     "QUANTITE", "FREQUENCE", "DATEDEB", "DATEFIN",
     "IDENTIFIANT", "DATE_MODIF")
    VALUES (:code_fonction, :code_contrat, :code_generique,
            :quantite, :frequence, :datedeb, :datefin,
            :identifiant, :date_modif);
    Pour le problème du nombre invalide, vous avez déclaré vos trois dates en tant que nombre et non pas en tant que date.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 80
    Points
    80
    Par défaut
    En effet, J'avais oublié de préciser les noms des colonnes, mais l'erreur persiste.
    Sinon concernant les dates votre remarque est bonne, mais elles sont converties en timestamp (nombres de secondes), donc il me faut bien un number (int), celà fonctionne très bien sur d'autres tables.

    L'erreur a l'air de venir de la séquence ...
    Je m'explique : J'ai fait une petite requête pour essayer d'afficher la séquence, et voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req1 = $bdd->query('SELECT SEQUENCEFG.nextval AS number FROM FONCTIONS_GENERIQUES');
                $data = $req->fetch();
                echo "<script>alert('".$data['NUMBER']."');</script>";
    Javascript m'affiche une popup vide, il faudrait croire que la séquence ne retourne rien ...
    Pourtant dans SQL Developer dans ma séquence j'ai bien : LAST_NUMBER 8 (sûrement à force de faire des tests).

    C'est a s'en tirer les cheveux ...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    C'est peut-être à cause de la casse, si vous avez créé tous vos objets avec des doubles quotes, il faudrait faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TRIGGER "DOTNAV"."INCREMENTFG"
    BEFORE INSERT ON "DOTNAV"."FONCTIONS_GENERIQUES"
    FOR EACH ROW
    BEGIN
        SELECT sequencefg.NEXTVAL INTO :NEW."IDFG" FROM dual;
    END;
    Pour tester la séquence, il faut faire un SELECT depuis DUAL pour n'avoir qu'une seule ligne, si vous le faites sur une table elle va s'incrémenter autant qu'il y a de ligne dans la table.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 80
    Points
    80
    Par défaut
    J'arrive à afficher le nombre de la sequence avec la requête que tu m'as dite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SEQUENCEFG.nextval AS num FROM DUAL;
    Cependant toujours le même problème d'insertion : nombre invalide ...
    J'ai aussi essayé en supprimant le trigger, et en ajouter sequencefg.nextval à l'id, mais toujours la même erreur ... pourtant mon id est bien un number, la sequence aussi, alors où est ce fichu problème ?!

    J'ai tenté une insertion sous SQL Developer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO FONCTIONS_GENERIQUES("IDFG", "CODE_FONCTION") VALUES(sequencefg.nextval, 'OI3O3');
    (comme les autres champs peuvent être nul j'ai fait au plus cours)
    J'ai toujours l'erreur du nombre invalide. Or la requête du dessus me renvoit bien une valeur pour la séquence ...

    C'est vraiment un mystère !

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Mais code_fonction est aussi censé être un nombre d'après votre script.

    Recréez votre table !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 80
    Points
    80
    Par défaut
    Le problème venait bien du champs CODE_FONCTION (qui est en fait appelé depuis une autre table, et qui est en varchar2).

    Erreur d'étourderie, bien vu Waldar merci beaucoup !

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

Discussions similaires

  1. Editeur qui ne fonctionne pas -php eclipse
    Par dedalios dans le forum Eclipse PHP
    Réponses: 0
    Dernier message: 19/02/2009, 14h41
  2. [MySQL] Code PHP sur des UPDATE qui ne fonctionne pas
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/10/2007, 11h57
  3. Code php qui ne fonctionne pas
    Par bachir008 dans le forum Langage
    Réponses: 2
    Dernier message: 19/09/2007, 10h17
  4. [PHP-JS] header() qui ne fonctionne pas
    Par Panther dans le forum Langage
    Réponses: 17
    Dernier message: 18/04/2007, 07h42
  5. Réponses: 4
    Dernier message: 08/02/2007, 20h01

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