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 :

classe d'abstraction mysql/postgresql et insertion [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Inscrit en
    Février 2005
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 192
    Points : 198
    Points
    198
    Par défaut classe d'abstraction mysql/postgresql et insertion
    Bonjour,

    MySQL permet de faire des insertion avec la syntaxe de l'update, c'est à dire en utilisant le mot clef "SET" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO toto SET oeil_gauche=0, oeil_droit=0, nez="+", bouche="=";
    Et malheureusement Postgres ne le permet pas, il utilise le mot clef "VALUES" obligatoirement (à ma connaissance tout du moins ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO toto (oeil_gauche, oeil_droit, nez, bouche) VALUES (0, 0, "+", "=");
    J'essai de construire deux classes d'accès à une base de données, une pour MySQL et l'autre pour Postgres, toutes deux dérivées d'une classe contenant les informations de connexion à la base, ce qui permet de ne changer que l'appel du constructeur de l'objet relatif à la DB pour changer de SGBD.

    Ceci marche très très bien, mais je voudrais pouvoir utiliser la syntaxe MySQL, c'est à dire celle utilisant le mot clef "SET", pour les insertions, car avoir dans le code le nom du champ et sa valeur l'un à coté de l'autre simplifie la maintenance à mon goût (avec la syntaxe Postgres j'oublie une fois sur d'enlever ou rajouter soit le champ soit la valeur dans leurs parenthèses respectives).

    Ma question est donc simple (après ce long préambule ) : existe-t-il une fonction toute faite pour changer la syntaxe des requêtes d'insertion contenant le mot clef "SET" pour les rendre compatibles avec Postgres ?

    J'ai essayé d'en faire une, dans laquelle j'utilise la fonction split() pour découper la requête en vue de la reformer pour PG, mais je me heurte à un problème :
    comme je découpe la requête en me basant sur les virgules, si une donnée à insérer contient une virgule, le découpage n'est plus bon...

    Voici la fonction en question :
    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
     
    	function makeInsertQuery($query)
    	{
    	// $split[0] = 'INSERT INTO table_name'
    	// $split[1] = 'column=value, column=value...'
    		if(preg_match('(SET)', $query)) $split = split('SET', $query);
    		else $split = split('set', $query);
    	// $equalities[0] = column=value
    	// $equalities[1] = column=value ...
    		$equalities = split(',', $split[1]); // c'est ce split qui pose problème
    		foreach($equalities as $value)
    		{
    		// $peers[0] = column
    		// column[1] = value
    			$peers = split('=', $value);
    			if(!$columns) $columns = $peers[0];
    			else $columns .= ', '.$peers[0];
    			if(!$values) $values = $peers[1];
    			else $values .= ', '.$peers[1];
    		}
    		$query = $split[0].' ('.$columns.') VALUES ('.$values.')';
    		return $query;
    	}
    Si quelqu'un connait une fonction toute faite, ou alors une technique de sioux pour ne pas tenir compte de la virgule si elle est contenue entre des guillemets, ce serait merveilleux

    Cordialement,

    mathias

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Salut,

    à mon avis, la solution se trouve dans les RegExp, mais va falloir s'accrocher (tout ça pour faire des dessins de la tête de Toto ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?
    	$re = '( ([a-zA-Z0-9_]+)=(("[^"]*")|([0-9]+))[,;])';
    	$str = 'INSERT INTO toto SET oeil_gauche=110, oeil_droit=0, nez="+", bouche="=";';
    	$tab = array();
    	preg_match_all($re, $str, $tab);
    	print_r($tab);
    ?>
    J'ai testé plusieurs configurations et ça a l'air de plutôt bien fonctionner.
    $tab[1] te donne les clés et $tab[2] les valeurs. Le reste de ton problème est facile

  3. #3
    Membre habitué
    Inscrit en
    Février 2005
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 192
    Points : 198
    Points
    198
    Par défaut
    Merci beaucoup pour ton aide :-)

    Je vais enfin pouvoir faire de superbes dessins

    Je me doutais bien que la solution se trouvait du coté des regexp, mais mon expérience de ce coté est quasi nulle...

    Je vais tester ça de suie, merci encore Shini

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

Discussions similaires

  1. [MySQL -> PostGreSQL] Migration
    Par Nepomiachty Olivier dans le forum Administration
    Réponses: 9
    Dernier message: 23/04/2010, 17h33
  2. Réponses: 3
    Dernier message: 05/10/2006, 18h15
  3. Réponses: 3
    Dernier message: 02/12/2005, 16h58
  4. migration mysql > postgresql
    Par jacques trepp dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 25/03/2005, 11h05
  5. Timestamp et migration mysql postgresql
    Par romeo9423 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 05/02/2005, 11h11

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