8797 sujets

Développement web côté serveur, CMS

Bonjour à toutes et à tous,

J'ai actuellement un code php qui me permet d'afficher toutes les données (choisies) de ma base sql.
Je souhaiterai afficher une partie de ses données en fonction du mois.
J'ai donc créer une colonne dans ma base sql, nommée "mois", dans laquelle je peux retrouvé 1 à plusieurs chiffres compris entre 1 et 12. (en gros la version numérique des mois).

Mais c'est à partir de là que je ne sais plus comment m'y prendre.

Auriez-vous une idée ?

Voici mon code actuel


<?php 

// Déclaration des paramètres de connexion
$host = "localhost";
$user = "root";
$passwd  = "";

try
{
$bdd = new PDO("mysql:host=$host;dbname=eat-to-season", $user, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch (Exception $e)
{
  die('Erreur : ' . $e->getMessage());
}

$id = preg_replace('/([^a-z0-9]+)/i', '-', strtolower($_GET['id_legumes'])); // Formatage de l'id


$query = "SELECT * FROM `liste-legumes` WHERE id_legumes=:id";// Creation de la requete

$sth = $bdd->prepare($query); // preparation de la requête
$result = $sth->execute(array('id' => $id)); // Execution de la requête avec les arguments

// Recuperation des resultats
if($result)
{
while($row = $sth-&gt;fetch(PDO::FETCH_ASSOC))
{
  if (isset($row['noms']))
  {
?&gt;
&lt;h2 class=&quot;ribbon&quot;&gt;&lt;span&gt;Tout sur &lt;?php echo $row['particule'] . $row['noms']; ?&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;?php
  }
  else // Il manque des paramètres, on avertit le visiteur
  {
    echo &quot;Ce légume n'existe pas!&quot;;
  }
}
}
?>


merci de votre aide qui me sera très précieuse !

$query = "SELECT * FROM `liste-legumes` WHERE id_legumes=:id AND mois=:mois";

$sth = $bdd->prepare($query);
$result = $sth->execute(array('id' => $id, 'mois' => $mois)); // Execution de la requête avec les arguments



La question à te poser est simplement à quel niveau le changement doit-il se faire... Si tu veux afficher des résultats différents selon une colonne de ta base, il y a obligatoirement quelque chose à faire sur ta requete.

Je te conseil vivement de voir la documentation SQL car c'est la base ça. Tu vas perdre plus de temps à chercher à chaque nouveauté que de prendre 2/3 jours à savoir te servir de requete SQL..
Modifié par Apoooo (17 Oct 2012 - 08:22)
Apoooo a écrit :
[code]
La question à te poser est simplement à quel niveau le changement doit-il se faire... Si tu veux afficher des résultats différents selon une colonne de ta base, il y a obligatoirement quelque chose à faire sur ta requete.

Je te conseil vivement de voir la documentation SQL car c'est la base ça. Tu vas perdre plus de temps à chercher à chaque nouveauté que de prendre 2/3 jours à savoir te servir de requête SQL..


C'est vrai que je regarde au fur et à mesure au lieu de tout voir dans sa globalité !! mais c'est aussi par manque de temps. Je bosse sur mon site la nuit entre mes travaux et mon boulot le jour !!! Smiley smile . C'est pas une vrai excuse!!

mais je me documente ^^.

Je regarde le code ce soir, merci Apooo
Apoooo a écrit :

$query = &quot;SELECT * FROM `liste-legumes` WHERE id_legumes=:id AND mois=:mois&quot;;

$sth = $bdd-&gt;prepare($query);
$result = $sth-&gt;execute(array('id' =&gt; $id, 'mois' =&gt; $mois)); // Execution de la requête avec les arguments




en lisant le code rapidement, je me demande si j'ai bien expliqué mon problème !!
effectivement je souhaite prendre en compte le mois, mais aussi le mois en cours, par exemple nous sommes au mois d'octobre (10), je voudrais que ma page php retourne les données de ma base sql (noms, mois) dans lesquels le chiffre 10 apparait.
Si tu regardes bien mon code, dans le tableau de ton ->execute(), il y a un champ "mois" qui a pour valeur la variable $mois.

Pour récupérer le mois en cours avec php, regarde du coté de la fonction date() très bien expliquée sur php.net.

Après, a toi d'adapter la requête pour choper ce que tu veux comme résultat..
Apoooo a écrit :
Si tu regardes bien mon code, dans le tableau de ton -&gt;execute(), il y a un champ &quot;mois&quot; qui a pour valeur la variable $mois.

Pour récupérer le mois en cours avec php, regarde du coté de la fonction date() très bien expliquée sur php.net.

Après, a toi d'adapter la requête pour choper ce que tu veux comme résultat..


merci Apooo !

Mais cette fonction date() a pour but de faire apparaître la date.
Hors, ce que je souhaite c'est utilisé le mois comme critère de sélection de donnée (mais sans faire apparaître le mois sur ma page).

Quand je lis http://php.net/manual/fr/function.date.php, je ne retrouve pas le moyen de faire ce que je souhaite.
Modifié par dafid5 (17 Oct 2012 - 09:21)
dafid5 a écrit :
Mais cette fonction date() a pour but de faire apparaître la date.
Hors, ce que je souhaite c'est utilisé le mois comme critère de sélection de donnée (mais sans faire apparaître le mois sur ma page).


date() n'affiche pas la date sur la page, la fonction retourne simplement la date au format demandé.

si tu fait:


$mois = date("m");


tu aura le numéro du mois en cours assigné dans la variable $mois, mais aucun affichage sur la page.

Astuce:

Utiliser DateTime plutôt que date() car bien plus malléable.


/* Avec date() */

$mois = date("m");

/* Avec DateTime */

$dt = new DateTime();

$mois = $dt->format("m");
JJK801 a écrit :


date() n'affiche pas la date sur la page, la fonction retourne simplement la date au format demandé.


/* Avec DateTime */

$dt = new DateTime();

$mois = $dt-&gt;format(&quot;m&quot;);


voici ce que j'ai fait avec vos conseils et mes recherches sur php.net


<?php 

// Déclaration des paramètres de connexion
$host = "localhost";
$user = "root";
$passwd = "";

try
{
  $bdd = new PDO("mysql:host=$host;dbname=eat-to-season", $user, $passwd, array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (Exception $e)
{
  die('Erreur : ' . $e->getMessage());
}

$query = "SELECT * FROM `liste-legumes` WHERE mois= :mois";
WHERE mois = :mois;
$sth = $bdd->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':mois' => 12));
$mois = $sth->fetchAll();
?>

		<section class="ff-container">
		  <ul class="ff-items">
		  <?php
		  // Recuperation des resultats
		  foreach($bdd->query($query) as $row)
		  {
		  ?>
			<li>
			  <a href="fiche-legume.php?id_legumes=<?php echo $row['id_legumes']; ?>">
				<span><?php echo $row['noms']; ?></span>
				<img alt="<?php echo $row['noms']; ?>" src="<?php echo $row['image']; ?>" />
			  </a>
			</li>
		   <?php
		   }
		   ?>



je suis complètement perdu.
J'ai lu plusieurs explication de datetime (), mais rien ne colle avec ce que je recherche
Je suis convaincu de devoir intégrer une condition à ma requete php (PDO), mais je ne sais pas comment m'y prendre pour tenir compte du mois (en court)
Modifié par dafid5 (18 Oct 2012 - 00:10)
J'ai du mal à me dire que tu as vraiment cherché... Quand je vois des truc dans ton code comme :

$query = "SELECT * FROM `liste-legumes` WHERE mois= :mois";
[b]WHERE mois = :mois;[/b]


C'est quoi ce WHERE mois =:mois qui se balade comme ça ?

Tu as les bases en PHP, ça devrait amplement suffire pour arriver à faire ça.. il faut juste se mettre le déroulement de ton script en tête (ou sur papier pour commencer...) :
1. Tu recupères le mois en cours dans une variable
2. Tu modifies ta requete pour cibler selon le mois
3. Tu assignes à ton selecteur ":mois" la valeur que tu as dans ta variable

Donc :

// 1. Tu récupères par exemple aujourd'hui le numero 10 pour octobre
$dt = new DateTime();
$mois = $dt->format("m"); 

// 2. Modification de la requete
$query = "SELECT * FROM `liste-legumes` WHERE mois=:mois"; 

// 3. Tu utilises le mois que tu as récupéré
$sth = $bdd->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':mois' => $mois));
$mois = $sth->fetchAll();

