Séléction aléatoire dans ma table en excluant un ID

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Séléction aléatoire dans ma table en excluant un ID

Re: Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 20 oct. 2015, 12:26

Rien qui ne s'affiche dans le code source, et au sujet de l echo on peut faire en sorte d'y inclure plusieurs blocs html tant que c'est entre ' et ' ?

Re: Séléction aléatoire dans ma table en excluant un ID

par Ryle » 20 oct. 2015, 09:38

Bonjour,

Tu as une accolade fermante en trop après le second while (à priori celle située juste avant le $reponse->closeCursor()).

Ce n'est pas évident quand on alterne code html et php, mais il faut essayer de bien indenter le code (décaler sur la droite quand on ouvre une accolade et décaler sur la gauche quand on le ferme). Lorsque le code est bien aligné, c'est plus facile de trouver ses erreurs :)

Quand tu as des petits blocs de html, il est parfois plus lisible de les générer avec un echo en php, plutôt que de fermer la balise php, ajouter le code html et rouvrir la balise php pour fermer l'accolade :
while($donnees=$res->fetch())
{
?>
<a href="<?php echo $donnees['Nom']  ?>">Une recette à base de fromage</a><br />
<?php } ?>
Revient au même que :
while($donnees=$res->fetch())
{
   echo '<a href="' . $donnees['Nom'] . '">Une recette à base de fromage</a><br />'; 
}
?>
, mais c'est à mon sens plus facile à lire et on voit bien où le while se termine :)

L'idéal étant naturellement de réussir à activer les messages d'erreurs, trouver le log etc.
Et si quand tu as une page blanche tu regardes le code source de la page, tu n'y trouve pas de message d'erreur non plus ?

Re: Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 19 oct. 2015, 19:28

J'ai essayé comme ceci (je ne sais pas si c'est ce que tu voulais me dire or 1) et toujours page blanche et je n'ai toujours pas accès au rapport de données des erreurs php :/
<!DOCTYPE html>

<html>

    <head>

        <meta charset="utf-8" />

        <link rel="stylesheet" href="page.css" />
		<link href='https://fonts.googleapis.com/css?family=Shadows+Into+Light' rel='stylesheet' type='text/css'>

        <title>Tuile au fromage</title>
		


    </head>


    <body>


        <div class="container_principal">
<?php include("entete.php"); ?>		
		
		
		<div class="recette" ><h2>Tuiles au fromage maison</h2><p id="recete"><img src="/joomla/images/tuileaufromage.png"  style="border: 10px solid rgba(117,61,4,1);"/></p><h3>Tuiles au fromage maison</h3></div>
		<p class="titre_ingredient"><span class="difficult">*</span><span class="no_difficult">*</span><span class="no_difficult">*</span>
		<b>Pour</b> 12 Tuiles - <b>Préparation</b> 10min -  <b>Cuisson</b> 5min</p>
		</p>
		<table border="0" cellpadding="20"class="contenu_recette"><tr><td><ul><li>250g de cantal vieux</li><li>1 càc de piment d'espelette</li><li>Du poivre</li></ul><br /><br />
		<b style="text-transform:uppercase">Râpez</b> le cantal et mélangez-le dans un bol avec le piment. Ajoutez quelques tours de moulin de poivre.
		</td><td><b style="text-transform: uppercase">Espacez</b> des cuillerées de fromage sur une toile de cuisson ou de papier sulfurisé étalée sur la plaque du four. Façonnez-les en  petits disques de 4-5cm avec le dos d'une cuillère et enfournez pour 4-5min dans le four chauffé sur th.6 (180°C)</td>
		<td><b style="text-transform: uppercase">Laissez refroidir</b> les tuiles, decollez-les du papier et servez.<br /><br />Astuce : vous pouvez les conserver hermétiquement au frais et les faire réchauffer vite fait avant de servir.</td></tr></table>
		
		
		
		<div class="autre_recette">
		<?php
try
{
	// On se connecte à MySQL
	$bdd = new PDO('mysql:host=localhost;dbname=Cuisine;charset=utf8', 'root', 'tm5MRFJP3ymeMQZS');
}
catch(Exception $e)
{
	// En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}

// Si tout va bien, on peut continuer

  $idDeLaRecetteEnCours = 1;

// On récupère tout le contenu de la table jeux_video
$sql = 'select * FROM Fromage 
  WHERE id != ' . $idDeLaRecetteEnCours . '
  ORDER BY RAND()
  LIMIT 1';
  
  $sqll = 'select * FROM Apéro
  WHERE id != ' . $idDeLaRecetteEnCours . '
  ORDER BY RAND()
  LIMIT 1';
  
  

$res = $bdd->query($sql);

$resp = $bdd->query($sqll);

while($donnees=$res->fetch())
{



?>
<a href="<?php echo $donnees['Nom']  ?>">Une recette à base de fromage</a><br />
<?php } ?>

<?php
while($donnees=$resp->fetch())
{
	?>


		<a href="<?php echo $donnees['Nom']  ?>">Un lien  apéritif</a>

		</div>
		<?php } ?>
		<?php include("piedpage.php"); ?>
		
		
		</div>
		</div>
		
		

		
		<?php
}

$reponse->closeCursor(); // Termine le traitement de la requête

?>
		
		</body>
		</html>

Re: Séléction aléatoire dans ma table en excluant un ID

par or 1 » 19 oct. 2015, 18:39

il y a bien un } pour fermer les while, mais comme ce } n'est pas vu comme du php mais comme de l'html, c'est comme si il n'y en avait pas pour php.

Re: Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 19 oct. 2015, 18:23

Justement j'ai un gros soucis avec ça j'utilise Joomla pour mon index et j'ai bien activer le display_error mais il ne semble pas fonctionne sur mes pages externes que je conçois malgré que ce fichier semble etre dans le repertoire de joomla donc je n'ai pas accès à ce fichier de log . Auriez vous une solution ?

Re: Séléction aléatoire dans ma table en excluant un ID

par @rthur » 19 oct. 2015, 18:10

Alors j'ai fait ça mais ma page s'affiche en blanc donc je suppose que je me suis trompé quelque part
On a un tuto pour lutter contre les pages blanches : faq-tutoriels/page-blanche-script-php-c ... 73178.html

Re: Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 19 oct. 2015, 17:54

Alors j'ai fait ça mais ma page s'affiche en blanc donc je suppose que je me suis trompé quelque part :
<!DOCTYPE html>

<html>

    <head>

        <meta charset="utf-8" />

        <link rel="stylesheet" href="page.css" />
		<link href='https://fonts.googleapis.com/css?family=Shadows+Into+Light' rel='stylesheet' type='text/css'>

        <title>Tuile au fromage</title>
		


    </head>


    <body>


        <div class="container_principal">
<?php include("entete.php"); ?>		
		
		
		<div class="recette" ><h2>Tuiles au fromage maison</h2><p id="recete"><img src="/joomla/images/tuileaufromage.png"  style="border: 10px solid rgba(117,61,4,1);"/></p><h3>Tuiles au fromage maison</h3></div>
		<p class="titre_ingredient"><span class="difficult">*</span><span class="no_difficult">*</span><span class="no_difficult">*</span>
		<b>Pour</b> 12 Tuiles - <b>Préparation</b> 10min -  <b>Cuisson</b> 5min</p>
		</p>
		<table border="0" cellpadding="20"class="contenu_recette"><tr><td><ul><li>250g de cantal vieux</li><li>1 càc de piment d'espelette</li><li>Du poivre</li></ul><br /><br />
		<b style="text-transform:uppercase">Râpez</b> le cantal et mélangez-le dans un bol avec le piment. Ajoutez quelques tours de moulin de poivre.
		</td><td><b style="text-transform: uppercase">Espacez</b> des cuillerées de fromage sur une toile de cuisson ou de papier sulfurisé étalée sur la plaque du four. Façonnez-les en  petits disques de 4-5cm avec le dos d'une cuillère et enfournez pour 4-5min dans le four chauffé sur th.6 (180°C)</td>
		<td><b style="text-transform: uppercase">Laissez refroidir</b> les tuiles, decollez-les du papier et servez.<br /><br />Astuce : vous pouvez les conserver hermétiquement au frais et les faire réchauffer vite fait avant de servir.</td></tr></table>
		
		
		
		<div class="autre_recette">
		<?php
