PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/06/2012 18:48:08

Hello
Membre

[Résolu] MySQL vers PgSQL, trouver un équivalent de bindValue

Bonjour à tous,
Voilà je débute en PDO et PgSQL, il y a un début à tout.
Voici un code php exécutant une requête sql, mais qui utilise MySQL:

<?php
$query=$bdd->prepare('SELECT champ_x, champ_y FROM ma_table WHERE variable_x < :compteur');
$query->bindValue(':compteur',$compteur,PDO::PARAM_INT);
$query->execute();
?>

Voilà mon but, ce que je n'arrive pas à faire, c'est de trouver l'équivalent pour PgSQL du paramètre :compteur, et de pouvoir lui assigner la valeur stocké dans $compteur.
La documentation en ligne montre bien l'utilisation de paramètres avec PREPARE mais les exemples ne sont pas adaptés pour de la PDO (du moins pour mon niveau).
J'avais essayé ceci mais ça ne fonctionne pas (même pas de message d'erreur, une page blanche) sad :

<?php
$compteur=10;
$query=$bdd->prepare('SELECT champ_x, champ_y FROM ma_table WHERE variable_x < $compteur');
$query->execute();
?>

Merci pour vos réponses.

Dernière modification par Hello (16/06/2012 12:34:28)

Hors ligne

#2 15/06/2012 19:33:41

gleu
Administrateur

Re : [Résolu] MySQL vers PgSQL, trouver un équivalent de bindValue

Je ne comprends pas. PDO, c'est pas sensé être multi SGBD ? normalement, le même code devrait fonctionner. Avez-vous essayé le même code ?


Guillaume.

Hors ligne

#3 15/06/2012 20:31:08

Hello
Membre

Re : [Résolu] MySQL vers PgSQL, trouver un équivalent de bindValue

En effet c'est ce que je croyais en choisissant PDO, mais au fait chaque SGBD utilise un dialecte différent de SQL. Les requêtes ne sont pas tout à fait identique entre MySQL et PgSQL, par exemple pour les jointures PgSQL rajoute un "OUTER" entre LEFT et JOIN, en MySQL il y a juste LEFT JOIN... (ce n'est qu'un exemple).
Ceci dit la façon d'exécuter le PDO reste la même.
J'ai essayé de faire fonctionner le premier code avec une base de données PgSQL cela n'a pas fonctionné (il fonctionne parfaitement avec MySQL):
j'obtiens l'erreur:   Notice: Undefined variable: compteur in....
Alors "undefined" indique-t-il que PgSQL sait que :compteur est une variable, mais il ne voit nul part une définition qui lui serait associé?
Si je m'arrange pour qu'il n'y est plus cette erreur afin de savoir ce qu'il pense de bindvalue (je remplace :compteur par un nombre dans la première requête), j'obtiens ceci:
PDOStatement::bindValue() [pdostatement.bindvalue]: SQLSTATE[HY093]: Invalid parameter number: :compteur in....
Je ne vois toujours pas comment faire, vous voyez une solution?
@gleu: en tout cas merci pour la rapidité de la réponse.

Dernière modification par Hello (15/06/2012 20:33:54)

Hors ligne

#4 16/06/2012 01:04:37

gleu
Administrateur

Re : [Résolu] MySQL vers PgSQL, trouver un équivalent de bindValue

En effet c'est ce que je croyais en choisissant PDO, mais au fait chaque SGBD utilise un dialecte différent de SQL. Les requêtes ne sont pas tout à fait identique entre MySQL et PgSQL, par exemple pour les jointures PgSQL rajoute un "OUTER" entre LEFT et JOIN, en MySQL il y a juste LEFT JOIN... (ce n'est qu'un exemple).

PDO n'est aucunement coupable là-dedans. Ce sont les moteurs qui ne jouent pas le jeu du standard SQL. PostgreSQL est celui qui essaie de rester le plus proche du standard SQL. D'où des différences dans les requêtes avec un moteur comme MySQL.

Ceci dit la façon d'exécuter le PDO reste la même.

OK, c'est bien ce qu'il me semblait.

J'ai essayé de faire fonctionner le premier code avec une base de données PgSQL cela n'a pas fonctionné (il fonctionne parfaitement avec MySQL):
j'obtiens l'erreur:   Notice: Undefined variable: compteur in....
Alors "undefined" indique-t-il que PgSQL sait que :compteur est une variable, mais il ne voit nul part une définition qui lui serait associé?

PostgreSQL utilise la notation $ numéroté. Par exemple : "SELECT champ_x, champ_y FROM ma_table WHERE variable_x < $1".

Si je m'arrange pour qu'il n'y est plus cette erreur afin de savoir ce qu'il pense de bindvalue (je remplace :compteur par un nombre dans la première requête), j'obtiens ceci:
PDOStatement::bindValue() [pdostatement.bindvalue]: SQLSTATE[HY093]: Invalid parameter number: :compteur in....
Je ne vois toujours pas comment faire, vous voyez une solution?

J'essaierais le premier code (celui pour MySQL) mais en remplaçant :compteur par $1. Donc quelque-chose comme :

<?php
$query=$bdd->prepare('SELECT champ_x, champ_y FROM ma_table WHERE variable_x < $1');
$query->bindValue('$1',$compteur,PDO::PARAM_INT);
$query->execute();
?>

Absolument pas testé vu l'heure avancée smile et ma non-connaissance de PDO.
http://docs.postgresql.fr/9.1/sql-prepa … e-examples


Guillaume.

Hors ligne

#5 16/06/2012 12:14:41

Hello
Membre

Re : [Résolu] MySQL vers PgSQL, trouver un équivalent de bindValue

@Gleu: J'ai essayé le code que vous m'aviez proposé, en effet le :compteur n'est pas reconnu, mais le $1 oui, merci pour cette correction.
Pour contre le bindValue lui est toujours inconnu: Warning: PDOStatement::bindValue() [pdostatement.bindvalue]: SQLSTATE[HY093]: Invalid parameter number: :$1 in....
Cette erreur correspond à la ligne:

$query->bindValue('$1',$compteur,PDO::PARAM_INT);

La variable $compteur contient bien une donnée de type INT.
Je continue mes recherches... sad

Hors ligne

#6 16/06/2012 12:28:43

Hello
Membre

Re : [Résolu] MySQL vers PgSQL, trouver un équivalent de bindValue

Ok c'est bon j'ai trouvé à cette adresse.
En fait en PDO il y a 2 manières de faire ce que je voulais faire: on utilise des paramètres comme :compteur, ou alors on utilise des "?" dans la requête, leurs positions étant numéroté. Ce qui donne ceci:

<?php
$query=$bdd->prepare('SELECT champ_x, champ_y FROM ma_table WHERE variable_x < ?');
$query->bindValue(1,$compteur,PDO::PARAM_INT);
$query->execute();
?>

Voilà c'était tout simple et ça fonctionne très bien, maintenant je saurai.
Merci pour vos réponses.

Dernière modification par Hello (17/06/2012 02:30:04)

Hors ligne

Pied de page des forums