IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Prise en compte d'un fichier


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Prise en compte d'un fichier
    Bonjour à tous,

    Lorsque je télécharge un logo ou que je le supprime, je n'arrive pas à prendre en compte la modification à l'enregistrement (soumission du formulaire): Je suis obligé d'actualiser la fenêtre pour que les modifications soient prises en compte: A l'enregistrement d'un nouveau logo, il ne s'affiche pas. Lors de la suppression, c'est l'image vide qui s'affiche.
    Pourtant, je ne trouve aucune erreur dans mon code.
    Info: Dans les fichiers suivants, le tableau $echo contient toutes les variables à afficher dans la vue.
    $echo['content'] est utilisée dans le template.
    Est-ce que je suis assez clair?
    Fichier vue 'setDefaultValues.php':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    require_once('../uploadDefines.php');
    ob_start();
    ?>
     
    <h2>Définition des préférences</h2>
    <?= $echo['alerts']; ?>
     
    <form method="post" enctype="multipart/form-data" class="settings" action="backend/settings.php">
    	<!-- code -->
    	<fieldset><legend>Notre logo</legend>
    			<label for="logo">Nouveau logo<sup class="note">&nbsp;*</sup></label><input type="file" id="logo" name="logo"><br>
    			<input type="submit" name="destroy" value="Supprimer logo"><br>
    			<p class="note">Le fichier du logo ne doit pas excéder les limites suivantes&nbsp;:<br>
    				<ul class="note">
    					<li><label>Hauteur&nbsp;:</label><?= MAX_WIDTH.' pixels'; ?></li>
    					<li><label>Largeur&nbsp;:</label><?= MAX_HEIGHT.' pixels'; ?></li>
    					<li><label>Taille&nbsp;:</label><?= MAX_WEIGHT*100 .' ko'; ?></li>
    					<li><label>Types autorisés&nbsp;:</label>'gif', 'png', 'jpg', 'jpeg'</li>
    				</ul>
    			</p>
    	</fieldset>
    	<p style="padding-left:10px;"><input type="submit" name="saveElem" value="<?= getDBText($language,72); ?>"></p>
    </form>
     
    <?php $echo['content'] = trim(ob_get_clean()); ?>
    EDIT: Fichier contrôleur 'setDefaultValues.php' 'settings.php':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    if ( empty(session_id()) )
    	session_start();
     
    require_once('../functions.php');
     
    checkSubscriber();
     
    // Init variables
    $echo				= $_SESSION['headings'];
    $echo['messages']	= (empty($_SESSION['messages']))	? '': displMessages($_SESSION['messages']);
    $echo['errors']		= (empty($_SESSION['errors']))		? '': displErrors($_SESSION['errors']);
    $echo['alerts']		= implode('<br>',[$echo['messages'], $echo['errors'], ]);
    $language			= $_SESSION['language'];
    $iPage				= $_SESSION['pPage'];
     
    // code problématique
    $logos				= glob("../images/subsLogos/{$_SESSION['currentUser']['id_subscriber']}.*", GLOB_NOSORT);
    $src				= empty($logos) ? '': $logos[0];
    //$echo['subsLogo']	= empty($src) ? '': "<img src='../$src' alt='subsLogo'>";
    var_dump($src);
    var_dump(file_exists($src));
    $echo['subsLogo']	= file_exists($src) ? "<img src='../$src' alt='subsLogo'>": '';
    // Fin du code problématique
     
    switch ($iPage){
    	case 4:
    	default:
    		$controller	= 'settingDefaults.php';
    		$view		= __dir__ ."/views/$language/setDefaultValues.php";
    	break;
    	case 5:
    		// code
    	break;
    	case 6:
    		// code
    	break;
    }
     
    require_once($controller);
    require_once('../frontend/views/menuVUser.php');
    require_once($view);
    require_once('../views/template.php');

  2. #2
    Invité
    Invité(e)
    Par défaut
    il me semble que pour appeler la même page que l'argument action est facultatif essaye sans? Tu peut aussi mettre le chemin en relatif ou absolu.
    e formulaire à l'aire d'être correct
    Dernière modification par Invité ; 28/12/2021 à 17h37.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Oups! J'ai fait une erreur: Le contrôleur n'est pas 'setDefaultValues.php' mais 'settings.php'. Je corrige (EDIT).
    Il s'agit d'une structure MVC dans laquelle le formulaire est dans la vue (fichier 'setDefaultValues.php') et le traitement se fait dans le contrôleur 'settings.php'. Le contrôleur renvoie les données corrigées au formulaire rafraîchi. Mon problème se situe dans le rafraîchissement des données retournées au formulaire dans le fichier vue.
    J'ajoute le code source de la vue (ctrl+U) duquel j'ai supprimé le code inutile (non concerné par la question). Il s'agit du code initial avant sélection ou suppression du logo:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <!DOCTYPE html>
    <html lang="fr">
    	<head>
    		<meta charset="utf-8">
    		<title>xxxxxxx</title>
    		<meta name="description" content="du texte">
     
    		<meta http-equiv="Expires" content="-1" >
    		<meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
     
    		<base href="http://sirep.proginet.local" />
     
    		<link rel="stylesheet" media="all" type="text/css" href="../css/structure.css">
    		<link rel="stylesheet" media="all" type="text/css" href="../css/screen.css">
    		<link rel="stylesheet" media="print" type="text/css" href="../css/print.css">
    			</head>
     
    	<body>
     
     
    <header>
    	<div class="displTimer">
    		<span id="timer"></span>
    	</div>
    </header>		
    		<section>
     
    			<div id="left">
    				<nav class="mainNav">
    					<!-- menu ici -->
    				</nav>
    			</div>
    			<article id="right">
    				<h2>Définition des préférences</h2>
    <br>
    <form method="post" enctype="multipart/form-data" class="settings" action="backend/settings.php">
    	<fieldset><legend>Valeurs par défaut</legend>
    		<!-- champs textes non concernés par la question -->
    	</fieldset>
    	<fieldset><legend>Notre logo</legend>
    			<label for="logo">Nouveau logo<sup class="note">&nbsp;*</sup></label><input type="file" id="logo" name="logo"><br>
    			<input type="submit" name="destroy" value="Supprimer logo"><br>
    			<p class="note">Le fichier du logo ne doit pas excéder les limites suivantes&nbsp;:<br>
    				<ul class="note">
    					<li><label>Hauteur&nbsp;:</label>250 pixels</li>
    					<li><label>Largeur&nbsp;:</label>250 pixels</li>
    					<li><label>Taille&nbsp;:</label>10000000 ko</li>
    					<li><label>Types autorisés&nbsp;:</label>'gif', 'png', 'jpg', 'jpeg'</li>
    				</ul>
    			</p>
    	</fieldset>
    	<p style="padding-left:10px;"><input type="submit" name="saveElem" value="Enregistrer"></p>
    </form>			</article>
     
    		</section>
     
    		<!-- Suite du code non concerné par la question -->
     
    	</body>
    </html>

  4. #4
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    Pour forcer le rechargement du logo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... "<img src='../{$src."?".time()}' alt='subsLogo'>": '';

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Je ne comprends pas ton écriture qui en plus me provoque une erreur de syntaxe unexpected '.', expecting :: au premier point.
    J'ai essayé avec les deux lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $echo['subsLogo']	= file_exists($src) ? "<img src='../{$src."?".time()}' alt='subsLogo'>": '';
    $echo['subsLogo']	= "<img src='../{$src."?".time()}' alt='subsLogo'>": '';

  6. #6
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Je ne suis pas familier avec cette écriture entre accolades...

    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $echo['subsLogo']	= "<img src='../{$src}?{time()}' alt='subsLogo'>": '';
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $echo['subsLogo']	= "<img src='../".$src."?".time()."' alt='subsLogo'>": '';
    Je préfère cette syntaxe, ne serait-ce que pour la coloration syntaxique, qui simplifie le débogage.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Avec les deux écritures, j'ai une erreur de syntaxe: les ':' ne sont pas reconnus.
    Je ne comprends pas cette écriture avec une ternaire en plein milieu ni en quoi le time() peut forcer l'affichage.

  8. #8
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonjour

    Citation Envoyé par moimp Voir le message
    Je ne comprends pas cette écriture avec une ternaire en plein milieu ni en quoi le time() peut forcer l'affichage.
    Si "cette écriture" ne te semble pas claire (et à moi non plus d'ailleurs), n'hésite pas à réécrire. Le but premier d'un code, ce n'est pas qu'il fonctionne (ça, c'est sous-entendu) mais qu'il soit compréhensible et maintenable dans le temps. Un bon code doit pouvoir se lire sans effort. Je ne trouve pas que {$src."?".time()} soit particulièrement lisible et pour pratiquer PHP depuis des années, je ne pense pas avoir déjà rencontrer cette syntaxe. Elle fonctionne, peut-être, peut-être pas; je ne sais pas mais elle n'est pas courante.

    Pour rester simple, je préfère perso la seconde écriture proposée par jreaux62 càd "<img src='../".$src."?".time()."' alt='subsLogo'>"';De plus en plus, perso, j'utilise sprintf lorsqu'il y a plusieurs variables et/ou lorsqu'il y a une possibilité de traduction (p.ex. echo "Bonjour ".$firstname). Dans ton cas, j'aurai mis $echo['subsLogo'] = sprintf("<img src='../%s' alt='subsLogo'>", $src."?".time()); qui permet de scinder le "texte" et la variable. L'utilisation du placeholder "%s" indique que je vais injecter une chaîne de caractère et c'est le nom de l'image que je passe comme second paramètre).

    Pour time() l'idée est en fait d'ajouter au nom de ton image (p.ex. logo.png) un suffixe basé sur l'heure (et donc logo.png?1640800395). Cette valeur va donc changer à chaque fois et va donc faire croire au cache du navigateur qu'il s'agit d'une nouvelle image (puisque le nom "change" à chaque fois). L'utilisation de time() est donc faite pour invalider le cache sur ton image.

    Pour le : "", c'est donc un opérateur ternaire mais comme tu le verras, sur cette ligne-là, il est incorrect puisqu'il manque la condition.

    Je reprends ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $echo['subsLogo']	= file_exists($src) ? "<img src='../{$src."?".time()}' alt='subsLogo'>": '';
    $echo['subsLogo']	= "<img src='../{$src."?".time()}' alt='subsLogo'>": '';
    Nous avons parlé ci-dessus de la seconde ligne qui se termine donc par : "", mais où est la condition ? Elle est manquante, cette seconde ligne contient une erreur de syntaxe.

    Reprenons la première ligne cette fois : ici, tu as une condition qui dit "est-ce que le fichier $src existe" ? Si la réponse est oui, alors PHP va exécuter ce qui suit le point d'interrogation (et donc créer le tag img) et si la réponse est non, PHP va exécuter la partie qui suit les double-points et donc assigner une chaîne vide à ta variable. Ici, donc, ta condition ternaire est correcte. Tu as la condition, le "et si c'est vrai" et le "si c'est faux".

    Note que ta première ligne ne sert strictement à rien puisque ta seconde ligne "se moque" de la première puisque elle initialise à nouveau la même variable. C'est comme si je dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $firstName = 'Jacques';
    $firstName = 'Christophe';


    autant supprimer la première ligne... ou la seconde...

  9. #9
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Râââh !!!
    C'est ce qui arrive quand on fait de bêtes copier-coller sur une mini-tablette !

    @moimp
    Tu peux aussi faire preuve d'initiative... et corriger toi-même !
    C'est TON code, après tout !


    1- Évidemment, en reprenant le 1er code :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $echo['subsLogo']	= file_exists($src) ? "<img src='../".$src."?".time()."' alt='subsLogo'>" : '';

    2- ?time() : va modifier l'url de l'image, de sorte que l'image sera automatiquement rechargée (au lieu de prendre celle en cache).

  10. #10
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Râââh !!! C'est ce qui arrive quand on fait de bêtes copier-coller sur une mini-tablette !
    (Râââh aussi, j'aurai dû reprendre le code du premier post pour bien isoler la question)

  11. #11
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci à vous deux pour ces explications.
    @cavo789
    Je savais l'essentiel de ce que tu expliques, notamment je ne l'ai pas utilisé ici mais j'utilise assez fréquemment le sprintf. Ce qui m'a bien aidé, c'est ceci:
    Pour time() l'idée est en fait d'ajouter au nom de ton image (p.ex. logo.png) un suffixe basé sur l'heure (et donc logo.png?1640800395). Cette valeur va donc changer à chaque fois et va donc faire croire au cache du navigateur qu'il s'agit d'une nouvelle image (puisque le nom "change" à chaque fois). L'utilisation de time() est donc faite pour invalider le cache sur ton image.
    Par contre, je ne comprends pas pourquoi le nom de l'image enregistrée ne comprends pas l'extension '?1640800395' (ce qui m'arrange mais c'est juste pour comprendre)

    Il me reste cependant un souci, l'ajout ou la suppression ne sont pas pris en compte dans la vue et nécessitent un deuxième rechargement de la page (F5). En cas d'ajout, rien n'apparaît dans la page, en cas de suppression, c'est le alt qui s'affiche. Je suppose avoir un problème de chronologie. La suppression est réalisée dans le sous-contrôleur lignes 28 et 39 de mon code.

  12. #12
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Citation Envoyé par moimp Voir le message
    ...je ne comprends pas pourquoi le nom de l'image enregistrée ne comprends pas l'extension '?1640800395'...
    C'est normal !

    • C'est juste au moment de l'affichage qu'on le rajoute, pour "forcer" le navigateur à recharger l'image.
    • Et time() change tout le temps...


    Citation Envoyé par moimp Voir le message
    Il me reste cependant un souci, l'ajout ou la suppression ne sont pas pris en compte dans la vue et nécessitent un deuxième rechargement de la page (F5).
    Euhh..... C'était pour régler ce problème qu'on à rajouter "?".time() !

    Si ça n'a pas d'effet, c'est, effectivement, qu'il y a un souci de chronologie entre :

    • le traitement de l'image + enregistrement en bdd
    • la récupération en bdd + affichage dans la page

  13. #13
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    L'image n'est pas enregistrée en bdd mais dans un répertoire du site, ce qui ne devrait rien changer. Mon problème reste entier, il faut que je trouve où ça coince!

  14. #14
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Bonjour, j'ai trouvé. Il s'agissait bien d'un problème de chronologie dans le code, j'ai déplacé le bout de code traité dans cette discussion et tout fonctionne. Merci à vous deux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/11/2021, 14h13
  2. Réponses: 0
    Dernier message: 24/11/2017, 12h09
  3. Réponses: 5
    Dernier message: 17/08/2017, 09h23
  4. [VB.Net] Prise en compte du fichier .css d'un Thème
    Par graphicsxp dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/02/2006, 14h47
  5. Lecture de fichier - dernière ligne non prise en compte
    Par JulienPles dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo