Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] [résolu] Erreur [strict 2048] Only variables should be passed by reference

Posted by gdugas on 07/30/2011 11:33

Bonjour,

J'utilise actuellement Jelix pour développer une galerie d'images.
Sur ma machine, tout fonctionne correctement, mais lors du déploiement de l'application sur le serveur de production, je suis confronté à l'erreur suivante:

[[strict 2048]] Only variables should be passed by reference /[[...]]/jelix-1.2.3-opt/lib/jelix/utils/jFile.class.php 82

J'ai beau chercher je ne trouve pas mon erreur, et je ne sais pas si cette erreur vient de mon code ou d'un bug de Jelix.

Cette erreur apparait lors de l'utilisation du controleur CRUD, au moment de la création d'un nouvel enregistrement, juste apres la soumission de mon formulaire.
Voici le code que j'ai utilisé:

    function _beforeSaveCreate($form, $form_daorec){
<code>
		global $gJConfig;
		$user	= jAuth::getUserSession();
		$img	= $_FILES['img'];
		
		$form_daorec->owner		= $user->login;
		$form_daorec->mime		= $img['type'];
		$form_daorec->date		= time();
		$form_daorec->update	= time();
		$form_daorec->size		= $img['size'];
		
		if( $form->getData('name') )
			$form_daorec->name	= $form->getData('name');
		else
			$form_daorec->name	= $img['name'];
		$form_daorec->uid		= $this->randFilename();
		while( file_exists(JELIX_APP_WWW_PATH. $gJConfig->jgallery['public_storage'] .'/'.$form_daorec->uid) )
			$form_daorec->uid	= $this->randFilename();
		$this->filenamerec	= $form_daorec->uid;
	}
	function _afterCreate($form, $id, $resp){
		global $gJConfig;
		$img	= $_FILES['img'];
		$form->saveFile('img',JELIX_APP_WWW_PATH. $gJConfig->jgallery['public_storage'], $this->filenamerec );
	}
</code>

Voici quelques caractéristiques:

  • version jelix: jelix-1.2.3-opt
  • version php sur serveur de production: PHP Version 5.2.17
  • distribution et version PHP sur serveur local: Ubuntu 10.04 i386 - PHP Version 5.3.2-1ubuntu4.9

Merci beaucoup pour votre aide
Guillaume

  [Opened] Re: Erreur [strict 2048] Only variables should be passed by reference

Reply #1 Posted by gdugas on 08/01/2011 11:24

Alors apparemment, le problème venait du fichier xml de mon formulaire. Dans le champ "upload", j'y ai rajouté une liste de types mimes requis: <upload ref="img" mimetype="image/jpeg;image/pjpeg;image/png;image/gif">
Pourtant, le fichier à bien le type requis, vu que sur ma machine de développement, tout fonctionne bien avec les mêmes fichiers uploadés ... j'ai donc supprimé ce champ mimetype, et ca fonctionne comme il faut. Les contrôles sont donc fait manuellement.

  [Opened] Erreur [strict 2048] Only variables should be passed by reference

Reply #2 Posted by laurentj on 08/01/2011 13:55

Salut,

test avec la nightly de la branche 1.2.x, un truc a été corrigé dans jFile, peut-être que ça a résolu aussi ton problème. Dis nous si c'est ok.

  [Opened] Erreur [strict 2048] Only variables should be passed by reference

Reply #3 Posted by Nigoki on 08/01/2011 15:01

Je rencontre le même problème :

[[strict 2048]] Only variables should be passed by reference .../lib/jelix/utils/jFile.class.php 151

lorsque je fais :

$form->saveFile('logo_cty', JELIX_APP_WWW_PATH.'admin/images/flag/', 'flag_'.$id_cty.'.png');

Ce problème n’apparait que sur le serveur de production. J'ai alors essayé de passer de version opt en dev puis comme proposé par Laurent en nightly 1.2.x mais le problème persiste.

Serveur de dev : php 5.3.6
Serveur de prod : php 5.2.10

EDIT : Si on supprime l'attribut mimetype de la baslise <upload> du form, alors on a plus d'erreurs.

  [Opened] Erreur [strict 2048] Only variables should be passed by reference

Reply #4 Posted by laurentj on 08/02/2011 10:48

Ok j'ai trouvé.

Pour ceux qui ont la 1.2.3 (ou 1.1.10), dans lib/jelix/utils/jFile.class.php, remplacez la méthode :

<code>
	public static function getMimeType($file){
		if(function_exists('finfo_open')){
			$finfo=finfo_open(FILEINFO_MIME_TYPE);
			$type=finfo_file($finfo,$file);
			finfo_close($finfo);
			return $type;
		}
		else if(function_exists('mime_content_type')){
			return mime_content_type($file);
		}
		else{
			$f = explode('.',$file);
			$ext=strtolower(array_pop($f));
			if(array_key_exists($ext,self::$mimeTypes)){
				return self::$mimeTypes[$ext];
			}
			else
				return 'application/octet-stream';
		}
	}
</code>

Pour ceux qui sont sur la nightly :

<code>
    public static function getMimeTypeFromFilename($fileName){
        $f = explode('.', $fileName);
        $ext = strtolower(array_pop($f));
        if (array_key_exists($ext, self::$mimeTypes)) {
            return self::$mimeTypes[$ext];
        }
        else
            return 'application/octet-stream';
    }
</code>

Je n'ai pas de 5.2 sous la main, dites moi si c'est corrigé avec ce code.

  [Opened] Erreur [strict 2048] Only variables should be passed by reference

Reply #5 Posted by gdugas on 08/06/2011 22:58

Merci beaucoup,
Je n'ai pas encore eu le temps de tester, mais je teste ca des que possible, et je vous tiens au courant.

  [Opened] Erreur [strict 2048] Only variables should be passed by reference

Reply #6 Posted by gdugas on 08/12/2011 12:45

Le problème du message d'erreur est résolu, mais maintenant mon type de fichier n'est pas reconnu. Voici mon form:

<upload ref="img" required="true" mimetype="image/jpeg;image/pjpeg;image/png" >
<code>
	<label>Image</label>
</upload> </code>

et j'ai le message suivant:

The file given for "Image" has a wrong type

Pourtant mon image est bien du jpeg.

En revanche, les fonctions finfo_open() et mime_content_type() ne sont pas installées sur le serveur de production. Du coup, il me semble que la détection du type de fichier se fait à partir d'un explode sur le nom, mais le fichier étant uploadé, le nom n'est-il pas le tmp_name de la variable $_FILES qui est sans extension?

  [Opened] Erreur [strict 2048] Only variables should be passed by reference

Reply #7 Posted by laurentj on 08/14/2011 12:47

La correction que j'ai donné ici ne concerne en effet que le problème de la notice. Le problème de non reconnaissance a été corrigé depuis plus d'un mois maintenant. Télécharge le nightly (1.2.4pre ou 1.1.11pre) pour l'avoir.

  [Opened] Erreur [strict 2048] Only variables should be passed by reference

Reply #8 Posted by gdugas on 08/15/2011 10:15

Super, tout fonctionne nikel.
Merci beaucoup !

Guillaume

 
Page
  1. Erreur [strict 2048] Only variables should be passed by reference