Page 1 sur 2

déclarer et exploiter une variable pour trier les résultats

Posté : 07 févr. 2014, 12:24
par stofkri
bonjour, j’essaie de mettre en place une galerie d’images en php
j’utilise jquery data load while scrolling, les images s’affichant selon la position de la page + un lien "afficher plus »

je place la requête sql en tête de page :
<?php
include('config.php');
$page = (int) (!isset($_GET['p'])) ? 1 : $_GET['p'];
# sql query
$sql = "SELECT * FROM travaux ORDER BY id DESC";
# find out query stat point
$start = ($page * $limit) - $limit;
# query for page navigation
if( mysql_num_rows(mysql_query($sql)) > ($page * $limit) ){
$next = ++$page;
}
$query = mysql_query( $sql . " LIMIT {$start}, {$limit}");
if (mysql_num_rows($query) < 1) {
header('HTTP/1.0 404 Not Found');
echo 'Page not found!';
exit();
}
?>

là le code html
<div class="fafa">
<!-- loop row data -->
<?php while ($row = mysql_fetch_array($query)): ?>
<div class="galerie" id="galerie-<?php echo $row['id']?>">  
    <div class="info">
      <div class="inner" style="background-color:#00BBFF">
     <h1><?php echo $row["titre_galerie"]; ?></h1>
     <p><?php echo $row["commentaire"]; ?></p>
     <div class="boutonn">
   <a class="visit" href="galerie.php?id=<?php echo $row ['id']; ?>">voir la galerie</a>
    </div>
      </div>
    </div>  
     <div class="lol">
      <div class="inner">
     <img src="<?php echo $row["585x390"]; ?>" class="" />
      </div>
    </div>    
</div> <!-- galerie -->  
<?php endwhile?>
<!--page navigation-->
<?php if (isset($next)): ?>
<div class="nav">
<a href='travaux.php?p=<?php echo $next?>'>Next</a>
</div>
<?php endif?>
</div><!-- fafa —> 
et enfin, le javascript :

[javascript]
<script type="text/javascript">
$(document).ready(function() {
// Infinite Ajax Scroll configuration
jQuery.ias({
container : '.fafa', // main container where data goes to append
item: '.galerie', // single items
pagination: '.nav', // page navigation
next: '.nav a', // next page selector
loader: '<img src="css/img/ajax-loader.gif"/>', // loading gif
triggerPageThreshold: 1 // show load more if scroll more than this
});
});
</script>
[/javascript]

tout marche à merveille, seulement j’aimerai permettre à l’utilisateur d’afficher les galeries selon des critères de tri, « affiche » , « photographie » , « typographie » etc

j’ai donc ajouté un champs à ma base de donnée galerie, baptisé « TYPE »

j’ai ajouté des liens du type

href="travaux.php?type=photographie">photographie</a>

mais je parviens pas à déclarer ni à récupérer une variable TYPE pour faire le tri dans ma requête.

j’imagine que la requête doit être de ce type la :

$sql = "SELECT id FROM travaux WHERE type = ‘$type’";

mais bon, ça ne marche pas, et je crois être arrivé à mes limites en php…pourriez-vous m’aider, par pitié ??

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 14:09
par xTG
Utilises-tu le tableau superglobal $_GET pour récupérer ta variable type ?
Sinon ta requête est cohérente.

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 14:28
par stofkri
oui, enfin j'ignorai qu'il s'agissait d'un tableau superglobal...

$type = $_GET ["type"];

mais ça ne marche pas, enfin je ne sais pas où déclarer cette variable ni comment l'exploiter pour chaque lien

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 15:22
par stofkri
ça fonctionne si je pointe l'url "photographie" vers une nouvelle page, genre "test.php"

