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 :

Requete ADODB [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 138
    Par défaut Requete ADODB
    Salut a tous.

    J'ai un petit probleme avec l'execution d'une requete en PHP avec ADODB.
    En fait, j'ai mon code PHP qui me genere une requete SQL multiple, et qui l'execute en utilisant le parametre $inputarr.
    Voici le code, cela sera plus facilement comprehensible.

    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
     
    sql="";
    $vars=array();
     
    foreach($codes as $val)
    {
    	$vars[]=$val['code'];
    	$vars[]=$val['id'];
     
    	$sql.=" UPDATE partner SET code=? WHERE partnerid=?;";
    }
     
    if($sql!=="")
    {
    	$result=$this->db->gDB2->execute($sql, $vars);
    	if($result==false){echo "<br>".$sql."<br>".$this->db->gDB2->ErrorMsg($sql); return false;}
    }
    Voila.
    Le probleme que j'ai, c'est que ceci marche impecc sur mon serveur de developpement, qui tourne sous MS Windows 2000 SP4, Apache 2.0.52, PHP 4.4.4, alors que sur mon serveur de production, qui lui est sous MS Windows Server 2003 SBS SP2, Apache 2.2.6, PHP 5.2.5, cela ne marche pas.

    Quand j'execute la requete, j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?; UPDATE partner SET code=? WHERE partnerid=?;
    ERREUR: n'a pas pu insérer les commandes multiples dans une instruction préparée
    Error while updating all code mask
    J'ai tente d'executer la meme requete, mais dans le cas ou elle n'est repetee qu'une fois, et ca passe. Donc apparement, ce qui pose probleme, c'est l'execution d'une requete multiple.

    Petite precision, ces deux serveurs se connectent a la meme base de donnees (postgresql 8.2), donc le probleme ne vient pas de la BD...

    Alors est ce que ca vient de la configuration de mon serveur, des drivers ODBC, d'autre chose ??? J'en ai absolument aucune idee.
    Donc si quelqu'un a deja eu ce probleme, ou si vous avez une solution, ce serait cool de bien vouloir m'aider.

    Je vous remercie par avance pour vos reponses.

    jinpol

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Bonjour,

    Tu peux comparer la valeur de $db->_bindInputArray dans les 2 environnements, a priori il doit valoir 0 dans celui où ça passe et 1 dans l'autre.
    Il semble qu'elle soit mise à 0 pour php<5.1 et à 1 pour les versions ultérieures, ceci étant fait dans le constructeur de l'objet connexion.
    Cette variable signifie que le driver postgresql va utiliser un PREPARE suivi d'un EXECUTE.
    Or cette technique n'est pas compatible avec plusieurs instructions regroupées dans la même requête, qui est utilisée par ton code.

    Si c'est bien ça, tu peux sans doute forcer la variable à 0 dans ton propre code une fois la connexion établie. C'est une solution de dépannage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 138
    Par défaut
    Bonjour.

    Et tout d'abord merci pour la reponse.
    En plus, ca me parait etre une piste plus que serieuse, car en effet, j'ai bien 0 sur le serveur sur lequel ca marche, et 1 sur l'autre.

    Seul probleme, comment on fait pour modifier cette valeur ?
    J'ai cherche sur le net, je n'ai pas trouve de reponse et dans mon code, cette variable n'est pas presente en dure, donc impossible de la modifier.
    Si vous avez la reponse, merci bien de me la faire parvenir

    Encore merci.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Citation Envoyé par jinpol Voir le message
    Bonjour.

    Et tout d'abord merci pour la reponse.
    En plus, ca me parait etre une piste plus que serieuse, car en effet, j'ai bien 0 sur le serveur sur lequel ca marche, et 1 sur l'autre.

    Seul probleme, comment on fait pour modifier cette valeur ?
    Même si c'est une variable "interne" de la classe il est doit être possible de l'affecter directement (vu la nature assez arrangeante de php).
    Une fois la connexion obtenue dans l'objet $db, faire:
    $db->_bindInputArray=1;

    Ceci dit voici une autre piste qui est plus propre et peut-être plus rapide: avec postgresql il est possible de faire un update avec des valeurs multiples en une seule requête de ce style:
    UPDATE partners SET code = t.code FROM (VALUES
    (1, 'ab'), (2, 'cd'), (12,'autre')
    ) AS t(id, code)
    WHERE partners.partnerid = t.id;

    Cette requête passera avec postgres 8.2 minimum je crois, mais indifféremment avec ou sans prepare.

    - Daniel

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 138
    Par défaut
    Hello...et encore merci pour votre aide.

    En effet, j'ai pu affecter la valeur de _bindInputArray à 0, juste pour la page où j'ai besoin d'effectuer une telle requête, et ça marche très bien.

    Merci.
    jinpol...

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

Discussions similaires

  1. [SQL-Server] Erreur avec GetArray dans requete adoDB
    Par Vanessa48 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/09/2011, 22h14
  2. Problemes de requetes ADODB/PHP
    Par Vanessa48 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/06/2011, 14h11
  3. [ODBC] Probleme d'affichage requete ADODB
    Par Vanessa48 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 08/06/2011, 10h37
  4. [XL-2003] problème d'exécution d'une requete ADODB
    Par Bulbulle dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 10/07/2009, 15h36
  5. Comment executer une requete ADODB enVB.NET
    Par papy75 dans le forum Accès aux données
    Réponses: 3
    Dernier message: 29/04/2008, 11h16

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