Modifié par Apoooo (18 Oct 2012 - 08:27)
Juste un peu de chipotage:

Apoooo a écrit :


// 1. Tu récupères par exemple aujourd'hui le numero 10 pour octobre
$dt = new DateTime();
$mois = $dt->format("m"); // inutile d'assigner la valeur dans une variables si elle ne sert qu'une fois

// 2. Modification de la requete
$query = "SELECT * FROM `liste-legumes` WHERE mois=:mois"; 

// 3. Tu utilises le mois que tu as récupéré
$sth = $bdd->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':mois' => $mois)); // Pas besoin des : dans le nom du selecteur
$mois = $sth->fetchAll(); // fetchAll cause des problèmes de mémoire sur les très grosses tables car il récupère toutes les lignes d'une coups dans un tableau 


Ce qui nous donne:


// 1. Tu récupères par exemple aujourd'hui le numero 10 pour octobre
$dt = new DateTime();

// 2. Modification de la requete
$query = "SELECT * FROM `liste-legumes` WHERE mois=:mois";; 

// 3. Tu utilises le mois que tu as récupéré
$sth = $bdd->prepare($query);
$sth->execute(array('mois' => $dt->format("m")));
?>
<section class="ff-container">
  <ul class="ff-items">
  <?php
  // Recuperation des resultats
  while($row = $sth->fetch(PDO::FETCH_ASSOC))
  {
  ?>
    <li>
      <a href="fiche-legume.php?id_legumes=<?php echo $row['id_legumes']; ?>">
        <span><?php echo $row['noms']; ?></span>
	 <img alt="<?php echo $row['noms']; ?>" src="<?php echo $row['image']; ?>" />
      </a>
    </li>
    <?php
    }
    ?>
  </ul>