avec cette requête
<?php
include('config.php');
$page = (int) (!isset($_GET['p'])) ? 1 : $_GET['p'];
# sql query
$type = $_GET ["type"];
$sql = "SELECT * FROM travaux WHERE type='$type' ORDER BY id DESC";
# find out query stat point
$start = ($page * $limit) - $limit;
# query for page navigation
if( mysql_num_rows(mysql_query($sql)) > ($page * $limit) ){
	$next = ++$page;
}
$query = mysql_query( $sql . " LIMIT {$start}, {$limit}");
if (mysql_num_rows($query) < 1) {
	header('HTTP/1.0 404 Not Found');
	echo 'Page not found!';
	exit();
}
?>
et les liens

<a class="visit" href="jeter.php?type=identite">voir la galerie</a>
<a class="visit" href="jeter.php?type=affiche">voir la galerie</a>
<a class="visit" href="jeter.php?type=photographie">voir la galerie</a>
<a class="visit" href="jeter.php?type=typographie">voir la galerie</a>


mais j'aimerai que le tri se fasse sur la page travaux.php...

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 17:00
par xTG
Ton problème je pense c'est de vouloir avec un script qui gère à la fois le filtre et sans si je comprends bien.
if( !empty($_GET['type']) )
{
   $type = mysql_real_escape_string($_GET ["type"]); // ne jamais oublier les fonctions de protection contre les injections SQL !
   $sql = "SELECT * FROM travaux WHERE type='$type' ORDER BY id DESC";
}
else
{
   $sql = "SELECT * FROM travaux ORDER BY id DESC";
}

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 17:38
par stofkri
c'est exactement ça, et ça marche, grâce à toi, merci vraiment

pourquoi se protéger contre les injections SQL ? (vraiment novice désolé)

dans ce cas, je dois également corriger cette fonction :

$id = $_GET ["id"];

par $id = mysql_real_escape_string($_GET ["id"]);

finalement le tri ne fonctionne pas s'il y a plus de 4 enregistrements par type, au delà, tous les enregistrements s'affichent

il y a une fonction pour limiter le nombre d'affichage par clic dans le fichier config.php
<?php
/**
 * DB Configuration
 */
define('DB_HOST',			'localhost');
define('DB_USER',			'root');
define('DB_PASS',			'root');
define('DB_NAME',			'galerie');
$limit = 4; #item per page
# db connect
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('Could not connect to MySQL DB ') . mysql_error();
$db = mysql_select_db(DB_NAME, $link);
?>
je l'ai réglé à 4...

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 19:18
par xTG
pourquoi se protéger contre les injections SQL ? (vraiment novice désolé)
Pour éviter par exemple que quelqu'un supprime tout le contenu de ta base de données par exemple ? (un parmi tant d'autre !)
dans ce cas, je dois également corriger cette fonction :

$id = $_GET ["id"];

par $id = mysql_real_escape_string($_GET ["id"]);
Exactement !
finalement le tri ne fonctionne pas s'il y a plus de 4 enregistrements par type, au delà, tous les enregistrements s'affichent
Le tri ne fonctionne pas du tout ou bien seulement quand tu changes de page ?
Il faut penser à transmettre dans l'url ton filtre. ;)

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 19:41
par stofkri
non le tri ne fonctionne plus au delà de la limite $limit fixée dans config.php
pour un type "photographie" de 10 galeries, si je fixe la limite à 15, le tri est fait
si la limite est à 4 images, la 5ème galerie affichée sortira du tri (une galerie "illustration" par ex)

l'url n'a pas changé, c'est

<a href="travaux.php?type=photographie">photographie</a>

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 21:47
par xTG
Si tu as un limite à 4, cela veut dire que tu les affiches 4 par 4.
Quel est le lien qui te permet d'afficher les 4 suivantes ?

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 21:59
par stofkri
oui 4 par 4 , plus ou moins, c'est paramétrable

le lien du bouton : travaux.php?type=photo#

la barre d'adresse affiche alors :

