Tri Sql en fonction d'un clic sur un lien

Eléphanteau du PHP | 13 Messages

30 août 2010, 14:56

Bonjour,


Je suis débutant en PHP je flanche sur ce problème depuis maintenant quelques jours. c'est l'obstacle ultime, la dernière ligne droite avant que mon site soit terminé :D

1 J'ai mon fichier "produit.class.php" qui contient toutes les fonctions dont j'ai besoin.
2 Sur la page news_Big.php j'appelle la fonction dispNewBig qui me liste toutes mes news (une news = un dossier contenant fichier, images... pour l'instant je n'affiche qu'une image)
Ce que j'aimerais faire c'est que quand on clique sur une news on soit redirigé vers la page:
3 details.php qui appelle la fonction dispSoldatBig. J'aimerais que cette fonction affiche le contenu relatif au lien qui viens d'être cliqué, cela ce passe au niveau du tri de la fonction

SELECT * FROM produit WHERE nom_reel=" $relativeaNewsBig " ORDER by date DESC';

$relativeaNewsBig est juste un exemple une éventuelle variable qui devrait être définie au préalable dans la fonction dispNewsBig(?).


Je précise que ma page contenant les class est en php objet. Ci dessous je n'affiche que les deux fonctions et non tout le code de ma page.




<?php
//fonction qui affiche les news (une news = un dossier contenant fichier, images...)
public function dispNewBig()
{	

    // se connecte a la base de donné
	$this->connectDB();
    // Selectionne tous les champs de la table produit par ordre décroissant
	$sql = 'SELECT * FROM produit ORDER by date DESC';
	$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    // Liste toute la table
	while ($data = mysql_fetch_array($req))
	{
   //mise en page d'une news dans laquelle se trouve le fameux lien
	?>	
    			
		    	<div id="news_case">
                	<div id="prev_transparent"> <a href="#parent2-<? echo $prev; ?>"> <img src="images/transparent.png" width="30" height="159" /> </a> </div>
                	<div class="H2" id="txt_case"></div>
                	<div id="new_degrade_top"></div>
                 	<!-- affiche image_small vers un lien pas encore défini//-->
    			<a href"details.php"><img src="produit/<? echo $data[2]; ?>/images/image_small.jpg" alt="" width="253" height="158" /></a>
    			</div>
	<?
	}
	}
	$this->disconnectDB();
}

// cette fonction affiche le contenu relatif au lien suivi depuis dispNewsBig
public function dispSoldatBig()
{	
	//connexion à la BDD
	$this->connectDB();

	// ici je dois séléctionner le champ relatif à dispNewBig. le "$relativeaNewsBig" sera en fait le champ de la colonne nom_reel 
	$sql = 'SELECT * FROM produit WHERE nom_reel=" $relativeaNewsBig " ORDER by date DESC';
	$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
	// Le while n'es pas vraiment utile ici vu qu'il ny à jamais plus d'un champ séléctionné (je viens de le remarquer)
	while ($data = mysql_fetch_array($req))
	{
	//Tout ce code n'est pas important pour résoudre mon problème
	$folder = "produit/"$relativeaNewsBig"/ref";
	$dossier = opendir($folder);
	$nbCases = 0;
	$next = 1;
	$prev = -1;
	$nbfichiertotal = 0;
	
 	while ($Fichier = readdir($dossier)) {
  	if ($Fichier != "." && $Fichier != "..") {
    $nomFichier = $folder."/".$Fichier;
	$nbCases ++ ;
		if($nbCases == 1 || $nbCases == 8 || $nbCases == 15 || $nbCases == 22 ){
			$prev ++;
			?><li> <div id="soldat_case_left"><div id="soldat_prev_transparent"><? echo $this->myvar ; ?><a href="#parent2-<? echo $prev; ?>"><img src="images/transparent.png" width="40" height="159" /></a></a></div><img src="<? echo $nomFichier; ?>"></div> <? "<BR />";
		}else{
			if($nbCases == 7 || $nbCases == 14 || $nbCases == 21 || $nbCases == 28){
			$next ++;
			?><div id="soldat_case"><div id="soldat_next_transparent"><a href="#parent2-<? echo $next; ?>"><img src="images/transparent.png" width="40" height="159" /></a></a></div><img src="<? echo $nomFichier; ?>"></div></li><? "<BR />";
			}else{
			?><div id="soldat_case"><img src="<? echo $nomFichier; ?>"></div> <? "<BR />";
			}
		}
		
    }
	}
	closedir($dossier); 
	}
	$this->disconnectDB();
}
?>


Voilà pour la petite histoire.
Je vous remercie d'avance.

Mammouth du PHP | 19672 Messages