try
{
	// On se connecte à MySQL
	$bdd = new PDO('mysql:host=localhost;dbname=Cuisine;charset=utf8', 'root', 'tm5MRFJP3ymeMQZS');
}
catch(Exception $e)
{
	// En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}

// Si tout va bien, on peut continuer

  $idDeLaRecetteEnCours = 1;

// On récupère tout le contenu de la table jeux_video
$sql = 'select * FROM Fromage 
  WHERE id != ' . $idDeLaRecetteEnCours . '
  ORDER BY RAND()
  LIMIT 1';
  
  $sqll = 'select * FROM Apéro
  WHERE id != ' . $idDeLaRecetteEnCours . '
  ORDER BY RAND()
  LIMIT 1';
  
  

$res = $bdd->query($sql);

$resp = $bdd->query($sqll);

while($donnees=$res->fetch())
{



?>
<a href="<?php echo $donnees['Nom']  ?>">Une recette à base de fromage</a><br />

}
<?php
while($donnees=$resp->fetch())
{
	?>


		<a href="<?php echo $donnees['Nom']  ?>">Un lien  apéritif</a>
}
		</div>
		<?php include("piedpage.php"); ?>
		
		
		</div>
		</div>
		
		

		
		<?php
}

$reponse->closeCursor(); // Termine le traitement de la requête

?>
		
		</body>
		</html>

Re: Séléction aléatoire dans ma table en excluant un ID

par or 1 » 19 oct. 2015, 17:34

oui

Re: Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 19 oct. 2015, 17:31

Donc pour ne pas que ca se chevauche je pourrais declarer $resp au lieu de $res ?

Re: Séléction aléatoire dans ma table en excluant un ID

par Ryle » 19 oct. 2015, 16:48

Tu peux utiliser un autre nom de variable si tu le souhaites, mais sinon ça n'est pas gênant de garder le même tant que les traitements ne se chevauchent pas. En effet, si tu mets une nouvelle valeur dans ta variable $donnees, celle-ci écrasera la précédente.

Du coup ceci ne posera pas de problème :
while($donnees=$res->fetch())
{ 
...
}
...
while($donnees=$res->fetch())
{ 
...
}
Alors que cela va perturber php, puisque tu remplaces le contenu de ta variable en plein milieu de la boucle
while($donnees=$res->fetch())
{ 
   while($donnees=$res->fetch())
   { 
   ...
   }
   ...
}

Re: Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 19 oct. 2015, 16:02

Ah oui mais dans ce cas si je dois utiliser deux fois $donnees pour deux tables differente afin de generer 2 liens differents comment dois-je procéder ?

Re: Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 19 oct. 2015, 15:54

Oh merci c'est parfait, je te remercie beaucoup :)

Re: Séléction aléatoire dans ma table en excluant un ID

par Ryle » 19 oct. 2015, 15:31

Il y a un petit soucis dans ton code actuel, car il faut que les ids en base se suivent nécessairement. Cela t'oblige à n'avoir aucune suppression dans ta base de données au risque d'avoir un nombre d'enregistrement qui ne correspond pas aux valeurs des id en base.

Le plus simple est de demander à ta base de données MySQL de te retourner un enregistrement au hasard. A partir de là, tu pourras compléter la requête pour en spécifier les conditions d'exécution
$sql = 'select * FROM Fromage 
  WHERE id != ' . $idDeLaRecetteEnCours . '
  ORDER BY RAND()
  LIMIT 1';
