Problème avec requête postgresql/postgis

webdev593
Invité n'ayant pas de compte PHPfrance

13 févr. 2012, 16:23

Bonjour,

j'ai un problème lorsque j'essaye d'utiliser la méthode php_prepare().
Je vais devoir faire un grand nombre d'insertions dans ma table (quelques milliers). Pour cela je construit un tableau que je parcours ensuite pour faire les différentes insertions dans ma table à l'aide de la commande pg_prepare(). Sauf que lors de l’exécution du script j'ai des erreurs et aucun enregistrement n'est fait dans la table. Quelqu'un pourrait m'aider s'il vous plait?

Voici le warning:
( ! ) Warning: pg_execute() [function.pg-execute]: Query failed: ERREUR: parse error - invalid geometry HINT: You must specify a valid OGC WKT geometry type such as POINT, LINESTRING or POLYGON in C:\wamp\www\tests\test.php on line 162
Voici un bout de code de la construction de mon tableau:
for($i = 1; $i <= nbelemts; $i++) {

	...
		
		$geom = 'ST_GeometryFromText(\'POLYGON(('.$xmin.' '.$ymin.','.$xmax.' '.$ymin.','.$xmax.' '.$ymax.','.$xmin.' '.$ymax.','.$xmin.' '.$ymin.'))\',2154)';
		$geomp = pg_escape_string($geom);
		
		$tile = array(
		 'id' => $id,
		 'geom' => $geomp
		 
		);
		$data[$i] = $tile;
	}
}  
Et les requêtes d'insertion:
$requete = "insert into table(id_table, the_geom)
			values ($1,$2)";
			
 // prepare query
 $stmt = pg_prepare($dbh, "ps", $requete);
			
 // execute query
 foreach ($data as $key => $value) {
     $result = pg_execute($dbh, "ps", array($value["id"], $value["geom"]));
     if (!$result) {
         die("error in sql query (tile '$key'): " . pg_last_error());
     }
	 else {
		 echo "Opération réussie</p>";
	 }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 févr. 2012, 16:41

Salut,

pg_escape_string doit être utilisée sur les données et non sur une requête complète (ou assimilé) donc sur les xmin ymin etc

À tu testé une requête dans une console ? (en affichant les infos dans la page).

@+
Il en faut peu pour être heureux ......

ViPHP
xTG
ViPHP | 7331 Messages

13 févr. 2012, 16:42

Revois l'utilisation de la fonction polygon, ce sont des couples de valeurs et non une suite de valeurs : http://www.postgresql.org/docs/8.2/stat ... metry.html

webdev593
Invité n'ayant pas de compte PHPfrance

13 févr. 2012, 17:07

Salut,

pg_escape_string doit être utilisée sur les données et non sur une requête complète (ou assimilé) donc sur les xmin ymin etc

À tu testé une requête dans une console ? (en affichant les infos dans la page).

@+

Merci moogli pour ta réponse.
C'est entendu pour le pg_escape_string(), mais par contre le problème ne vins pas de là cra justement si j'ai rajouté cette ligne c'était pour fixer mon problème initial, mais ça n'a rien changé.
J'ai oublié ensuite de revenir en arrière.
Et sinon oui, j'ai testé la requête en mode console et ça marche, c'est ça qui est bizare! :/

webdev593
Invité n'ayant pas de compte PHPfrance

13 févr. 2012, 17:29

Revois l'utilisation de la fonction polygon, ce sont des couples de valeurs et non une suite de valeurs : http://www.postgresql.org/docs/8.2/stat ... metry.html
Merci pour ta réponse xTG, mais ton lien ne concerne pas les données en format WKT, ce qui est mon cas. Le format est bien le bon apparemment car sur console sql ça marche, c'est quand je le fais en php que ça ne marche plus.

ViPHP
xTG
ViPHP | 7331 Messages

13 févr. 2012, 23:21

Quand tu dis que tu as testé en console, tu as réécris la requête telle qu'elle devait être ?
Ou bien tu as fait un echo de la variable et copier/coller ?

webdev593
Invité n'ayant pas de compte PHPfrance

14 févr. 2012, 00:03

Quand tu dis que tu as testé en console, tu as réécris la requête telle qu'elle devait être ?
Ou bien tu as fait un echo de la variable et copier/coller ?
j'ai fait un echo de la requête, mais après forcément j'ai du remplacé les paramètres ($1,$2,..) par de vraies valeurs.

webdev593
Invité n'ayant pas de compte PHPfrance

14 févr. 2012, 00:14

le $2 je le remplace par le echo de $geomp

webdev593
Invité n'ayant pas de compte PHPfrance

14 févr. 2012, 17:14

j'ai résolu mon problème.
c'est le fait de stocker la requête préalablement dans une chaine qui posait problème.
J'ai réécrit la requête en remplaçant le $2 directement par le st_... concerné et maintenant ça marche.
Je n'ai pas moyen de mettre le sujet à "résolu" mais il est bel et bien résolu.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 févr. 2012, 19:34

Pour la culture perso :
Question à de balles à tu essayé de délimiter la chaîne de ta requête avec des ' plutôt que des " ?

Parce que la je sais pas trop si les $1 et $2 pose pas de soucis ?

Sinon à tu essayé pdo ? ;)

@+
Il en faut peu pour être heureux ......