Page 1 sur 1

Trier des resultats par le nom de la colonne du tableau ...

Posté : 22 sept. 2008, 10:20
par Jackisback
Bonjour,

J'ai une page sur mon site qui me permet "Si connectez en ADMIN" de visualisez tous les articles dispo dans ma BDD ...

Cette page m'affiche tout mes résultats sous forme de tableau avec plusieurs colonnes, "titres", "date", "contenu", "pseudo", etc ...

J'aimerais pouvoir ajouter un petit bout de code qui me permettrait de trier les donnees de mon tableau par "titres" ou par "pseudo", bref suivant les noms des differentes colonnes ...

Voici le code de ma page pour LISTER LES ARTICLES:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
       <title>Liste des articles</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<link href="../admin.css" rel="stylesheet" type="text/css" />

	</head>
    
    <body>
 
<h2><a href="../rediger_article.php">Ajouter un article ou une news</a></h2>
<h4><?php echo 'ATTENTION, TOUTE SUPPRESSION SERA DEFINITIVE !!!' ?></h4>
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("xxx");
//-----------------------------------------------------
// Vérification 1 : est-ce qu'on veut poster une news ?
//-----------------------------------------------------
if (isset($_POST['up_titre_article']) AND isset($_POST['up_description']))
{
    $titre = addslashes($_POST['up_titre_article']);
    $description = addslashes($_POST['up_description']);
	$up_modif = addslashes($_POST['up_modif']);
    // On vérifie si c'est une modification de news ou pas
    if ($_POST['up_id'] == 0)
    {
        // Ce n'est pas une modification, on crée une nouvelle entrée dans la table
        
		$sql = "INSERT INTO upload_fichier(	up_id, 								
							inscr_pseudo,
							up_filename,
							up_filesize,							
							up_titre_article, 
							up_rubrique,
							up_description,
							up_finalname,
							up_filedate,
							up_lien,
							up_modif)

		VALUES(	'',
				'".$_POST['inscr_pseudo']."',
				'',
				'',
				'".$_POST['up_titre_article']."',
				'".$_POST['up_rubrique']."',
				'".$_POST['up_description']."',
				'',
				'".$_POST['up_filedate']."'
				''
				'".$_POST['up_modif']."'
				)"; 				
				
				mysql_query("INSERT INTO upload_fichier VALUES('', '".$inscr_pseudo."', '".$titre."', '".$up_rubrique."', '".$description."', '".$timestamp."', '".$up_modif."' )") or die(mysql_error());
	
//		mysql_query("INSERT INTO articles VALUES('', '" . $titre . "', '" . $contenu . "', '" . time() . "')");
    }
    else
    {
        // On protège la variable "id_news" pour éviter une faille SQL
        $_POST['up_id'] = addslashes($_POST['up_id']);
        // C'est une modification, on met juste à jour le titre et le contenu
        mysql_query("UPDATE upload_fichier SET up_titre_article='" . $titre . "', up_description='" . $description . "' WHERE up_id='" . $_POST['up_id'] . "'");
    }
}
 
//--------------------------------------------------------
// Vérification 2 : est-ce qu'on veut supprimer une news ?
//--------------------------------------------------------
if (isset($_GET['supprimer_article'])) // Si on demande de supprimer une news
{
    // Alors on supprime la news correspondante
    // On protège la variable "id" pour éviter une faille SQL
    $_GET['supprimer_article'] = addslashes($_GET['supprimer_article']);
    mysql_query('DELETE FROM upload_fichier WHERE up_id=\'' . $_GET['supprimer_article'] . '\'');
}
?>
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th>Titres</th>
<th>Posté par</th>
<th>Date de publication</th>
<th>Dernière modification</th>
</tr>
<?php
$retour = mysql_query('SELECT * FROM upload_fichier ORDER BY up_id DESC');
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les news
{
?>
<tr>
<td><?php echo '<a href="/modifier_article.php?modifier_article=' . $donnees['up_id'] . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="/liste_article.php?supprimer_article=' . $donnees['up_id'] . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees['up_titre_article']); ?></td>
<td><?php echo stripslashes($donnees['inscr_pseudo']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_filedate']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_modif']); ?></td>
</tr>
<?php
} // Fin de la boucle qui liste les news
?>
</table>
</body>
</html>

Voilà si quelqu'un sait comment procéder ....

Je vous remercie tous d'avance pour votre aide.

Posté : 22 sept. 2008, 10:39
par guilt92
Bonjour,

Une méthode pourrait être la suivante :

Sur le titre de tes colonnes tu mets un lien qui point vers cette meme page, avec un parametre.

