8768 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,

Dans le cadre de la refonte d'un site internet personnel consacré à la météorologie, je me permets de solliciter votre aide concernant une problématique de gestion des données SELECT via traitement PHP.

Je n'ai que très peu de compétences en matière informatique, mais je suis parvenu à créer un site web tout entier en HTML/CSS, bien que modeste, en fouillant sur le net et en lisant de nombreux tutoriels. Force m'est hélas de constater que si vous souhaitez rendre votre site web un tout petit peu plus dynamique, vous ne pouvez pas vous restreindre au seul langage HTML/CSS, seul langage que je maîtrise à peu près actuellement. J'ai donc décidé d'ajouter un soupçon de PHP.

Bref, je viens à l'essentiel, en espérant poster au bon endroit de votre forum.

Je dispose d'une base de données météorologiques contenant actuellement 420 documents (relevés climatologiques sous formes de graphiques .png ou de feuilles .pdf). Cette base de données est appelée à enfler très régulièrement et deviendra énorme en l'espace de quelques années. Plutôt que de présenter ces données en un bloc sur une page, je souhaite créer dans la section climatologique de mon site un formulaire servant à sélectionner tel ou tel graphique ou une feuille .pdf précise.

Pour ce faire je fais apparaître sur mon site :

<form method="post" action="smas_releves/smas_archives-releves_mensuel_redirection.php">
  <select name="annee_archives-releves_mensuel">
    <option value="2011">2011</option>
    <option value="2012">2012</option>
    <option value="2013">2013</option>
    <option value="2014">2014</option>
    <option value="2015">2015</option>
  </select>
&#160 &#160 &#160
  <select name="mois_archives-releves_mensuel">
    <option value="01">Janvier</option>
    <option value="12">Février</option>
    <option value="03">Mars</option>
    <option value="04">Avril</option>
    <option value="05">Mai</option>
    <option value="06">Juin</option>
    <option value="07">Juillet</option>
    <option value="08">Août</option>
    <option value="09">Septembre</option>
    <option value="10">Octobre</option>
    <option value="11">Novembre</option>
    <option value="12">Décembre</option>
  </select>
&#160 &#160 &#160
  <select name="document_archives-releves_mensuel">
    <optgroup label="Relevés">
      <option value="pluviometrie">Pluviométrie</option>
      <option value="vent">Vent</option>
      <option value="temperature">Température</option>
      <option value="neige">Nivométrie</option>
    </optgroup>
    <optgroup label="Statistiques">
      <option value="statistiques_vent">Vent</option>
      <option value="statistiques_temperature">Température</option>
    </optgroup>
  </select>
&#160 &#160 &#160
<input type="submit" value="Rechercher" title="Valider"/>
</form>


Les valeurs "value" que j'attribue à chaque option des SELECT sont autant de fragments constituant l'adresse de chaque fichier destiné à être présenté à l'internaute selon les critères qu'il a demandés.
Par exemple :
Année : 2013 (value = 2013). Mois : Mars (value = 03). Données : Pluviométrie (value = pluviometrie).
Le relevé de pluviométrie du mois de mars 2013 est appelé, le fichier étant à l'adresse :
[g]smas_releves_2013/smas_releves_201303/03_pluviometrie_mars_2013.png[/g]