travaux.php#?type=photo
travaux.php#?type=photo#/page/2
travaux.php#?type=photo#/page/3
etc

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 23:24
par xTG
Ah oui j'avais zappé que tu utilisais une pagination en JS...
Bah va falloir regarder la documentation du plugin jQuery pour savoir comment passer en paramètre une variable (le type).

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 23:32
par stofkri
ah lalala ça se complique sérieusement là

Re: déclarer et exploiter une variable pour trier les résult

Posté : 07 févr. 2014, 23:56
par stofkri
au cas ou...sinon je vais renoncer à cette idée de classement
mais mille fois merci pour ton assistance xTG

[javascript]/*!
* Infinite Ajax Scroll, a jQuery plugin
* Version 1.0.2
* https://github.com/webcreate/infinite-ajax-scroll
*
* Copyright (c) 2011-2013 Jeroen Fiege
* Licensed under MIT:
* https://raw.github.com/webcreate/infini ... ICENSE.txt
*/
(function(e){"use strict";Date.now=Date.now||function(){return+(new Date)},e.ias=function(t){function u(){var t;i.onChangePage(function(e,t,r){s&&s.setPage(e,r),n.onPageChange.call(this,e,r,t)});if(n.triggerPageThreshold>0)a();else if(e(n.next).attr("href")){var u=r.getCurrentScrollOffset(n.scrollContainer);E(function(){p(u)})}return s&&s.havePage()&&(l(),t=s.getPage(),r.forceScrollTop(function(){var n;t>1?(v(t),n=h(!0),e("html, body").scrollTop(n)):a()})),o}function a(){c(),n.scrollContainer.scroll(f)}function f(){var e,t;e=r.getCurrentScrollOffset(n.scrollContainer),t=h(),e>=t&&(m()>=n.triggerPageThreshold?(l(),E(function(){p(e)})):p(e))}function l(){n.scrollContainer.unbind("scroll",f)}function c(){e(n.pagination).hide()}function h(t){var r,i;return r=e(n.container).find(n.item).last(),r.size()===0?0:(i=r.offset().top+r.height(),t||(i+=n.thresholdMargin),i)}function p(t,r){var s;s=e(n.next).attr("href");if(!s)return n.noneleft&&e(n.container).find(n.item).last().after(n.noneleft),l();if(n.beforePageChange&&e.isFunction(n.beforePageChange)&&n.beforePageChange(t,s)===!1)return;i.pushPages(t,s),l(),y(),d(s,function(t,i){var o=n.onLoadItems.call(this,i),u;o!==!1&&(e(i).hide(),u=e(n.container).find(n.item).last(),u.after(i),e(i).fadeIn()),s=e(n.next,t).attr("href"),e(n.pagination).replaceWith(e(n.pagination,t)),b(),c(),s?a():l(),n.onRenderComplete.call(this,i),r&&r.call(this)})}function d(t,r,i){var s=[],o,u=Date.now(),a,f;i=i||n.loaderDelay,e.get(t,null,function(t){o=e(n.container,t).eq(0),0===o.length&&(o=e(t).filter(n.container).eq(0)),o&&o.find(n.item).each(function(){s.push(this)}),r&&(f=this,a=Date.now()-u,a<i?setTimeout(function(){r.call(f,t,s)},i-a):r.call(f,t,s))},"html")}function v(t){var n=h(!0);n>0&&p(n,function(){l(),i.getCurPageNum(n)+1<t?(v(t),e("html,body").animate({scrollTop:n},400,"swing")):(e("html,body").animate({scrollTop:n},1e3,"swing"),a())})}function m(){var e=r.getCurrentScrollOffset(n.scrollContainer);return i.getCurPageNum(e)}function g(){var t=e(".ias_loader");return t.size()===0&&(t=e('<div class="ias_loader">'+n.loader+"</div>"),t.hide()),t}function y(){var t=g(),r;n.customLoaderProc!==!1?n.customLoaderProc(t):(r=e(n.container).find(n.item).last(),r.after(t),t.fadeIn())}function b(){var e=g();e.remove()}function w(t){var r=e(".ias_trigger");return r.size()===0&&(r=e('<div class="ias_trigger"><a href="#">'+n.trigger+"</a></div>"),r.hide()),e("a",r).unbind("click").bind("click",function(){return S(),t.call(),!1}),r}function E(t){var r=w(t),i;n.customTriggerProc!==!1?n.customTriggerProc(r):(i=e(n.container).find(n.item).last(),i.after(r),r.fadeIn())}function S(){var e=w();e.remove()}var n=e.extend({},e.ias.defaults,t),r=new e.ias.util,i=new e.ias.paging(n.scrollContainer),s=n.history?new e.ias.history:!1,o=this;u()},e.ias.defaults={container:"#container",scrollContainer:e(window),item:".item",pagination:"#pagination",next:".next",noneleft:!1,loader:'<img src="images/loader.gif"/>',loaderDelay:600,triggerPageThreshold:3,trigger:"Load more items",thresholdMargin:0,history:!0,onPageChange:function(){},beforePageChange:function(){},onLoadItems:function(){},onRenderComplete:function(){},customLoaderProc:!1,customTriggerProc:!1},e.ias.util=function(){function i(){e(window).load(function(){t=!0})}var t=!1,n=!1,r=this;i(),this.forceScrollTop=function(i){e("html,body").scrollTop(0),n||(t?(i.call(),n=!0):setTimeout(function(){r.forceScrollTop(i)},1))},this.getCurrentScrollOffset=function(e){var t,n;return e.get(0)===window?t=e.scrollTop():t=e.offset().top,n=e.height(),t+n}},e.ias.paging=function(){function s(){e(window).scroll(o)}function o(){var t,s,o,f,l;t=i.getCurrentScrollOffset(e(window)),s=u(t),o=a(t),r!==s&&(f=o[0],l=o[1],n.call({},s,f,l)),r=s}function u(e){for(var n=t.length-1;n>0;n--)if(e>t[n][0])return n+1;return 1}function a(e){for(var n=t.length-1;n>=0;n--)if(e>t[n][0])return t[n];return null}var t=[[0,document.location.toString()]],n=function(){},r=1,i=new e.ias.util;s(),this.getCurPageNum=function(t){return t=t||i.getCurrentScrollOffset(e(window)),u(t)},this.onChangePage=function(e){n=e},this.pushPages=function(e,n){t.push([e,n])}},e.ias.history=function(){function n(){t=!!(window.history&&history.pushState&&history.replaceState),t=!1}var e=!1,t=!1;n(),this.setPage=function(e,t){this.updateState({page:e},"",t)},this.havePage=function(){return this.getState()!==!1},this.getPage=function(){var e;return this.havePage()?(e=this.getState(),e.page):1},this.getState=function(){var e,n,r;if(t){n=history.state;if(n&&n.ias)return n.ias}else{e=window.location.hash.substring(0,7)==="#/page/";if(e)return r=parseInt(window.location.hash.replace("#/page/",""),10),{page:r}}return!1},this.updateState=function(t,n,r){e?this.replaceState(t,n,r):this.pushState(t,n,r)},this.pushState=function(n,r,i){var s;t?history.pushState({ias:n},r,i):(s=n.page>0?"#/page/"+n.page:"",window.location.hash=s),e=!0},this.replaceState=function(e,n,r){t?history.replaceState({ias:e},n,r):this.pushState(e,n,r)}}})(jQuery);[/javascript]

Re: déclarer et exploiter une variable pour trier les résult

Posté : 08 févr. 2014, 08:10
par xTG
J'ai regardé la documentation mais l'auteur n'a pas prévu la personnalisation des urls.

Re: déclarer et exploiter une variable pour trier les résult

Posté : 09 févr. 2014, 15:29
par stofkri
on peut quand même considérer que le problème est résolu, ta solution fonctionne pour une pagination normale, si je tiens à cette idée de tri, je devrais sans doute renoncer à cet effet de scroll infini...encore merci