30 août 2010, 19:50

Salut,
on ne peut pas mettre de balise de fermeture de code PHP à l'intérieur d'une classe ( ?> )
Plus généralement, on n'affiche aucun code HTML non plus : on traite des données, on alimente des variables qu'on retourne avec un contenu, mais l'affichage doit être géré ailleur que dans la classe elle-même. Donc par exemple, prenons ta méthode dispNewBig() (attention, dans une classe, on ne parle pas de fonctions mais de méthodes), il faudrait remplacer ceci :
//fonction qui affiche les news (une news = un dossier contenant fichier, images...)
public function dispNewBig()
{      

    // se connecte a la base de donné
        $this->connectDB();
    // Selectionne tous les champs de la table produit par ordre décroissant
        $sql = 'SELECT * FROM produit ORDER by date DESC';
        $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    // Liste toute la table
        while ($data = mysql_fetch_array($req))
        {
   //mise en page d'une news dans laquelle se trouve le fameux lien
        ?>     
                       
                        <div id="news_case">
                        <div id="prev_transparent"> <a href="#parent2-<? echo $prev; ?>"> <img src="images/transparent.png" width="30" height="159" /> </a> </div>
                        <div class="H2" id="txt_case"></div>
                        <div id="new_degrade_top"></div>
                        <!-- affiche image_small vers un lien pas encore défini//-->
                        <a href"details.php"><img src="produit/<? echo $data[2]; ?>/images/image_small.jpg" alt="" width="253" height="158" /></a>
                        </div>
        <?
        }
        }
        $this->disconnectDB();
}
Par ceci :
<?php
//....
    /**
     * Méthode qui construit les news (une news = un dossier contenant fichier, images...)
     * et les retourne en vue d'un affichage.
     *
     * @return String
     */
    public function dispNewBig()
    {

        // se connecte a la base de donné
        $this->connectDB();
        // Selectionne tous les champs de la table produit par ordre décroissant
        $sql = 'SELECT * FROM produit ORDER by date DESC';
        $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
        $blocNews = '';
        // Liste toute la table
        while ($data = mysql_fetch_array($req))
        {
            //mise en page d'une news dans laquelle se trouve le fameux lien
            $blocNews .= <<<CODE_HTML
                        <div id="news_case">
                          <div id="prev_transparent">
                            <a href="#parent2-{$prev}"> <img src="images/transparent.png" width="30" height="159" /> </a> 
                          </div>
                          <div class="H2" id="txt_case"></div>
                          <div id="new_degrade_top"></div>
                          <!-- affiche image_small vers un lien pas encore défini//-->
                          <a href"details.php"><img src="produit/{$data[2]}/images/image_small.jpg" alt="" width="253" height="158" /></a>
                        </div>
            
CODE_HTML;
        }
        $this->disconnectDB();
        return $blocNews;
    }
Corrige le reste de ton code et refais l'essai, tu devrais avoir moins de problèmes ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

31 août 2010, 02:07

@Cyrano
Tiens au passage je connaissais pas cette syntaxe <<<CODE_HTML...
Mis à part le fait que ce soit plus lisible et facile à formater, cela permet-il d'éviter l'emploi des htmlspecialchars et consorts pour la protection de l'affichage des variables ?

ViPHP
ViPHP | 5462 Messages

31 août 2010, 03:02

@Cyrano
Tiens au passage je connaissais pas cette syntaxe <<<CODE_HTML...
Mis à part le fait que ce soit plus lisible et facile à formater, cela permet-il d'éviter l'emploi des htmlspecialchars et consorts pour la protection de l'affichage des variables ?
non, ça agis comme les doubles guillemets, y'a juste pas besoin d’échapper les caractères
CODE_HTML c'est arbitraire tu peux mettre ce que tu veux comme nom, par contre la balise fermant dois être obligatoirement après une nouvelle ligne (si y'a espace ou tabulation c'est foutu)

t'as une autre syntax :
<<<'CODE_HTML'
qui fit le même effet que les guillemets simple

http://www.php.net/manual/fr/language.t ... ax.heredoc (heredoc, newdoc)

Mammouth du PHP | 19672 Messages

31 août 2010, 06:53

Voilà, je n'ai besoin de rien échapper du tout et je ne préoccupe plus du tout d'alterner des guillemets et des apostrophes : j'insère des variables entre accolades, point final. je ne peux pas y mettre de fonctions ni de constantes, mais c'est un moindre soucis en comparaison aux avantages énormes de cette syntaxe, enfin de mon point de vue.

Mais comme l'a souligné stealth, le mot clé de fermeture doit impérativement être en début de ligne sans espace et être suivi d'un point virgule et d'un retour chariot.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: