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

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 12:24

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é ??

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2014, 14:09

Utilises-tu le tableau superglobal $_GET pour récupérer ta variable type ?
Sinon ta requête est cohérente.

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 14:28

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

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 15:22

ç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...

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2014, 17:00

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

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 17:38

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...

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2014, 19:18

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

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 19:41

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>

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2014, 21:47

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 ?

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 21:59

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

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2014, 23:24

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).

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 23:32

ah lalala ça se complique sérieusement là

Eléphanteau du PHP | 26 Messages

07 févr. 2014, 23:56

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]

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2014, 08:10

J'ai regardé la documentation mais l'auteur n'a pas prévu la personnalisation des urls.

Eléphanteau du PHP | 26 Messages

09 févr. 2014, 15:29

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