8791 sujets

Développement web côté serveur, CMS

Bonsoir à toutes et à tous,

J'ai à l'aide de super internaute sur le forum réussi à rédiger ce code php qui fonctionne à un détail près les accents !! puis mon côté perfectionniste m'a poussé à vouloir modifier l'apparence de l'url (remplacement le l'espace %20 par un tiret)

petite vision du code


<?php 

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

// Connexion au serveur
$con=mysql_connect($host,$user,$passwd) or die("erreur de connexion au serveur");

$bdd = mysql_select_db("eat-to-season", $con) or die("erreur de connexion a la base de donnees");

$id=$_GET['id_legumes'];

// Creation et envoi de la requete
$res = mysql_query("SELECT * FROM `liste-legumes` WHERE id_legumes='".$id."' ") or die(mysql_error());

while($rows = mysql_fetch_array($res)){
         // Tu génères ta page avec les données.
		 
// Deconnexion de la base de donnees
?>	

			<h2 class="ribbon"><span>Tout sur <?php echo $rows['particule'] ?> 
<?php	if (isset($rows['noms']))
	{
	echo $rows['noms']."</span></h2>";
	}
	else // Il manque des paramètres, on avertit le visiteur
	{
		echo "Ce légume n\'éxiste pas!";
	}
?>


on m'a donc conseillé d'utilisé SET NAMES utf8 mais avec PDO
J'ai donc ce résultat, mais qui ne marches plus !!! (plus d'affichage de donnée de ma base sql)


<?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());
}

$id=$_GET['id_legumes'];

// Creation et envoi de la requete
$query = "SELECT * FROM `liste-legumes` WHERE id_legumes='".$id."'";
$query = preg_replace('/([^a-z0-9]+)/i', '-', strtolower($id));

// Deconnexion de la base de donnees
?>
		  <?php
		  // Recuperation des resultats
		  foreach($bdd->query($query) as $row)
		  {
		  ?>
			<h2 class="ribbon"><span>Tout sur <?php echo $row['particule'] ?> 
<?php if (isset($row['noms']))
	{
	echo $row['noms']."</span></h2>";
	}
	else // Il manque des paramètres, on avertit le visiteur
	{
		echo "Ce légume n\'éxiste pas!";
	}
?>


auriez-vous une ideé de mon problème ?
Modifié par dafid5 (07 Oct 2012 - 21:16)


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);
}



ça t'affichera les erreurs PDO en warning Smiley cligne
Modifié par JJK801 (07 Oct 2012 - 22:40)
JJK801 a écrit :
ça t'affichera les erreurs PDO en warning Smiley cligne


merci effectivement ça m'affiche 2 erreurs

une dans ma syntaxe php --> PDO->query( )