Exemple :
<a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=pseudo">pseudo</a>
Ensuite dans ta page, avant ta requête, tu regardes si une valeur de tri existe, et en fonction de cela tu fais un order by...
$tri = "";
if(!empty($_GET["tri"])) $tri = "ORDER BY ".$_GET["tri"];
$requete = "SELECT.....".$tri;
Ainsi, si $tri est défini tu auras un ORDER BY à la fin de la requete.

Bon la c'est une idée vite fait, mais en soi il faudra peut etre etre plus restrictif au niveau de la sécurité, faire par exemple un switch avec des valeurs 1, 2 ou 3 pour les tri par exemple plutot que de passer le nom de la colonne dans l'URL mais c'est déjà une piste je pense....

Posté : 22 sept. 2008, 10:42
par Jackisback
Déjà merci beaucoup pour la rapidité de ta réponse ...

Ensuite, je vais "essayer" de creuser tout ça car je suis pas très fort encore en php ...

Mais en tout cas merci.

---------------

EDIT:

Alors, pour les
<a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=pseudo">pseudo</a>
, c'est bon je l'ai mis en place, aucuns soucis ...

Par contre pour ce morceau là, c'est pas gagné:
$tri = "";
if(!empty($_GET["tri"])) $tri = "ORDER BY ".$_GET["tri"];
$requete = "SELECT.....".$tri; 
Je dois mettre ces lignes juste avant celles-ci ?:
<?php
$retour = mysql_query('SELECT * FROM upload_fichier ORDER BY up_id DESC');
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les news
{
?> 
Donc ça donnerait un bout de code comme ça:
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_titre_article">Titres</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=inscr_pseudo">Posté par</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_filedate">Date de publication</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_modif">Dernière modification</a></th>
</tr>
<?php
$tri = "";
if(!empty($_GET["tri"])) $tri = "ORDER BY ".$_GET["tri"];
$requete = "SELECT * FROM upload_fichier".$tri; 

$retour = mysql_query('SELECT * FROM upload_fichier ORDER BY up_id DESC');
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les news
{
?>
<tr>
<td><?php echo '<a href="../Admin/modifier_article.php?modifier_article=' . $donnees['up_id'] . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="../Admin/liste_article.php?supprimer_article=' . $donnees['up_id'] . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees['up_titre_article']); ?></td>
<td><?php echo stripslashes($donnees['inscr_pseudo']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_filedate']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_modif']); ?></td>
</tr>
<?php
} // Fin de la boucle qui liste les news
?>
Par contre je ne sais pas quoi mettre après SELECT ...

Désolé de mon ignorance ...

Posté : 22 sept. 2008, 11:37
par Jackisback
J'ai essayé de modifier le code comme ça mais ce n'est pas mieux:
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_titre_article">Titres</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=inscr_pseudo">Posté par</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_filedate">Date de publication</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_modif">Dernière modification</a></th>
</tr>
<?php
$tri = "";
if(!empty($_GET["tri"])) $tri = "ORDER BY ".$_GET["tri"];

$retour = mysql_query('SELECT * FROM upload_fichier ORDER BY ".$tri." DESC');
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les news
{
?>
<tr>
<td><?php echo '<a href="../Admin/modifier_article.php?modifier_article=' . $donnees['up_id'] . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="../Admin/liste_article.php?supprimer_article=' . $donnees['up_id'] . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees['up_titre_article']); ?></td>
<td><?php echo stripslashes($donnees['inscr_pseudo']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_filedate']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_modif']); ?></td>
</tr>
<?php
} // Fin de la boucle qui liste les news
?>
Suis-je sur la bonne piste ???

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 22 sept. 2008, 12:07
par guilt92
Plus ou moins ...

Disons que la il y a un probleme : si tu affiches ta requete ca va donner :

Code : Tout sélectionner

'SELECT * FROM upload_fichier ORDER BY ORDER BY pseudo DESC'
(si $_GET["tri"] vaut "pseudo")

Disons que si tu veux un tri par défaut il vaut mieux faire
$tri = "ORDER BY up_id DESC"; 
if(!empty($_GET["tri"])) $tri = "ORDER BY ".$_GET["tri"]." DESC"; 
$requete = "SELECT * FROM upload_fichier".$tri; 
Ainsi : Si $_GET["tri"] n'existe pas, la requete sera

Code : Tout sélectionner

SELECT * FROM upload_fichier ORDER BY up_id DESC
si tri existe :

Code : Tout sélectionner

SELECT * FROM upload_fichier ORDER BY pseudo DESC
(si tri vaut pseudo)

Tu peux aussi ne pas mettre le ORDER BY dans la variable $tri et le laisser dans la requête...

