Aller au contenu

Génération d'image Gif en PHP avec MySQL


Stabbquadd

Messages recommandés

Bonjour à tous :)

J'ai un problème sur un de mes scripts que voici :

<?

header ("Content-type: image/gif");

  $im = imagecreatefromgif ("../images/carteniv2.gif");

  $ter = ImageColorAllocate ($im, 150, 150, 150);

  imagefilledrectangle ($im, $abs, $ord, 70, 70, $ter);

  imageGif($im);

?>

Le script fonctionne parfaitement bien, et je récupère même les arguments $abs et $ord passés en paramètre dans l'URL d'appel du script, mais il m'est impossible d'établir une connexion à la base de donnée pour obtenir quelque chose dans ce genre :

<?

header ("Content-type: image/gif");

include("connect.php");

//données MySQL, vérification de $abs et $ord par exemple

  $im = imagecreatefromgif ("../images/carteniv2.gif");

  $ter = ImageColorAllocate ($im, 150, 150, 150);

  imagefilledrectangle ($im, $abs, $ord, 70, 70, $ter);

  imageGif($im);

mysql_close();

?>

Celà est très gênant puisque le but est de générer une carte dynamique du monde que le joueur explore en affichant par exemple sa position, les limites de son territoire, etc..., et tout ne peut être passé en paramètre par l'URL !!!

La connexion MySQL est interdite pendant la génération d'une image ?

Touchais-je ici déjà à une des limites de ce merveilleux language, ou suis-je simplement mal renseigné (aucune réponse sensée en cherchant "génération gif php MySQL" dans Google) !

Merci de votre attention et de vos éventuelles réponses :)

Lien vers le commentaire
Partager sur d’autres sites

As tu essayer de debugger ton programme toi meme ? Ce n'est pourtant pas bien compliqué : tu commentes ton header et tu affiches tes variables avec des echos pour voir si les bons parametres sont passés ! Enfin tu peux tester les valeurs de retour des fonctions pour savoir a quel moment a lieu le probleme.

Tu ne pourras qu'y etre gagnant a agir comme ca : c'est pénible d'etre bloqué 2 jours sur un probleme en attendant une reponse du forum. ;)

A vue de nez je vois deja que la fonction imageGif n'existe pas ... c'est imagegif [et oui] qu'il faut mettre.

Lien vers le commentaire
Partager sur d’autres sites

Débogguer moi-même, je veux bien, mais que veux-tu vérifier comme variable quand tu fais des opérations sur une chaîne de caractère immense et incompréhensible qu'est une image .gif ?

La connexion bdd et la récupération des variables marchent très bien, mais c'est la génération de l'image que ca bloque.

De plus la fonction imageGif fonctionne très bien puisque les serveurs tolèrent l'ajout de majuscules dans le nom d'une fonction.

ImageColorAllocate est la même chose que imagecolorallocate, mais je vois pas où est la bonne nouvelle :mad2:

Lien vers le commentaire
Partager sur d’autres sites

include("connect.php");

Y a quoi dans le fichier connect.php (n'oublie pas de mettre xxx a la place du code :mad2: ) ?

Sinon mieux vaux éviter le gif avec gd, il y a des serveurs qui le prennent en charge mais pas tous, mieux vaut le png :

<?
header ("Content-type: image/png");

include("connect.php");
//données MySQL, vérification de $abs et $ord par exemple

 $im = imagecreatefrompng ("../images/carteniv2.gif");
 $ter = ImageColorAllocate ($im, 150, 150, 150);
 imagefilledrectangle ($im, $abs, $ord, 70, 70, $ter);
 imagePng($im);

mysql_close();

?>

Sinon tu peut mettre mysql_close(); juste après les requêtes :

mysql_connect("localhost", "mysql_user", "mysql_password") or die("Impossible de se connecter : ".mysql_error());
mysql_select_db('base');
$result = mysql_query("SELECT * FROM table");

mysql_close(); // << ICI

// mysql_fetch_array APRES mysql_close
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
  printf("ID : %s  Nom : %s", $row[0], $row[1]); 
}
mysql_close();

fonctionne, c'est même recommandé car ça charge moins le serveur mysql.

Lien vers le commentaire
Partager sur d’autres sites

Dans le fichier connect.php il y a exactement ce que tu as mis au début de ton second exemple :)

Ne t'inquiète pas pour la sécurité, j'ai un serveur dédié et il n'accepte de connexions MySQL qu'en local ^^

Merci beaucoup pour ta réponse, je vais essayer tout ce que tu as dit, et je vous tiendrais au courant de ce que ca donne (je pense que ca pourra peut-être intéresser d'autres personnes qui, comme moi, auront essayé de trouver dans google ou autre une réponse sensée à leur attente ^^ ).

Lien vers le commentaire
Partager sur d’autres sites

Ca fonctionne, c'est formidable, merci beaucoup :)

Alors, dans l'ordre :

Tout d'abord le imagecreatefrom doit rester dans le format de l'image originale (imagecreatefromgif pour mon gif, par exemple).

Ensuite fermer la connexion MySQL avant même le header fonctionne parfaitement, et le parcourt des champs (mysql_fetch_array) ne provoque pas la moindre erreur.

Enfin, imagepng($monimage) fonctionne sans problème (mais pensez à mettre en header le même format que cette fonction finale !)

Pour terminer, voici mon code (épuré), qui fonctionne à merveille :

<?

include("connect.php");      //connexion bdd

$result=mysql_query("SELECT");        //je sélectionne les champs que je veux

mysql_close();        //fermeture de la connexion MySQL

header ("Content-type: image/png");      // description du format de l'image pour le navigateur

  $im = imagecreatefromgif ("../images/carte.gif");    //on créé une image à partir d'une autre, en utilisant la fonction correspondante au bon format

  $ter = ImageColorAllocate ($im, 150, 150, 150);    // on défini une couleur avec laquelle on va dessiner

  while($bats=mysql_fetch_array($result)){  // on parcourt les champs jusqu'au dernier

  $abs=$bats[3]; $ord=$bats[4];    //récupération de coordonnées

  imagefilledrectangle ($im, $abs, $ord, $abs+4, $ord+4);  //on utilise les coordonnées pour tracer des petits carrés ^^

  }

  imagepng($im);  // on créé l'image au format choisi, le même que dans le header

?>

C'est parfaitement fabuleux, et ca m'ouvre pas mal de possibilités ^^

Merci beaucoup RaphAstronome :roll:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...