</section>

Modifié par JJK801 (18 Oct 2012 - 09:39)
Apoooo a écrit :
J'ai du mal à me dire que tu as vraiment cherché... Quand je vois des truc dans ton code comme :

$query = &quot;SELECT * FROM `liste-legumes` WHERE mois= :mois&quot;;
[b]WHERE mois = :mois;[/b]


Désolé j'avais fait un copier/coller de trop
JJK801 a écrit :
Juste un peu de chipotage:


Ce qui nous donne:


// 1. Tu récupères par exemple aujourd'hui le numero 10 pour octobre
$dt = new DateTime();

// 2. Modification de la requete
$query = &quot;SELECT * FROM `liste-legumes` WHERE mois=:mois&quot;;; 

// 3. Tu utilises le mois que tu as récupéré
$sth = $bdd-&gt;prepare($query);
$sth-&gt;execute(array('mois' =&gt; $dt-&gt;format(&quot;m&quot;)));
?&gt;
&lt;section class=&quot;ff-container&quot;&gt;
  &lt;ul class=&quot;ff-items&quot;&gt;
  &lt;?php
  // Recuperation des resultats
  while($row = $sth-&gt;fetch(PDO::FETCH_ASSOC))
  {
  ?&gt;
    &lt;li&gt;
      &lt;a href=&quot;fiche-legume.php?id_legumes=&lt;?php echo $row['id_legumes']; ?&gt;&quot;&gt;
        &lt;span&gt;&lt;?php echo $row['noms']; ?&gt;&lt;/span&gt;
	 &lt;img alt=&quot;&lt;?php echo $row['noms']; ?&gt;&quot; src=&quot;&lt;?php echo $row['image']; ?&gt;&quot; /&gt;
      &lt;/a&gt;
    &lt;/li&gt;
    &lt;?php
    }
    ?&gt;
  &lt;/ul&gt;
&lt;/section&gt;