Attention tout de même si tu appliques cette méthode sans blinder les valeurs possibles de $tri.
En effet, si quelqu'un modifie dans l'url et remplace ?tri=pseudo par ?tri=azerty ta requete va essayer de trouver une colonne azerty et va planter...

Utilise toujours un or die(mysql_error()) apres un mysql_query() d'une part :
mysql_query("SELECT.....") or die(mysql_error());
Sinon si uniquement quelques colonnes doivent être triable tu peux faire par exemple:
$tri = "";
if(isset($_GET["tri"])) $tri = $_GET["tri"];
switch($tri)
  {
  case "pseudo": $requete_tri = "ORDER BY pseudo ASC"; break;
  case "cequetuveux": $requete_tri = "ORDER BY cequetuveux ASC"; break;
  default: $requete_tri = "ORDER BY id DESC";
  }
$requete = "SELECT * FROM ma_table ".$requete_tri;

Posté : 22 sept. 2008, 12:29
par Jackisback
Oui je voudrais qu'il n'y ai que quelque colonne de triable ... si ça ne suffit pas je verrai ensuite pour en rajouter ...

--------------

EDIT:

J'ai eu de l'aide par une autre personne sur un autre site et voilà le script qui fonctionne très bien :
<table><tr>
<th>Modifier</th>
<th>Supprimer</th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_titre_article">Titres</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=inscr_pseudo">Posté par</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_filedate">Date de publication</a></th>
<th><a href="<?php echo $_SERVER["PHP_SELF"];?>?tri=up_modif">Dernière modification</a></th>
</tr>
<?php
$tri = 'ORDER BY up_id DESC';
if(!empty($_GET['tri']))
  $tri = 'ORDER BY '.$_GET['tri'].' DESC';

$retour = mysql_query('SELECT * FROM upload_fichier ' . $tri) or die(mysql_error());
while ($donnees = mysql_fetch_assoc($retour)) // On fait une boucle pour lister les news
{
?>
<tr>
<td><?php echo '<a href="../Admin/modifier_article.php?modifier_article=' . $donnees['up_id'] . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="../Admin/liste_article.php?supprimer_article=' . $donnees['up_id'] . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees['up_titre_article']); ?></td>
<td><?php echo stripslashes($donnees['inscr_pseudo']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_filedate']); ?></td>
<td><?php echo date('d/m/Y - H\hi', $donnees['up_modif']); ?></td>
</tr>
<?php
} // Fin de la boucle qui liste les news
?>
Autant que tout le monde en profite ...

Merci encore à tous le monde ....

Posté : 22 sept. 2008, 15:11
par Berzemus
Mise à part les brèches flagrantes de sécurité, autant pour le serveur que pour le visiteur et l'illisibilité générale du fait du mélange constant entre php et html, je doute que quiconque puisse véritablement en profiter.

Tout d'abord, comme on le dit à gauche, à droite, et en plusieurs langues, la variable $_SERVER["PHP_SELF"] est sensible aux attaques XSS (
une source).

De deux, récupérer une variable et sans même l'épurer l'utiliser dans une requête SQL, c'est mettre ta base de données entre les mains du premier arrivé. Et mets un mot de passe à ton root. Certes, tu développes peut-être en local, mais il s'agit d'habitudes à prendre si tu comptes t'y mettre sérieusement.

Et pour la lisibilité, n'hésite pas à séparer ton code de ton html, le tout n'en sera que plus lisible.

Bonne suite :wink:

Posté : 22 sept. 2008, 15:17
par Jackisback
Tu m'as l'air bien calé dans ce domaine ....

Moi je ne suis qu'au balbutiement d'une carrière INTERNATIONALE !!!!

Enfin bon là je rêve ...

Que me conseillerais-tu pour accroitre la securité de mes pages ...

Est-ce que je peux faire un php include ..... d'une page integrant tout plein de script de securite ou est-ce que je dois taper les scripts sur chacunes de mes pages ???

D'avance merci ...

Posté : 22 sept. 2008, 16:22
par Berzemus
Tu m'as l'air bien calé dans ce domaine
Tu peux être sur que tout ceux qui ont un petit label "viphp" sont des professionnels du php, du développement internet. Beaucoup d'autres membres le sont aussi. Et je ne suis pas le plus calé...

phpFrance s'adresse aux utilisateurs avancés et débutants de php, et des autres langages qui gravitent autour (sans faire du php-centrisme). Du coup, pour pas mal d'entre nous, c'est tout simplement notre métier.

Posté : 22 sept. 2008, 16:58
par Jackisback
Ca va alors je suis tranquille ... je suis sur de trouver une solution à tout mes problèmes ici ...

Euh sinon que penses-tu de ma question précédente ???

Bye et merci