Page 1 sur 1

Pas de valeur dans "PATH_INFO" chez OVH ?

Posté : 26 avr. 2006, 10:27
par BigBugz
Bonjour messieurs les spécialistes :)

Je suis en train de faire un site ou j'ai le besoin de "watermarker on the fly" (ajout de texte ou image) les images que je publie.

Pour info, je me suis mis au PHP depuis, allez ... 15 jours max ;)

J'utilise un CMS, et je n'ai pas les compétences techniques pour modifier directement les scripts de celui-ci, d'où mes recherches pour une solution indépendante. j'ai donc trouvé une solution sur le net qui se profile comme suit :

FONCTIONNEMENT :
1. Un fichier .htaccess dans le répertoire ou se trouve les images que je veux "watermarker"
2. Un script associé (dans le même répertoire) qui modifie à la voler toutes les images appelées par Apache
3. Une image watermark.png toujours dans le même répertoire ou un texte renseigné dans le script utilisé pour appliqué le "Copyright" sur les images

Voici le .htaccess :
addhandler wtrk jpg
action wtrk /components/com_virtuemart/shop_image/product/modify.php

Je vous mettrais le script en fin de post pour que ce soit plus clair à lire.

PROBLEME :
Ce site est hébergé chez OVH et après qq. tests et recherches, le problème vient de la variable ("PATH_INFO") qui ne renvoi aucune valeur. Donc mon script ne peut s'executer car aucune valeur dans la variable $filename n'est renseignée et le script s'appuie dessus...

J'obtiens donc l'erreur suivante :
erreur à la ligne x GetImageSize () -> () étant vide car $filename vide à cause de PATH_INFO vide...

Après qq. recherches et dialogue avec la Hotline de OVH, je pense que le "module" permettant d'activer cette variable n'est pas activé ( ou vérouillé volontairement) ou leur architecture ne le permet pas..
Quoi qu'il en soit, il faut que je trouve une autre solution...

QUESTION :
Est-il possible d'utiliser une autre variable qui retournerait la même valeur de "PATH_INFO"?
Valeur qui est normalement le path+le nom de l'image demandé par le client...

Une idée pour m'aider sur ce point bloquant ?
Si vous avez d'autre script qui s'articule autrement, je suis bien entendu preneur aussi...

Par avance merci.

PS : ci-dessous le script "modify.php" :
<?php
/*
 activeWatermark
 Free script that places watermark on images in folder
 Copyright (C) 2005 ActiveUnit.com
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version 2
 of the License, or (at your option) any later version.²
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
 // IMAGE WATERMARK (comment line below if you do not want to use image watermark)
 Define('WATERMARK_IMAGE', './watermark.png'); // path to watermark image
 Define('WATERMARK_PERCENT', '30'); // Intensity of the transition (in percent)

/*
// TEXT WATERMARK (comment line below if you do not want to use text)
 Define('WATERMARK_TEXT', 'HobbyHome'); // text to place (image will not be used)
 Define('WATERMARK_TEXT_FONT', '5'); // font 1 / 2 / 3 / 4 / 5
 Define('TEXT_SHADOW', '1'); // 1 - yes / 0 - no
 Define('TEXT_COLOR', '#FFFFFF'); // text color

*/

 // GENERAL SETTINGS
 Define('WATERMARK_ALIGN_H', 'center'); // left / right / center
 Define('WATERMARK_ALIGN_V', 'center'); // top / bottom / center
 Define('WATERMARK_MARGIN', '10'); // margin

// ----------------------------------------------------------------------------------------

 $dr=preg_replace('/modify\.php.+/', '', $_SERVER['PHP_SELF']);
 $filename=str_replace($dr, './', $_SERVER['PATH_INFO']);


 $lst=GetImageSize($filename);
 $image_width=$lst[0];
 $image_height=$lst[1];
 $image_format=$lst[2];

 if ($image_format==1) {
   Header("Content-Type:image/gif");
   readfile($filename);
   exit;
 } elseif ($image_format==2) {
  $old_image=imagecreatefromjpeg($filename);
 } elseif ($image_format==3) {
  $old_image=imagecreatefrompng($filename);
 } else {
   readfile($filename);
   exit;
 }


 if (Defined('WATERMARK_TEXT') && WATERMARK_TEXT!='') {
 // text

  $color = eregi_replace("#","", TEXT_COLOR);
  $red = hexdec(substr($color,0,2));
  $green = hexdec(substr($color,2,2));
  $blue = hexdec(substr($color,4,2));

  $text_color = imagecolorallocate ($old_image, $red, $green, $blue);

  $text_height=imagefontheight(WATERMARK_TEXT_FONT);
  $text_width=strlen(WATERMARK_TEXT)*imagefontwidth(WATERMARK_TEXT_FONT);
  $wt_y=WATERMARK_MARGIN;
  if (WATERMARK_ALIGN_V=='top') {
   $wt_y=WATERMARK_MARGIN;
  } elseif (WATERMARK_ALIGN_V=='bottom') {
   $wt_y=$image_height-$text_height-WATERMARK_MARGIN;
  } elseif (WATERMARK_ALIGN_V=='center') {
   $wt_y=(int)($image_height/2-$text_height/2);
  }

  $wt_x=WATERMARK_MARGIN;
  if (WATERMARK_ALIGN_H=='left') {
   $wt_x=WATERMARK_MARGIN;
  } elseif (WATERMARK_ALIGN_H=='right') {
   $wt_x=$image_width-$text_width-WATERMARK_MARGIN;
  } elseif (WATERMARK_ALIGN_H=='center') {
   $wt_x=(int)($image_width/2-$text_width/2);
  }

  if (TEXT_SHADOW=='1') {
   imagestring($old_image, WATERMARK_TEXT_FONT, $wt_x+1, $wt_y+1, WATERMARK_TEXT, 0);
  }
  imagestring($old_image, WATERMARK_TEXT_FONT, $wt_x, $wt_y, WATERMARK_TEXT, $text_color);

 }

 if (Defined('WATERMARK_IMAGE') && WATERMARK_IMAGE!='' && file_exists(WATERMARK_IMAGE)) {
 // image


 $lst2=GetImageSize(WATERMARK_IMAGE);
 $image2_width=$lst2[0];
 $image2_height=$lst2[1];
 $image2_format=$lst2[2];

 if ($image2_format==2) {
  $wt_image=imagecreatefromjpeg(WATERMARK_IMAGE);
 } elseif ($image2_format==3) {
  $wt_image=imagecreatefrompng(WATERMARK_IMAGE);
 }

  if ($wt_image) {

   $wt_y=WATERMARK_MARGIN;
   if (WATERMARK_ALIGN_V=='top') {
    $wt_y=WATERMARK_MARGIN;
   } elseif (WATERMARK_ALIGN_V=='bottom') {
    $wt_y=$image_height-$image2_height-WATERMARK_MARGIN;
   } elseif (WATERMARK_ALIGN_V=='center') {
    $wt_y=(int)($image_height/2-$image2_height/2);
   }

   $wt_x=WATERMARK_MARGIN;
   if (WATERMARK_ALIGN_H=='left') {
    $wt_x=WATERMARK_MARGIN;
   } elseif (WATERMARK_ALIGN_H=='right') {
    $wt_x=$image_width-$image2_width-WATERMARK_MARGIN;
   } elseif (WATERMARK_ALIGN_H=='center') {
    $wt_x=(int)($image_width/2-$image2_width/2);
   }

   imagecopymerge($old_image, $wt_image, $wt_x, $wt_y, 0, 0, $image2_width, $image2_height, WATERMARK_PERCENT);
  }

 }

 if ($image_format==2) {
  imageJpeg($old_image);
 }
 if ($image_format==3) {
  imagePng($old_image);
 }


?>/*php  /php*/

Posté : 26 avr. 2006, 10:45
par mere-teresa
Oulaaah, la tartine de code...
As-tu contacté OVH ?
[/u]