Comment es-tu passé de la version proposé d'Apooo à ta version ?
Est quel est l'intérêt de rédiger la requête de cette manière. (n'oubli pas que je suis débutant).
est-ce que les deux versions sont correctes ? ou est-ce un moyen d'optimiser la requête
Il a juste retiré quelques "fioritures" de ton code qui n'étaient pas utiles au bon fonctionnement de ton script afin de l'optimiser au mieux. Moi, j'avais juste fait un copier/coller du tien en y ajoutant la correction et détaillant les assignations de variables etc alors que tu pouvais directement faire :
$sth->execute(array('mois' => $dt->format("m")));
JJK801 a écrit :


$dt = new DateTime();
$query = &quot;SELECT * FROM `liste-legumes` WHERE mois=:mois&quot;;; 
$sth = $bdd-&gt;prepare($query);
$sth-&gt;execute(array('mois' =&gt; $dt-&gt;format(&quot;m&quot;)));
?&gt;
&lt;section class=&quot;ff-container&quot;&gt;
  &lt;ul class=&quot;ff-items&quot;&gt;
  &lt;?php
  // Recuperation des resultats
  while($row = $sth-&gt;fetch(PDO::FETCH_ASSOC))
  {
  ?&gt;
    &lt;li&gt;
      &lt;a href=&quot;fiche-legume.php?id_legumes=&lt;?php echo $row['id_legumes']; ?&gt;&quot;&gt;
        &lt;span&gt;&lt;?php echo $row['noms']; ?&gt;&lt;/span&gt;
	 &lt;img alt=&quot;&lt;?php echo $row['noms']; ?&gt;&quot; src=&quot;&lt;?php echo $row['image']; ?&gt;&quot; /&gt;
      &lt;/a&gt;
    &lt;/li&gt;
    &lt;?php
    }
    ?&gt;
  &lt;/ul&gt;
&lt;/section&gt;



La requête fonctionne très bien, quand dans ma colonne "mois", il n'y a qu'un chiffre.

Cependant, s'il y a plusieurs variable, dans ma colonne, plus rien ne s'affiche.

Est-ce une modification du "type" de ma colonne à changé ou bien une manière de rédiger dans la colonne.
Actuellement, les chiffres étaient écrit de cette manière : 1, 2, 3, 4 etc..


OU alors faut-il apporter une précision dans la requête ?
Modifié par dafid5 (19 Oct 2012 - 08:54)
dafid5 a écrit :
La requête fonctionne très bien, quand dans ma colonne &quot;mois&quot;, il n'y a qu'un chiffre.

Cependant, s'il y a plusieurs variable, dans ma colonne, plus rien ne s'affiche.

Est-ce une modification du &quot;type&quot; de ma colonne à changé ou bien une manière de rédiger dans la colonne.
Actuellement, les chiffres étaient écrit de cette manière : 1, 2, 3, 4 etc..


OU alors faut-il apporter une précision dans la requête ?


c'est normal, la requête recherche une égalité parfaite, pour une approximation il faut utiliser LIKE, ce qui donne:


SELECT * FROM `liste-legumes` WHERE mois LIKE :mois


et lors de l'execution:


$sth->execute(array('mois' => '%'  . $dt->format("m") . '%'));


le % dans un clause LIKE signifie "un ou plusieurs caractères de n'importe quel type"

tu va donc avoir un problème vu que si tu recherche février par exemple, il va considérer que décembre correspond aussi , car il y a un 2, la solution est de stocker les noms de mois sur 2 chiffres: 01,02,03,04,05,...
JJK801 a écrit :


SELECT * FROM `liste-legumes` WHERE mois LIKE :mois


$sth-&gt;execute(array('mois' =&gt; '%'  . $dt-&gt;format(&quot;m&quot;) . '%'));


le % dans un clause LIKE signifie &quot;un ou plusieurs caractères de n'importe quel type&quot;

tu va donc avoir un problème vu que si tu recherche février par exemple, il va considérer que décembre correspond aussi , car il y a un 2, la solution est de stocker les noms de mois sur 2 chiffres: 01,02,03,04,05,...


Parfais !
Tout fonctionne super bien !
je retiens donc like à la place du = ainsi que les %

Merci
Apoooo a écrit :

$sth-&gt;execute(array('mois' =&gt; $dt-&gt;format(&quot;m&quot;)));


merci Apooo pour ton aide

Sujet résolu
Modifié par dafid5 (19 Oct 2012 - 19:52)