Avec la meilleure des bonnes volontés, je ne parviens pas, pour l'instant, à suffisamment maîtriser le langage PHP, ô combien éloigné du HTML/CSS que je pratique depuis plusieurs années. Ce langage indispensable me permettrait pourtant de créer le fameux fichier [g]smas_archives-releves_mensuel_redirection.php[/g] qui est appelé comme valeur de action, et qui est destiné à reconstituer l'adresse du fichier demandé, en combinant les morceaux d'adresse issus des value des formulaires SELECT. Il serait bien entendu aussi nécessaire que le fichier PHP vérifie que les 3 SELECT ont bien été sélectionnés par l'internaute, et il faudrait également un système permettant de pallier un éventuel manque de donnée (par exemple un document climatologique inexistant pour la date sélectionnée par l'internaute) en affichant alors qu'il n'existe pas de document pour la période sélectionnée.

J'ai par ailleurs également rechercher sur votre forum des sujets plus ou moins identiques, mais malgré tout je reste en échec total, ne parvenant pas à extrapoler le travail des autres internautes ayant poster sur ce forum.

Une bonne âme aurait-elle la patience de m'éclairer ?

Avec tous mes remerciements,
Bien Cordialement.
Hello!

Puisque tu cherches de l'aide en PHP il aurait fallu poster dans la section appropriée (développement coté serveur). Néanmoins je vais tenter de t'aider. Généralement, on procède toujours à ces 3 étapes dans l'ordre, peu importe l'objectif recherché:

1. Récupération des données
2. Vérification des données
3. Traitement des données

Ce que tu cherches à faire n'est fondamentalement pas compliqué. En revanche comme tu n'as aucune notions en PHP ça devient évidemment impossible. Il va falloir que tu apprenne les bases de ce langage, et jeter un coup d'oeil à la Bible du PHP.

Très vite fait, voilà quelques liens qui pourraient t'aider:

Récupération des données par la super globale $_POST
Fonctions empty et isset pour la vérification des données
Fonction file_exists pour tester l'existence d'un fichier

En espérant que cela puisse t'aider, good luck!
Bonjour,

Merci à Anymah pour sa réponse.

En attendant d'hypothétiques réponses à ce post, j'ai fouillé sur des dizaines de sites et forum pour apprendre le langage php. Malheureusement à part des scripts simples permettant d'afficher "Votre nom est : Jacques. Vous aimez : les chats", je ne trouve pas grand chose sur le net. En attendant que j'avance par mes propres moyens, quelqu'un pourrait-il me dire pourquoi il ne m'est pas possible de reconstituer l'url à partir des quelques lignes suivantes ?

if(isset($_POST['valider'])){
	$annee=$_POST['annee_archives-releves_mensuel'];
	$mois=$_POST['mois_archives-releves_mensuel'];
	$document=$_POST['document_archives-releves_mensuel'];}
$url='smas_releves_'$annee'/smas_releves_'$annee$mois'/'$annee$mois'_'$document'.png';
{header("Location: $url");}

En effet, l'url renvoyée par la fonction header est exactement celle entre apostrophe, mais dépourvue de chaque valeur, j'obtiens alors "sur le terrain" :

smas_releves_/smas_releves_/_.png

J'ai par ailleurs trouvé une affirmation d'internaute qui disait que la fonction str_replace était capable de reconstituer l'url, le problème c'est que je ne vois pas comment l'employer ici, car mes tentatives se sont soldées par le même problème : str_replace remplace une quelconque chaîne de caractères par mes valeurs ($annee, $mois, $documents), mais l'url renvoyée par header ne contient toujours pas ces valeurs. Une idée ?

Avec tous mes remerciements,
Bien à vous.
Bonjour,

Et si tu affiche les valeurs récupérées en POST ($annee, $mois et $document) via un simple echo, tu affiche bien ces valeurs ? Elles sont correctes ?
Hmm, en te relisant, je vois que tu concaténe tout simplement mal ton URL.
Si tes variables récupèrent bien des données via POST, alors corrige cette ligne :
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.' /'.$annee.$mois.'_'.$document.'.png';


RTFM : concaténation php
Modifié par audrasjb (10 Aug 2015 - 23:32)
Bonjour,

Merci pour votre réponse.

En fait j'avais bien essayé également avec les points, et cela ne donne rien non plus.

J'ai pu remarquer ce matin quelque chose d'intéressant :
<?php
if(isset($_POST['valider'])){
	$annee = $_POST['annee_archives-releves_mensuel'];
	$mois = $_POST['mois_archives-releves_mensuel'];
	$document = $_POST['document_archives-releves_mensuel'];}

echo $annee;
?>
Cette première version ne fonctionne pas, pour afficher l'année, il me faut utiliser le code :
<?php
if(isset($_POST['valider'])){
	$annee = $_POST['annee_archives-releves_mensuel'];
	$mois = $_POST['mois_archives-releves_mensuel'];
	$document = $_POST['document_archives-releves_mensuel'];}

echo $_POST['annee_archives-releves_mensuel'];
?>
Donc les données sont bien envoyées par le formulaire FORM, et c'est la définition des variables $annee, $mois et $document qui est erronée. Par contre je ne vois pas pourquoi, puisque c'est ce code que je lis sur les tutoriels ou les cours...!? Qu'est-ce qui cloche alors ?

Je crains que cela ne vienne de la condition if, est-il possible qu'avec mon formulaire cette première condition "présence de la valeur valider" ne soit pas transmise par le formulaire, et que donc par voie de conséquence les variables ne soient pas définies ?
En faite c'est tout simple

if(isset($_POST['valider'])){
	$annee = $_POST['annee_archives-releves_mensuel'];
	$mois = $_POST['mois_archives-releves_mensuel'];
	$document = $_POST['document_archives-releves_mensuel'];}

echo $annee;


ton echo ici ne connais pas $annee, car $annee est déclaré DANS le if.... donc il te pète une erreur de type "annee unknow" et ne fait plus rien. si tu met ton echo DANS ton if, cela marchera.
Bonjour JENCAL,

Merci pour votre réponse.

Je viens de ré-essayer en mettant echo $année entre les accolades du if : je n'ai plus de message d'erreur, mais ce n'est plus qu'une page blanche sans la valeur de $annee qui s'affiche.

Je viens de tester le code suivant :
<?php
$annee=$_POST['annee_archives-releves_mensuel'];
$mois=$_POST['mois_archives-releves_mensuel'];
$document=$_POST['document_archives-releves_mensuel'];
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';

{header("Location: $url");}
?>
Cela fonctionne à présent, le fichier appelé selon l'url reconstituée s'affiche effectivement bien. Cela me fait donc poser la question : à quoi peut bien servir alors la fonction
if(isset($_POST['valider'])){}
que je trouve partout sur le net, et qui au final est responsable dans mon cas de l'échec de la formule php ? A mon sens (incompétent en php je le rappelle) cette fonction précédente ne sert strictement à rien puisque si mon fichier php s'exécute, c'est de toute façon si et seulement si l'internaute à cliquer sur le bouton "Rechercher" (dont la valeur est valider). Non ?
Rebonjour,

Le problème avec if{} que je soulevais tout à l'heure reste pour moi important à résoudre, car maintenant que j'ai compris comment reconstituer une url, il me faut établir 2 conditions if car les fichiers météorologiques disponibles sont constitués par deux syntaxes différentes, en fonction de leur format (.png ou .pdf).

L'adresse des fichiers .pdf doivent être reconstitués ainsi :
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_releves-mensuels.pdf'

L'adresse des fichiers .png doivent être reconstitués ainsi :
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';

Pour y arriver, c'est l'internaute qui envoie l'information à partir du 3ème SELECT :
1. s'il sélectionne "Feuille pdf", alors l'url devra être reconstituée conformément à l'adresse .pdf.
2. s'il sélectionne autre chose que "Feuille pdf", alors l'url devra être reconstituée conformément à l'adresse .png

Malheureusement, comme à l'accoutumée maintenant, lorsque je m'essaye au code php, je suis en échec :
<?php
$annee=$_POST['annee_archives-releves_mensuel'];
$mois=$_POST['mois_archives-releves_mensuel'];
$document=$_POST['document_archives-releves_mensuel'];

if($document = pdf){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_releves-mensuels.pdf';
{header("Location: $url")}
}

if($document != pdf){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';
{header("Location: $url")}
}
?>
L'erreur qui m'est renvoyée me dit : Unexpected "}" aux lignes des header...
Quelqu'un sait-il me dire l'erreur que je commets ?
Pöur ta première question sur le " à quoi sert :
if(isset($_POST['valider'])){}

Simplement à tester si la valeur de $_POST['valider'] est vide ou non.

tu aurais pu faire :

$annee = "";
if(isset($_POST['valider'])){
	$annee = $_POST['annee_archives-releves_mensuel'];
	$mois = $_POST['mois_archives-releves_mensuel'];
	$document = $_POST['document_archives-releves_mensuel'];}

echo $annee;


pour au moins déclaré $annee

___

dans
if($document != pdf){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';
{header("Location: $url")}
}


je ne comprend pas pourquoi tu met header entre {}

tu peux faire simplement
if($document != pdf){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';
header("Location: $url")
}


et puis je pense que tu devrais faire comme cela
if($document != 'pdf')
car pdf est un string
Modifié par JENCAL (11 Aug 2015 - 14:10)
J'avais déjà essayé de retirer les accolades autour de header, hélas sans résultat.
Par contre je viens de trouver, il faut en fait mettre un point virgule à la fin de la ligne du header :
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_releves-mensuels.pdf';
header("Location: $url");
.
Donc je devrai normalement m'en sortir avec le code suivant :
<?php
$annee=$_POST['annee_archives-releves_mensuel'];
$mois=$_POST['mois_archives-releves_mensuel'];
$document=$_POST['document_archives-releves_mensuel'];

if($document = 'pdf'){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_releves-mensuels.pdf';
header("Location: $url");
}

if($document != 'pdf'){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';
header("Location: $url");
}
?>
Malheureusement ce code reste imparfait, puisque quel que soit le choix de l'internaute ("value pdf" ou bien "non value pdf"), c'est toujours l'url du fichier pdf qui est créée. Problème de if ? Faut-il utiliser la fonction elseif ou else ?

En tout cas ni l'une :
if($document = 'pdf'){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_releves-mensuels.pdf';
header("Location: $url");
}

elseif($document != 'pdf'){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';
header("Location: $url");
}
ni l'autre :
if($document = 'pdf'){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_releves-mensuels.pdf';
header("Location: $url");
}

else{
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';
header("Location: $url");
}
de ces deux solutions ne fonctionnent : c'est toujours le fichier pdf qui est généré, quel que soit le choix des SELECT... une idée...?
$document=$_POST['document_archives-releves_mensuel'];

<select name="document_archives-releves_mensuel">
    <optgroup label="Relevés">
      <option value="pluviometrie">Pluviométrie</option>
      <option value="vent">Vent</option>
      <option value="temperature">Température</option>
      <option value="neige">Nivométrie</option>
    </optgroup>
    <optgroup label="Statistiques">
      <option value="statistiques_vent">Vent</option>
      <option value="statistiques_temperature">Température</option>
    </optgroup>
  </select>


if($document = 'pdf'){


A quel moment $document peut il etre égal à 'pdf' ?
JENCAL a écrit :
if($document = 'pdf'){
A quel moment $document peut il être égal à 'pdf' ?

Je ne sais pas, mais ce que cette expression signifie c'est:
"si l'affectation de la chaîne de caractères "pdf" à la variable $document s'est bien déroulée"
Il y a très peu de chance que le résultat de ce test soit "false":

SI tu veux tester la valeur, il faut écrire
if($document == 'pdf'){


Ça n'a peut être rien à voir, mais comme c'est une erreur fréquente, qu'on a généralement beaucoup de mal à trouver tant elle est vicieuse, je préfère la signaler.
Bonjour à tous,

Merci pour vos réponses.

Et voilà, le problème est ainsi résolu, il fallait effectivement changer les = en ==.

Cela fonctionne parfaitement bien avec le code suivant :
<?php
$annee=$_POST['annee_archives-releves_mensuel'];
$mois=$_POST['mois_archives-releves_mensuel'];
$document=$_POST['document_archives-releves_mensuel'];

if($document == 'pdf'){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_releves-mensuels.pdf';
header("Location: $url");
}

if($document !== 'pdf'){
$url='smas_releves_'.$annee.'/smas_releves_'.$annee.$mois.'/'.$annee.$mois.'_'.$document.'.png';
header("Location: $url");
}
?>

Une dernière petite question : est-t-il possible de commander que l'image s'ouvre dans une nouvelle page ? A la manière du target="_blank" en html ?
a écrit :
A mon sens (incompétent en php je le rappelle) cette fonction précédente ne sert strictement à rien puisque si mon fichier php s'exécute, c'est de toute façon si et seulement si l'internaute à cliquer sur le bouton "Rechercher" (dont la valeur est valider). Non ?


Ca dépend, je pourrais manuellement appeler ton fichier php pour essayer de hacker le site. Il faut toujours prévoir un maximum de cas, c'est mieux.

Par contre vérifier l'existance de la valeur du bouton submit, c'est mal. Si on valide le formulaire avec enter, il se peut que la valeur du bouton ne soit pas envoyée.


a écrit :
Je ne sais pas, mais ce que cette expression signifie c'est:
"si l'affectation de la chaîne de caractères "pdf" à la variable $document s'est bien déroulée"


En fait, l'expression $truc = X renvoie X. Comme la chaîne 'pdf' n'est pas vide, elle équivaut à true et donc le if est toujours exécuté.
QuentinC a écrit :

En fait, l'expression $truc = X renvoie X. Comme la chaîne 'pdf' n'est pas vide, elle équivaut à true et donc le if est toujours exécuté.

Ce sur quoi je voulais attirer l'attention, c'est que la syntaxe pour un test d'égalité est
if($truc == 'machin') ...
avec DEUX signes "=". Le problème c'est que, si on n'en met qu'un seul ce n'est pas détecté comme une erreur -- pour d'excellentes raisons -- mais ça veut dire aussi qu'on ne trouve pas facilement l'erreur quand on l'a faite. Je ne compte plus le nombre de fois où je me suis gratté la tête sur ce sujet, surtout quand je passe en quelques minutes d'un langage où une comparaison se fait avec un seul signe "=" à un langage où il en faut deux.
Modifié par PapyJP (13 Aug 2015 - 09:43)
Bonjour à tous,

Nous allons dire que ce sujet est clos et résolu.

Dans l'intervalle j'ai trouvé sur le net que la fonction header en particulier, ou que le PHP en général, ne permettraient pas d'ouvrir un lien dans une nouvelle fenêtre, ce qui d'ailleurs me surprend par rapport à la puissance qui semblait se dégagée du langage PHP.

Au vu du peu de réponses obtenues je constate et conclue que ce langage PHP est incroyablement complexe, ou tout du moins nettement moins intuitif que l'HTML/CSS.

En tout cas je remercie infiniment toutes les personnes qui ont accepté de me venir en aide, et toutes celles qui dans l'ombre m'ont implicitement autorisé à poster sur leur forum des questions d'un niveau débutant.

Bien à vous.
Le langage php est destiné à générer du HTML à partir de donnees fournies par l'utilisateur, via un balise <form> ou en mettant des paramètres dans l'url, et d'autre part le content pu des fichiers du site.
Si tu veux te générer l'ouverture d'une2eme page, il faut que le php génère du HTML qui contienne du Javascript qui fait une création de fenêtre.
Ce n'est pas très difficile à faire.
a écrit :
Ce sur quoi je voulais attirer l'attention, c'est que la syntaxe pour un test d'égalité est
if($truc == 'machin') ...
avec DEUX signes "=". Le problème c'est que, si on n'en met qu'un seul ce n'est pas détecté comme une erreur -- pour d'excellentes raisons -- mais ça veut dire aussi qu'on ne trouve pas facilement l'erreur quand on l'a faite. Je ne compte plus le nombre de fois où je me suis gratté la tête sur ce sujet, surtout quand je passe en quelques minutes d'un langage où une comparaison se fait avec un seul signe "=" à un langage où il en faut deux.


Il existe une petite astuce très simple pour ne plus se faire avoir, si tu n'arrives pas à te débarrasser définitivement de cette erreur de débutant: prendre l'habitude d'écrire systématiquement 123==$truc plutôt que $truc==123. Si tu oublies un = dans ce cas, tu auras forcément une erreur de compilation.
Modifié par QuentinC (13 Aug 2015 - 21:19)
Pages :