<?php
		  // Recuperation des resultats
		  foreach($bdd->query($query) as $row)
		  {
		  ?>


et la seconde sur une de mes mise en forme css nommé "main"
Y a t-il une fonction php main ou bien est-ce autre chose ?

// Creation et envoi de la requete
$query = "SELECT * FROM `liste-legumes` WHERE id_legumes='".$id."'";
$query = preg_replace('/([^a-z0-9]+)/i', '-', strtolower($id));


Alors soit je comprend pas la structure de ta base, soit elle n'est pas bonne.

Tu fais une recherche selon un ID, donc normalement un chiffre (tu pourrais y mettre un nom mais ce n'est pas le mieux à faire..). Comment peux-tu avoir un espace dans un chiffre ?

Ensuite, la portion de code au dessus n'est pas logique, tu mets dans $query une requete, jusque là c'est bon. Ensuite, dans cette même variable, tu changes son contenu (qui contenait une requete au format texte) par l'ID simple de ton legume (avec certes peut-être des tirets...).

Donc quand tu demandes à PDO de te faire un $bdd->query(3), ce n'est pas une requete pour lui.
Modifié par Apoooo (08 Oct 2012 - 09:36)
dafid5 a écrit :
merci effectivement ça m'affiche 2 erreurs


Un copier collé est le bienvenu dans ce genre de cas Smiley smile

Apoooo a écrit :
Ensuite, la portion de code au dessus n'est pas logique, tu mets dans $query une requete, jusque là c'est bon. Ensuite, dans cette même variable, tu changes son contenu (qui contenait une requete au format texte) par l'ID simple de ton legume (avec certes peut-être des tirets...).

Donc quand tu demandes à PDO de te faire un $bdd-&gt;query(3), ce n'est pas une requete pour lui.


a mon avis, il voulait faire ça:



$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
foreach($result->fetch(PDO::FETCH_ASSOC) as $row)
{
  if (isset($row['noms']))
  {
?>
<h2 class="ribbon"><span>Tout sur <?php echo $row['particule'] . $row['noms']; ?></span></h2>
<?php
  }
  else // Il manque des paramètres, on avertit le visiteur
  {
    echo "Ce légume n'existe pas!";
  }
}
?>

Modifié par JJK801 (08 Oct 2012 - 10:21)
Apoooo a écrit :

// Creation et envoi de la requete
$query = &quot;SELECT * FROM `liste-legumes` WHERE id_legumes='&quot;.$id.&quot;'&quot;;
$query = preg_replace('/([^a-z0-9]+)/i', '-', strtolower($id));


Alors soit je comprend pas la structure de ta base, soit elle n'est pas bonne.

Tu fais une recherche selon un ID, donc normalement un chiffre (tu pourrais y mettre un nom mais ce n'est pas le mieux à faire..). Comment peux-tu avoir un espace dans un chiffre ?



Bonjour Apooo, alors pour le moment j'utilise un chiffre pour appeler une donnée, mais par la suite, j'aurai un nom avec un espace (voilà pourquoi j'ai prévu grâce à toi la requête avec preg_replace).
JJK801 a écrit :




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


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

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

// Recuperation des resultats
foreach($result-&gt;fetch(PDO::FETCH_ASSOC) as $row)
{
  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;;
  }
}
?&gt;


whaoou je sais pas si j'aurai réussi à faire ça, mais je pense que ce que tu as écrit correspond à une demande à mon serveur d'afficher l'id de ma donnée de ma base sql et s'il y a un espace, cela le convertit en tiret ?

ai-je bien saisi ton code ? (je re-précise, je suis plus que novice en php), mais j'ai de la chance de trouver de l'aide sur ce forum pour avancer.

Je vais tester ton code php pour te dire ce que j'obtiens !

merci JJK801.
JJK801 a écrit :

Un copier collé est le bienvenu dans ce genre de cas Smiley smile


voici ce que ça m'affiche avec la nouvelle version de code que tu me proposes :

a écrit :

Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\BIEN-MANGER-SELON-LES-SAISONS.com\produits-de-saison\fiche-legume.php on line 130
Call Stack
# Time Memory Function Location
1 0.0006 708472 {main}( ) ..\fiche-legume.php:0


la ligne 130 correspond à :

foreach($result->fetch(PDO::FETCH_ASSOC) as $row)


Je vous remontre le code dans son integralité

<div id="main">
<?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
foreach($result->fetch(PDO::FETCH_ASSOC) as $row)
{
  if (isset($row['noms']))
  {
?>
<h2 class="ribbon"><span>Tout sur <?php echo $row['particule'] . $row['noms']; ?></span></h2>
<?php
  }
  else // Il manque des paramètres, on avertit le visiteur
  {
    echo "Ce légume n'existe pas!";
  }
}
?>
</div>
Autant pour moi, je me suis trompé de variable dans le while

<div id="main">
<?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)
{
foreach($sth->fetch(PDO::FETCH_ASSOC) as $row)
{
  if (isset($row['noms']))
  {
?>
<h2 class="ribbon"><span>Tout sur <?php echo $row['particule'] . $row['noms']; ?></span></h2>
<?php
  }
  else // Il manque des paramètres, on avertit le visiteur
  {
    echo "Ce légume n'existe pas!";
  }
}
}
?>
</div>


a écrit :
whaoou je sais pas si j'aurai réussi à faire ça, mais je pense que ce que tu as écrit correspond à une demande à mon serveur d'afficher l'id de ma donnée de ma base sql et s'il y a un espace, cela le convertit en tiret ?


Non:


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


assigne à la variable $id la valeur de $_GET['id_legume'] en minuscule avec toutes les suites caratéres non alphanumériques remplacées par un tiret


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

$sth = $bdd->prepare($query); // preparation de la requête


prépare une requête via PDO en précisant que la valeur de id_legume sera passé en paramètre au moment de l’exécution avec la clé "id" (id_legume=:id)


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


la requête est exécuté avec les paramètres du tableau (ici le paramètre :id vaudra $id, créé précédement)


foreach($sth->fetch(PDO::FETCH_ASSOC) as $row)


on crée une boucle assignant à $row chaque ligne de résultat sous forme d'un tableau associatif ( clé = nom du champ, valeur = valeur du champ)
Modifié par JJK801 (08 Oct 2012 - 11:37)
jb_gfx a écrit :
Pourquoi un foreach sur une requête qui ne récupère qu'un seul enregistrement ?


Je sait pas vraiment si il y en a un ou plusieurs, l'identifiant peut servir à une jointure... pi au pire ça fera qu'un tour Smiley ohwell
Modifié par JJK801 (08 Oct 2012 - 15:30)
JJK801 a écrit :


Je sait pas vraiment si il y en a un ou plusieurs


Avec fetch() de toute manière tu n'auras qu'un enregistrement, si il y en avait plusieurs il aurait fallu un fetchAll().
jb_gfx a écrit :
Avec fetch() de toute manière tu n'auras qu'un enregistrement, si il y en avait plusieurs il aurait fallu un fetchAll().


En fait tu as a moitié raison Smiley langue le fetch est bon mais le foreach est a remplacer par un while Smiley cligne

(fetchAll balance tout le tableau d'un coups ce qui surcharge la mémoire, un while avec fetch te retourne les lignes une par une)


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


pas bon de faire plusieurs choses en même temps Smiley confused
Modifié par JJK801 (08 Oct 2012 - 16:53)
JJK801 a écrit :


En fait tu as a moitié raison Smiley langue le fetch est bon mais le foreach est a remplacer par un while Smiley cligne

(fetchAll balance tout le tableau d'un coups ce qui surcharge la mémoire, un while avec fetch te retourne les lignes une par une)


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;;
  }
}



avec while ça fonctionne bien !!! fetch m'envoyait plein d'infos bizarre (mélange de chiffre et lettre).

bon j'ai compris comment assigné une variable, et effectué une requete via PDO !!!


tout fonctionne parfaitement !!!

un grand merci pour la leçon.
dafid5 a écrit :

avec while ça fonctionne bien !!! fetch m'envoyait plein d'infos bizarre (mélange de chiffre et lettre).


C'est normal, le foreach prends un array comme argument et le parcours ligne par ligne, alors que le while relance la fonction a chaque tour, du coup, là ou le while récupére une nouvelle ligne de résultat a chaque tour, le foreach se contente de parcourir tous les champs de la 1 ligne.

dafid5 a écrit :

bon j'ai compris comment assigné une variable, et effectué une requete via PDO !!!


tout fonctionne parfaitement !!!

un grand merci pour la leçon.


N'hésite pas à te documenter afin de maîtriser au mieux tout ça, notamment en lisant les docs sur php.net ou autre.