$res = $bdd->query($sql);

while($donnees=$res->fetch())
{ ...
Cette requête va chercher les enregistrements dont l'id sont différents de $idDeLaRecetteEnCours (à adapter), dans un ordre aléatoire (ORDER BY RAND()) et ne retourner que le premier enregistrement (LIMIT 1)

Séléction aléatoire dans ma table en excluant un ID

par Seusyn » 19 oct. 2015, 15:08

Bonjour,

je viens vers vous car je ne sais pas faire ça, je voudrais déjà un tirage aleatoire dans ma table (ça je sais faire) mais en excluant un seul ID de cette même table car cette table me permet d'afficher des liens de page et je voudrais pas que ca redirige sur la même page que l'on est déjà dessus.
<!DOCTYPE html>

<html>

    <head>

        <meta charset="utf-8" />

        <link rel="stylesheet" href="page.css" />
		<link href='https://fonts.googleapis.com/css?family=Shadows+Into+Light' rel='stylesheet' type='text/css'>

        <title>Tuile au fromage</title>
		


    </head>


    <body>


        <div class="container_principal">
<?php include("entete.php"); ?>		
		
		
		<div class="recette" ><h2>Tuiles au fromage maison</h2><p id="recete"><img src="/joomla/images/tuileaufromage.png"  style="border: 10px solid rgba(117,61,4,1);"/></p><h3>Tuiles au fromage maison</h3></div>
		<p class="titre_ingredient"><span class="difficult">*</span><span class="no_difficult">*</span><span class="no_difficult">*</span>
		<b>Pour</b> 12 Tuiles - <b>Préparation</b> 10min -  <b>Cuisson</b> 5min</p>
		</p>
		<table border="0" cellpadding="20"class="contenu_recette"><tr><td><ul><li>250g de cantal vieux</li><li>1 càc de piment d'espelette</li><li>Du poivre</li></ul><br /><br />
		<b style="text-transform:uppercase">Râpez</b> le cantal et mélangez-le dans un bol avec le piment. Ajoutez quelques tours de moulin de poivre.
		</td><td><b style="text-transform: uppercase">Espacez</b> des cuillerées de fromage sur une toile de cuisson ou de papier sulfurisé étalée sur la plaque du four. Façonnez-les en  petits disques de 4-5cm avec le dos d'une cuillère et enfournez pour 4-5min dans le four chauffé sur th.6 (180°C)</td>
		<td><b style="text-transform: uppercase">Laissez refroidir</b> les tuiles, decollez-les du papier et servez.<br /><br />Astuce : vous pouvez les conserver hermétiquement au frais et les faire réchauffer vite fait avant de servir.</td></tr></table>
		
		
		
		<div class="autre_recette">
		<?php
try
{
	// On se connecte à MySQL
	$bdd = new PDO('mysql:host=localhost;dbname=Cuisine;charset=utf8', 'root', '**********');
}
catch(Exception $e)
{
	// En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}

// Si tout va bien, on peut continuer



// On récupère tout le contenu de la table jeux_video
$total_Recette = $bdd->query('select COUNT(id) as total from Fromage');
$total_Recette = $total_Recette->fetch();
$total_Recette = $total_Recette['total'];

$nbrIdRecette= rand(1, $total_Recette);
$res = $bdd->query("SELECT * FROM Fromage WHERE id = $nbrIdRecette");



while($donnees=$res->fetch())
{



?>
<a href="<?php echo $donnees['Nom']  ?>">Une recette à base de fromage</a><br />


		<a href="#">Un lien  apéritif</a>
		</div>
		<?php include("piedpage.php"); ?>
		
		
		</div>
		</div>
		
		

		
		<?php
}

$reponse->closeCursor(); // Termine le traitement de la requête

?>
		
		</body>
		</html>



Merci d'avance.