PostGreSQL/MySQL.... Problème de Majuscule

Eléphanteau du PHP | 14 Messages

09 févr. 2006, 04:01

Bonjour ,


J'ai un problème des plus étonnants , je souhaite mettre en place une application qui bascule facilement d'une base de données à une autre (dans mon cas MySQL/PostGreSQL).

Pour cela j'utilise les méthodes quasi-jumelles en php :

pg_query()/mysql_query()
pg_connect()/mysql_connect()
etc...

Bref , tout fonctionne correctement (la connexion se fait bien dans les deux cas, il est possible de collecter des données dans les deux bases, etc..)

J'ai quand même un problème assez étrange avec la fonction fetch_assoc
(pour les deux types de base).

Le cas n'est pas forcément simple à expliquer , donc j'vais prendre un exemple :

J'ai une requète simple du genre : "Select count(NumDessin)as Nombre from dessin ;"

j'appel donc une méthode d'une autre classe comme ceci :

$sqlCount = $Truc->SelectSQL("Select count(NumDessin)as Nombre from dessin ;");


Voici la méthode SelectSQL($MaRequete)
function SelectSQL($ReqSelect)
    {
// On récupère le type de base dans une variable 
        $type = $this->TypeBase;
        if ($type == "MySQL") {
// La base utilisé est de type MySQL , on utilise les méthodes MySQL d'accés à la base : 
            $this->Query = $resultatNum = mysql_query($ReqSelect)or die('Erreur SQL !<br>
	 	 <p>&nbsp;</p>' . $ReqSelect . '<br>' . mysql_error()); 
            return $this->GetArrayAssoc($resultatNum, $ReqSelect); 
        } elseif ($type == "PgSQL") {
// La base utilisé est de type PostGreSQL , on utilise les méthodes PostGre d'accés à la base : 
            $this->Query = $resultatNum = pg_query($ReqSelect)or die('Erreur PostgreSQL !<br> <p>&nbsp;</p>' . $ReqSelect . '<br>' . pg_last_error());
            if (!$resultatNum) {
                echo pg_last_error($resultatNum);
            } 
            return $this->GetArrayAssoc($resultatNum, $ReqSelect);
        }
    } 
Comme vous pouvez le voir, j'appel une methode GetArrayAssoc()...
vous l'avez devinez , ça me permet de récupérer un tableau associatif.

Voila la méthode GetArrayAssoc() (celle qui pose problème à mon avis) :
function GetArrayAssoc($QueryPar, $RequetSel)
    {
// On récupère (encore) le type de base dans une variable 
        $type = $this->TypeBase;
        if ($this->countSQL($RequetSel) > 0) {
            if ($type == "MySQL") {
                while ($d = mysql_fetch_assoc($QueryPar)) {
                    $Tableau[] = $d;
                } 
            } elseif ($type == "PgSQL") {
                while ($d = pg_fetch_assoc($QueryPar)) {
                    $Tableau[] = $d;
                } 
            } 
        } else {
            $Tableau = false;
        } 
        var_dump($Tableau);
        return $Tableau;
    } 
Je ne vous détail pas la fonction countSQL (qui me permet simplement de compter le nombre d'enregistrement que renvoit la requete), à mon humble avis mon problème ne vient pas de la.

Voila ce que me renvoit le var_dump du tableau associatif :

MySQL :
array(1) { [0]=> array(1) { ["Nombre"]=> string(2) "14" } }


PgSQL :
array(1) { [0]=> array(1) { ["nombre"]=> string(2) "14" } }

Comme vous pouvez le remarquer , le tableau est quasiment le même à une seule exception , la majuscule dans le tableau.

Ce qui m'embète en fait, car une fois revenue dans ma page principal, je récupère la valeur de cette façon :
$sqlNum[0]['Nombre']

Est-ce que quelqu'un sait d'ou le problème peut venir ???
Je suppose que c'est la fonction pg_fetch_assoc() qui est plus capricieuse que sa cousine mysql_fetch_assoc()....
Mais je n'ai rien trouvé à ce sujet dans la documentation PHP.

Merci d'avance.

Mammouth du PHP | 1029 Messages

09 févr. 2006, 11:26

Ce n'est pas la fonction pg_fetch_assoc qui est en cause, puisqe pg_fetch_array et _object, donne la même chose.

Chez moi(je n'utilise que PostgreSQL), il passe toutes mes commandes en minuscule, tu as du d'ailleurs avoir le même problème a la création de tes tables, elles doivent être toutes en minuscules, je pense que Postgres le fait automatiquement, pq?.

tu devrais à chaque fois créer deux ligne de commande différentes.

Maintenant si tu trouve comment faire pour qu'il respecte les majuscules, poste ici, cela intéressera surement quelqu'un.

MaitrePylos
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 14 Messages

09 févr. 2006, 12:15

:shock:

Bonjour ,

Tout d'abord , merci pour la réponse .

En effet c'est PostGreSQL qui n'utilise pas de majuscule par défaut dans les requètes et convertis toutes les majuscules en minuscules lorsque rien n'est précisé (en tout sincérité je me demande pourkoi...)

Voila la seule solution que j'ai trouvé :

Doc PostGreSQL : Mettre un identifiant entre guillemets le rend sensible à la casse alors que les noms sans guillemets sont toujours convertis en minuscules.

J'ai donc reconvertis ma base MySQL en base PostGreSQL en faisant attention d'avoir la même casse et j'ai rajouté des guillements un peu partout.
Ce qui m'évite de devoir réecrire toutes mes requetes 2 fois, mes requètes restent les même quelques soit la base utilisée.

Seule contraintes de véritables réecriture (pas encore testé , mais à mon avis ça rique d'être le cas ) :

Interdiction d'utiliser des requètes de type : Select * from ...
C'est pas plus mal en fait... (code plus propre et rapidité d'accés je crois)

Merci encore pour votre aide !