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 :

Requête valide pour MySQL & PostgreSQL


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut Requête valide pour MySQL & PostgreSQL
    Bonjour,

    j'aimerais pouvoir réaliser des requêtes qui fonctionne autant pour Postgre que pour MySQL. Du coup j'utilise PDO pour uniformiser tout ça.

    Ma DB existante sur MySQL utilise des champs/table avec des majuscules (ex:ID_Maison,..) et du retour de la requête j'en retire un objet pré defini avec des set et get (getID_Maison(),...).

    Mais Postgre lui n'aime pas trop les majuscule et si l'on veut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM habitation WHERE ID_Maison = $id
    il faut mettre le champ ID_Maison entre "" sinon il y a erreur et il ne trouve pas le champ (Postgre transforme tout en minuscule sauf s'il y a des ""). Mais par contre, MySQL lui, n'aime pas trop les guillemets et s'il y en a, il considérera le champ comme une chaine de caractère..

    Les solutions proposées :
    - mettre des `` à la place des "" mais Postgre ne les acceptes pas.
    - renommer les champs,table,.. en minuscule => vu la taille de la DB je n'ose imaginer le bordel..
    - mettre des `` et quand on fait appelle à pdo parser la requête et remplacer les `` par des "" si on utilise Postgre...bof bof.

    N'y aurait-il pas un réglage/paramètre/astuce rédempteur à ce problème ?

    Si vous avez une solution, je suis de toute ouïe. Merci d'avance et bonne soirée/journée.

    Antoine.

  2. #2
    Membre expérimenté
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Par défaut
    Bonjour,

    Je ne sais pas à quel niveau tu travailles exactement (niveau du PHP ou niveau du SQL directement). Cependant, en supposant que tu te trouves au niveau PHP, tu pourrais essayer de te passer un paramètre à ton script qui serait justement le guillemet dont tu as besoin/pas besoin dépendant de quel SGBD tu utilises. En supposant que tu utilises le POST, tu pourrais avoir une variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $_POST['delimiteur'] = "\"" //pour postgre
    $_POST['delimiteur'] = "" //pour mysql
    et du coup, tu construis ta requête de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT " . $_POST['delimiteur'] . "CH_test" . $_POST['delimiteur'] . " FROM table test";
    Donc, quand tu es sur mysql, le délimiteur est à vide et tu as le champ non entouré et si tu tombes sur postgre le délimiteur sera un guillemet. C'est générique comme idée, mais j'espère que ça va pouvoir t'aider .

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    Bonjour osuwariboy,

    effectivement cela ce trouve au niveau PHP.

    Ton idée rejoint un peu celle que j'ai citée :
    - mettre des `` et quand on fait appelle à pdo parser la requête et remplacer les `` par des "" si on utilise Postgre...bof bof.
    Merci tout de même de ta solution.
    Je pense que j'espère un peu trop une solution miracle..(met tel paramètre à 1 et Postgre tiendra compte des majuscules sans devoir mettre des "",..)

  4. #4
    Membre expérimenté
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Par défaut
    Pas de problème, content de pouvoir être utile .

    Je ne sais pas si la fonction PDO::prepare est une fonction assez intelligente pour préparer correctement la requête dépendant du SGBD? Ça vaudrait peut-être le coup d'essayer . Ils en parlent ici:

    http://www.php.net/manual/fr/pdo.prepare.php

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 503
    Par défaut
    Votre souci est une mauvaise conception de votre base de données.
    Si vous voulez travailler avec deux base de données, vous deviez prendre en compte les spécifications de vos moteurs de base de données.

    Soit dit en passant , les standards SQL donne les mots clés en Majuscule (SELECT....FROM....WHERE) et le reste en minuscule.

    Maintenant, il est possible de forcer la majuscule dans PostgreSQL, mais cela n'est pas mis par défaut.

    Donc si vous voulez proposez votre projet à d'autres, ils seront obligé de prendre la même config que vous....ce qui représente un sérieux freins pour l'acceptation de votre projet.

    Il vaut peut-être mieux perdre une journée à re-modéliser votre Db afin de la rentre compatible pour les deux environnent.

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    je d'accord avec MaitrePylos. Maintenant, il semble impossible de tout redéfinir, du moins pour l'instant.

    Quand tu dis qu'il est possible de forcer la majuscule, tu parles des "" ou d'un paramètre à changer ?

    Pour le prepare de PDO, j'ai essayé, sans succès, merci quand même

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    MaitrePylos, saurais-tu répondre à ma question ?

    Quand tu dis qu'il est possible de forcer la majuscule, tu parles des "" ou d'un paramètre à changer ?

    Merci d'avance.

  8. #8
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 503
    Par défaut
    Alors pour PostgreSQL je me suis un peu avancé, pour MySQL il y a moyen de définir la statut .

    Maintenant si tu es sur Windows, cela ne devrais pas poser de soucis ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Par défaut
    Malheureusement je n'ai pas de problème de casse sous MySQL mais juste sur Postgres..

Discussions similaires

  1. requête différente entre mysql et postgresql
    Par DiverSIG dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/12/2009, 15h05
  2. Gestion des requêtes parametrées pour MySQL 5 sous VB6
    Par thomasarnelmadiso dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 25/01/2008, 11h55
  3. modifier une requête pour mysql 4.0.18
    Par lina01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/11/2006, 11h38
  4. EDBEngineError sur une requête pour MySQL
    Par Slyteck dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/08/2006, 14h17
  5. Parser une requête SQL pour MySQL
    Par gassla dans le forum SGBD
    Réponses: 3
    Dernier message: 02/08/2006, 15h36

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