Posté : 26 avr. 2006, 11:20
par BigBugz
Oui, j'ai contacté OVH comme indiqué dans mon post. Ils n'ont pas de solution à mon problème et mon gentillement dit de me debrouiller tout seul (je les comprends, ils ne sont pas là pour faire du support en dév.)

C'est vrai, on dirait une vrai tartine... mais avec la café ca passe bien ;)

Non, sans déconner, mon problème est simple et se limite à la varialbe 'PATH_INFO' qui ne retoune rien sur mon hébergement, tout est OK par ex. sur mon PC Windows en test.

donc, juste les 2 ligne ci-dessous... :
$dr=preg_replace('/modify\.php.+/', '', $_SERVER['PHP_SELF']);
$filename=str_replace($dr, './', $_SERVER['PATH_INFO']);

La première ligne est OK... mais la seconde ne retourne rien car PATH_INFO vide.

Une idée?

Merci.

Posté : 26 avr. 2006, 12:52
par mere-teresa
Donc :
- soit tu récupères le nom du fichier autrement
- soit tu émules cette fonction

En tous cas : as-tu regardé la doc sur pathinfo ?
Et la constante __FILE__ ?

Sinon PHP4 ou 5 ?

Posté : 26 avr. 2006, 15:25
par BigBugz
"Pour info, je me suis mis au PHP depuis, allez ... 15 jours max"

J'ai lu la doc de PATH_INFO et __FILE__, mais je la comprends à peine.

Je comprends ce que tu veux dire quand tu me parles d'utiliser une autre variable pour trouver le nom du fichier ou l'émuler, mais je ne sais absolument pas le faire... et j'ai du mal a avoir des certitudes sur ce qui marche et ce qui ne marche pas sur l'herbergement (au passage, c'est un hébergement mutualisé).

Pourrais-tu me donner une méthode de debugging (ou m'orienter vers un site ou autres) pour m'aider dans mon problème?
Comment afficher (echo?) des variables? surtout celle qui sont en tableau?
De manière globale, comment tester facilement des script php ?? j'ai lu qq. part qu'il y avait un mode en ligne de commande par ex..

Merci pour tout.

Posté : 26 avr. 2006, 16:04
par BigBugz
J'ai oublié de te préciser quelle version de PHP : 4.4.2

Merci.

Posté : 26 avr. 2006, 16:20
par mere-teresa
print_r($mavar); pour afficher le contenu des variables en tableaux.

Posté : 27 avr. 2006, 08:37
par BigBugz
Bonjour!

J'ai trouvé hier au soir d'où venait le problème... grace à la commande print_r.
J'ai affiché toutes les variables d'environnements $_SERVER, $_ENV, $_GET... et je me suis rendu compte que la varialbe PATH_INFO était bien présente et renseignée.

J'ai cru un instant que c'était la commande "str_replace" qui ne marchait pas, mais non. Il y avait 2 erreurs dans le script modify.php :

$dr=preg_replace('/modify\.php+/', '', $_SERVER['PHP_SELF']);
$filename=str_replace($dr, './', $_SERVER['PATH_INFO']);

1. sur la variable PHP_SELF qui ne renvoyait pas la valeur attendu (cad : chemin relatif + nom du script appelé "modify.php").
2. le + de : '/modify\.php+/' posait problème aussi. La commande n'était pas comprise et la variable $dr n'avait pas la bonne valeur non plus.

Voici les 2 lignes corrigées donc :

$dr=preg_replace('/modify\.php/', '', $_SERVER['SCRIPT_NAME']);
$filename=str_replace($dr, './', $_SERVER['PATH_INFO']);

Avec celles-ci, aucun problème d'execution ...
La variable PATH_INFO est bien active sur les hébergements mutualisés de chez OVH.

Merci pour tout mere-teresa (même si au début, en voyant ta réponse d'une ligne, je ne savais pas comment j'allais faire pour débugger ce pb... !!! ;) )