[Résolu] PHP: func return $var

Statut
N'est pas ouverte pour d'autres réponses.

mOrbide

Elite
Bonjour. J'ai créé une fonction assez simple pour l'upload d'images. A la fin de la fonction, j'ai besoin de me retourner la variable $up pour une autre fonction appelée après.
Le problème est que, malgré le return $up; en fin de fonction, aucune valeur ne m'est retournée.
Comprends pas.
Voici la fonction en question :
Code:
function up_pic($tmp_file, $type_file, $dir, $h_max, $w_max, $name)  
{
	$up = true;
	if ( !is_uploaded_file($tmp_file) )
		{ exit("Le fichier est introuvable"); $up = false; }
		
	// Vérification extension
	if ( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') )
		{ exit("Le fichier n'est pas une image.jpg"); $up = false; }
	
	// Vérification taille image
	$taille = getimagesize($tmp_file);
	$h_i = $taille[1];
	$w_i = $taille[0];
	if (($h_i > $h_max) || ($w_i > $w_max))
		{ exit("<p>L'image est trop grande ($h_i * $w_i).  Veuillez respecter les contraites de taille ($h_max * $w_max).</p>"); $up = false; }

	// Put the file in the target directory
	// Put the file in the target directory
	if (!empty($name))
		$name_file = strtolower($_POST['pseudo']). '.jpg';
	else	
		$name_file = trim(htmlentities($tmp_file));

	if ( !move_uploaded_file($tmp_file, $dir . $name_file) )
		{ exit("Impossible de copier le fichier dans $dir"); $up = false; }
	
	if ($up) // Finalise
	{
		echo '<p>L\'image <b>' .$name_file. '</b> a bien été uploadée.<br/>' 
		.$dir. '<b>' .$name_file. '</b><br/>
		<a href="index.php?page=' .$_GET['page']. '">Retour</a></p>';
	}

	return $up;
}
 

Baron

Elite
Et si t'essayais simplement d'utiliser des int à la place des boolean ?
 
mOrbide a dit:
Bonjour. J'ai créé une fonction assez simple pour l'upload d'images. A la fin de la fonction, j'ai besoin de me retourner la variable $up pour une autre fonction appelée après.
Le problème est que, malgré le return $up; en fin de fonction, aucune valeur ne m'est retournée.
Comprends pas.
Voici la fonction en question :
Code:
function up_pic($tmp_file, $type_file, $dir, $h_max, $w_max, $name)  
{
	$up = true;
	if ( !is_uploaded_file($tmp_file) )
		{ exit("Le fichier est introuvable"); $up = false; }
		
	// Vérification extension
	if ( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') )
		{ exit("Le fichier n'est pas une image.jpg"); $up = false; }
	
	// Vérification taille image
	$taille = getimagesize($tmp_file);
	$h_i = $taille[1];
	$w_i = $taille[0];
	if (($h_i > $h_max) || ($w_i > $w_max))
		{ exit("<p>L'image est trop grande ($h_i * $w_i).  Veuillez respecter les contraites de taille ($h_max * $w_max).</p>"); $up = false; }

	// Put the file in the target directory
	// Put the file in the target directory
	if (!empty($name))
		$name_file = strtolower($_POST['pseudo']). '.jpg';
	else	
		$name_file = trim(htmlentities($tmp_file));

	if ( !move_uploaded_file($tmp_file, $dir . $name_file) )
		{ exit("Impossible de copier le fichier dans $dir"); $up = false; }
	
	if ($up) // Finalise
	{
		echo '<p>L\'image <b>' .$name_file. '</b> a bien été uploadée.<br/>' 
		.$dir. '<b>' .$name_file. '</b><br/>
		<a href="index.php?page=' .$_GET['page']. '">Retour</a></p>';
	}

	return $up;
}
[/code]
Je peux me tromper, mais il me semble que mettre un exit arrete tout, donc il te retournera jamais quoi que ce soit après un exit ..
 
1er
OP
mOrbide

mOrbide

Elite
Ca c'est logique, mais c'est prévu que lorsqu'une des conditions n'est pas respectée, il ne me retourne rien.
Par contre, même lorsque tout fonctionne, je n'ai aucun retour.

En attendant, je vais essayer une formule peut-être un peu plus propre avec des elseif à la place d'un mutli if et exits.
Merci pour l'idée ;)

T__T
 
1er
OP
mOrbide

mOrbide

Elite
Bon...
J'ai trouvé un moyen de faire fonctionner le tout mais je voudrais votre avis sur la façon dont c'est programmé (qui me parait dégueu).

En gros, j'utilise donc une fonction (up_pic(paramètres)) qui agit sur les images, et qui me retourne $up = true si l'image a bien été up, et $up = false sinon. Je me sers par après du $up car si ça a bien été uploadé, j'ajoute une entrée dans une table sql et blablabla, j'utilise donc, juste après ma fonction un

Code:
if ($up) { mysql_query(blabla); }
Vu que la variable $up ne sort pas de la fonction malgré le return $up (je ne pige tjs pas pourquoi), ma condition est foutue.
Par contre, formulé de cette façon, tout fonctionne:

Code:
if (up_pic(paramètres)) { mysql_query(blabla); }
La fonction s'exécute bien, elle retourne bien la valeur true ou false, selon. Mais il me semble qu'exécuter une fonction faite maison dans un "if" c'est pas terrible...
Votre point de vue ?
 

Bingo

Beer Addict
mOrbide a dit:
La fonction s'exécute bien, elle retourne bien la valeur true ou false, selon. Mais il me semble qu'exécuter une fonction faite maison dans un "if" c'est pas terrible...
Votre point de vue ?
Je ne connais pas PHP, mais d'une façon générale une variable locale (dans une procédure) n'est pas utilisable dans un contexte global (hors de la procédure).
Exécuter la fonction dans un if c'est pas terrible, mais tu peux simplement stocker le résultat de ta fonction.

$upload_result = up_pic(paramètres);
if($upload_result) ...
 
S

Statler

ex membre
{ exit("<p>L'image est trop grande ($h_i * $w_i). Veuillez respecter les contraiNtes de taille ($h_max * $w_max).</p>"); $up = false; }
:roll:
 
1er
OP
mOrbide

mOrbide

Elite
Bingo a dit:
Je ne connais pas PHP, mais d'une façon générale une variable locale (dans une procédure) n'est pas utilisable dans un contexte global (hors de la procédure).
Exécuter la fonction dans un if c'est pas terrible, mais tu peux simplement stocker le résultat de ta fonction.

$upload_result = up_pic(paramètres);
if($upload_result) ...
Disons que le return sert précisément à créer une variable globale sortant de la fonction. C'est comme si ça créait un nouvea paramètre en sortie. Mais ta solution est déjà plus "propre", je prends en attendant ;) Merci.

EDIT MAY THE CAFEINE HELP

Statler a dit:
{ exit("<p>L'image est trop grande ($h_i * $w_i). Veuillez respecter les contraiNtes de taille ($h_max * $w_max).</p>"); $up = false; }
:roll:
C'est malin :mrgreen: N'empêche je vais corriger :p Merci.
 

Calvin80

Respect is key
heu... pas vraiment regardé ton code..
mais ça veut dire quoi "retourne rien" ?
car false..c'est rien, 0 c'est rien, mais false c'est pas tjrs 0...
 
1er
OP
mOrbide

mOrbide

Elite
Calvin80 a dit:
heu... pas vraiment regardé ton code..
mais ça veut dire quoi "retourne rien" ?
car false..c'est rien, 0 c'est rien, mais false c'est pas tjrs 0...
En php false = 0, mais false ce n'est pas "rien", c'est "false".
Et même si ce n'était "rien", les cas ou la fonction retourne "true" ne changent rien au problème, donc visiblement le problème ne vient pas de la nature du booléen ;)
 

Bingo

Beer Addict
mOrbide a dit:
Disons que le return sert précisément à créer une variable globale sortant de la fonction. C'est comme si ça créait un nouvea paramètre en sortie. Mais ta solution est déjà plus "propre", je prends en attendant ;) Merci.
OK, je vois ce que tu veux dire. Je connais plus ASP / VBScript et les variables ne peuvent pas sortir d'une procédure si elles n'ont pas été déclarées comme "globales". Mais je crois qu'il n'y a pas de déclaration de variable en PHP, donc ça ne peut pas s'appliquer de la même façon.
Je vais bientôt me mettre à PHP, et je me demande déjà comment on peut s'en sortir sans déclaration de variables... Mais je m'éloigne du sujet !
 

Jereck

Α & Ω
Staff
return ($up); ne crée absolument pas une variable '$up' dans la procédure appelante !

C'est simplement la valeur de retour de la fonction !

Bingo > En VB, Perl, etc... on peut aussi travauiller sans déclaration de variables, mais cette option peut être "contrée" par l'ajout d'une ligne dans l'entête du script (Option Declare Explicit en VB) je présume que c'est aussi faisable en PHP.
 

Bingo

Beer Addict
Jereck a dit:
return ($up); ne crée absolument pas une variable '$up' dans la procédure appelante !
C'est simplement la valeur de retour de la fonction !
Ah, c'est mieux comme ça.
C'est rassurant qu'il y ait un minimum de points communs entre les langages procéduraux tout de même.
 

Calvin80

Respect is key
mOrbide a dit:
Disons que le return sert précisément à créer une variable globale sortant de la fonction.
hein??
j'ai peur d'avoir compris ce que tu voulais dire là..
si tu fais:
<?php
function test(){ $t='a'; return $t;}

test()
if($t=='a') echo 'test reussi';
?>

ça ne marchera jamais hein ! $t n'est absolument pas une variable globale.
D'ailleurs, suivant ta configuration pph (ton php.ini) ça va te retourner une belle erreur de undefined variable !
 
1er
OP
mOrbide

mOrbide

Elite
Jereck a dit:
return ($up); ne crée absolument pas une variable '$up' dans la procédure appelante !

C'est simplement la valeur de retour de la fonction !
Je viens de me relire, je n'ai rien dit ;)
Mea culpa ^^

Bingo, ta solution est la plus appropriée. J'adopte.
Merci pour l'aide, désolé pour la confusion: je vais me faire un thermo bien serré avant de me retrouver ici

Encore merci pour vos clarifications ;)
 

Bingo

Beer Addict
Jereck a dit:
Bingo > En VB, Perl, etc... on peut aussi travauiller sans déclaration de variables, mais cette option peut être "contrée" par l'ajout d'une ligne dans l'entête du script (Option Declare Explicit en VB) je présume que c'est aussi faisable en PHP.
Ah OK, je croyais simplement que la déclaration n'existait pas en PHP.
Je travaille toujours avec Option Explicit, c'est plus strict, ça évite énormément de bétises (fautes de frappes dans les noms de variables, surtout).
En VBScript (donc ASP) les variables ne sont pas typées donc c'est limité, mais en .NET elles sont typées donc c'est l'idéal.
Les variables sont typées en PHP ? (je m'éloigne de plus en plus du sujet là... :roll: ;))
 

Calvin80

Respect is key
Bingo a dit:
Les variables sont typées en PHP ? (je m'éloigne de plus en plus du sujet là... :roll: ;))
non, les variables ne sont pas typées dans leur déclaration, tu n'as pas de
int $my_integer;

par contre des tests sont fait sur le type d'objet contenu dans les variables quand tu appelles des fonction.

par exemple la fonction
bool array_key_exists ( mixed key, array search )
qui permet de chercher si un clef existe dans un table, va te renvoyer un erreur si tu inverses les deux paramètres, car un mixed n'est pas un array..
 

Bingo

Beer Addict
Calvin80 a dit:
non, les variables ne sont pas typées dans leur déclaration, tu n'as pas de
int $my_integer;
par contre des tests sont fait sur le type d'objet contenu dans les variables quand tu appelles des fonction.
OK, c'est comme en Python, c'est du typage dynamique.
Merci pour la précision.
 
mOrbide a dit:
Disons que le return sert précisément à créer une variable globale sortant de la fonction. C'est comme si ça créait un nouvea paramètre en sortie. Mais ta solution est déjà plus "propre", je prends en attendant ;)
Ils t'ont donner la réponse du pourquoi ca fonctionne pas ;)
Voici un cours complèt sur les fonctions (ou modules) en logique : ICI

En gros et comme répété, pour récupéré uen variable locale, je ne connai qu'un seul moyen :

Code:
$mavariableglobale = $mafonction($monretour);
Et poru le typage, on va die qu'il est quasi néant en PHP :cool: typage très faible comparé à un typage comme C ou JAVA...
Possibilité de le forcé aussi ...


mOrbide a dit:
En php false = 0
Heuuuuu ... et 1 = true alors :mrgreen: non tu te fais une mauvaise idée sur les booléens, les bouléens n'ont que deux """état""" possible false et true et ne sont surtout pas des entiers ;), 0 est un entier.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut