Bonjour à tous
Vu que je suis un peu une quiche en matière d’array, je viens implorer votre aide !
Je cherche à récupérer l’index d’une ligne d’un array multidimensionnel à la recherche d’un mot clé.
Le tableau ressemble à :
Array (
[0] => Array ( [0] => web [category] => web [1] => 1 [pos] => 1 )
[1] => Array ( [0] => web [category] => web [1] => 2 [pos] => 2 )
…
[13] => Array ( [0] => illustration [category] => illustration [1] => 5 [pos] => 5 )
)
En fonction de la page sur laquelle je me trouve, je voudrais qu’il repère la ligne dans le tableau, afin que je puisse faire une navigation à boutons Next et Prev
Merci pour votre aide !
J’ai pas du tout saisi, sauf que c’est du php. Tu veux faire quoi ?
Oui en PHP
Enfaite, je désire faire un galerie défilante avec les boutons Suivants et Précédent.
Le problème est que les images sont triés par un tri particulier, et non par id dans l’ordre. Ce qui fait que dans le lien, je peux pas faire $row[‘id’]+1 pour aller à l’image suivante. Ca peut passer de 10 à 72 par exemple
C’est pour ca que je pensais faire un tableau ayant le même ordre que mes images, et récuperer l’id contenu dans la ligne suivante, ou précédente.
J’ai déjà essayé array_search(’$row[‘NumeroDeLaPosition’]’, $array);, mais ca ne marche pas avec des tableaux multidimensionnel, d’ou mon problème.
autrement dire :
Comment retourner l’index [3] si je fais une recherche : 4 et web dans le tableau suivant :
arra(
…
[3] => Array
(
[0] => web
[category] => web
[1] => 4
[pos] => 4
)
…
)
Plutôt que de réfléchir comme ça, pourquoi ne pas stocker un tableau d’identifiants, et à chaque page naviguer dans ce tableau ? (c’est peut-être ce que tu dis, en fait). Et du coup, le bouton précédent/suivant ne font juste qu’incrémenter l’index (= la valeur à lire dans le tableau).
oui, c’est ce que je disais
1 - faire une requête sql qui récupère les id des photos, dans le meme ordre que ma galerie.
2 - placer les résultats dans un array
3 - chaque page doit pouvoir retourner l’index de la ligne active du tableau
4 - la suite est un jeu d’enfant, récuperer l’id stocké dans la ligne suivante ou précédente pour arrivé à la page suivante
Mais je coince à l’étape 3 =/
Pour l’index, une “simple” variable GET suffit, pour le tableau, soit tu rejoues la requête (avec un limit 1 offset , cf doc mySQL), soit tu fous le tableau en session, si tu utilises javascript et tu le génères sur la page et tutilises AJAX pour mettre à jour la page.
j’ai déjà une GET dans l’url : ID-titre-de-la-page
Par contre ne me demande pas de faire du JS et de l’AJAX, je touche rien Et je préfèrerai clairement m’en passer
Il faut juste que le bouton next sache quel est l’id suivant dans la liste (je rappelle que les id sont pas dans l’ordre)
Là, honnêtement, si c’est sélectionner la prochaine image/news comme sur Clubic, tu as plusieurs choix :
- Soit tu stockes l’image précédente/suivante dans ta table (bof)
- Soit tu recalcules ça, avec une requête genre select id from Image where id <> {id de l’image sélectionnée} and time > {temps de l’image sélectionnée) order by time asc limit 1, 1. ie: tu utilises les données servant au critère de tri pour filtrer toutes les images précédents celle sélectionnée (d’où le time > …) et tu tries dans l’ordre que tu avais.
Et si tu as déjà toutes les images, que tu connais leur ordre, il te faut deux tableau :
index => image
image.id => index
Le premier pour récupérer les informations de l’image, le second pour récupérer l’index d’une image par son identifiant pour pouvoir sélectionner la suivante.
Je crois que ton idée de requete avec < > et LIMIT ca va me permettre de récuperer ce dont j’ai besoin directement !!
Je vais tester ca ! merci
au pire je m’arrangerai autrement, ca commencer à m’ennuyer les array là
Merci à toi pour tes conseils
Disons que je ne vois pas non plus comment faire autrement
Pour le moment j’ai ca !
$Qnext = mysql_query("SELECT id,title,pos FROM portfolio WHERE pos > '".$data['pos']."' AND category = '".$data['category']."' ORDER BY category , pos ASC LIMIT 1");
$Qprev = mysql_query("SELECT id,title,pos FROM portfolio WHERE pos < '".$data['pos']."' AND category = '".$data['category']."' ORDER BY category , pos DESC LIMIT 1");
Ca marche nickel sauf pour un truc : le passage d’un dernier élément d’une catégorie vers le premier élément de la catégorie suivante. Mais j’y travaille, je vais trouver… j’aurai 4-5 requêtes avec des if, mais je vais trouver
Edité le 22/10/2011 à 12:22
VOILA, j’y suis arrivé ! Je suis juste un peu horrifié de voir qu’il ma fallu environ 30 lignes de code et 7 requètes SQL pour arriver à faire un Prev - Next !! XD
Voici mon code (ca risque de pas etre très clair dans l’encadré du forum…)
<?php
$Qlast = mysql_query("SELECT id,category,pos FROM portfolio WHERE category = '".$data['category']."' ORDER BY pos DESC LIMIT 1");
$Qfirst = mysql_query("SELECT id,category,pos FROM portfolio WHERE category = '".$data['category']."' ORDER BY pos ASC LIMIT 1");
$last = mysql_fetch_array($Qlast);
$first = mysql_fetch_array($Qfirst);
$array = array(1 => 'web', 2 => 'illustration', 3 => 'multimedia');
$position = array_search($data['category'], $array);
if($data['pos'] == $last['pos']){
if ($position !== false){
$category = $array[$position+1];
}
$Qnext = mysql_query("SELECT id,title,pos FROM portfolio WHERE pos = 1 AND category = '".$category."' ORDER BY category , pos ASC LIMIT 1");
}else{
$Qnext = mysql_query("SELECT id,title,pos FROM portfolio WHERE pos > '".$data['pos']."' AND category = '".$data['category']."' ORDER BY category , pos ASC LIMIT 1");
}
if($data['pos'] == $first['pos']){
if ($position !== false){
$category = $array[$position-1];
}
$Qlast = mysql_query("SELECT id,category,pos FROM portfolio WHERE category = '".$category."' ORDER BY pos DESC LIMIT 1");
$last = mysql_fetch_array($Qlast);
$Qprev = mysql_query("SELECT id,title,pos FROM portfolio WHERE pos = '".$last['pos']."' AND category = '".$category."' ORDER BY category , pos DESC LIMIT 1");
}else{
$Qprev = mysql_query("SELECT id,title,pos FROM portfolio WHERE pos < '".$data['pos']."' AND category = '".$data['category']."' ORDER BY category , pos DESC LIMIT 1");
}
$next = (mysql_fetch_array($Qnext));
$prev = (mysql_fetch_array($Qprev));
echo '<a id="prev" href="'.$prev['id'].'-'.$prev['title'].'">Précédent</a>';
echo '<a id="list" href="/portfolio">Revenir à la liste</a>';
echo '<a id="next" href="'.$next['id'].'-'.$next['title'].'">Suivant</a>';
?>
En gros, je regarde si la page active est le dernier élément d’un catégorie, si oui alors le bouton Next doit envoyer vers le premier élément de la catégorie suivante, sinon on va juste chercher l’élément suivant dans la meme catégorie.
Et pareil pour le bouton Prev. Si la page active est le premier élément d’une catégorie, alors il faut que le bouton renvoit vers le dernier élément de la catégorie précédente…
C’est très compliqué a cause de mon tri. Je suis sur que l’idée du Array aurait été plus simple. Si quelqu’un voit une optimisation ou une meilleure solution, n’hésitez pas
Par contre, y a plein d’injection SQL là dedans.
Utilise plutôt mysqli (http://fr2.php.net/manual/fr/mysqli-stmt.bind-param.php) ou PDO
t’entends quoi par plein d’injections?
Je sais que normalement il faut utiliser PDO à la place de mysql… Mais meme si j’ai déja eu quelques cours vite fait, j’ai pas compris grand chose. Et je me sens pas d’humeur à suivre des tutos et essayer de comprendre.
… Un jour peut-être…
"SELECT id,title,pos FROM portfolio WHERE pos > '".$data['pos']."' AND category = '".$data['category']."' ORDER BY category , pos ASC LIMIT 1"
Si $data[‘category’] contient de la merde, genre ’ or 1=1, tu peux t’amuser à avoir tout.
L’idée serait de faire ça :
select id, title, pos from portfolio where pos > :pos and category = :category order by category, pos asc limit 1
Et de demander à mySQL de binder tes variables SQL (:pos, :category) à tes variables PHP ($data[‘pos’], $data[‘category’]).
Ca permet aussi de rendre le code plus clair, voir de réutiliser des requêtes si possible.
J’avoue que c’est plus clair, propre et sécurisé… Je reconvertirai toutes mes requêtes une fois à l’occas, quand je maîtriserai mieux PDO