Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2008, 21h06   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 13
Points : 3
Points : 3
Par défaut [SQL] Tri de tableau

Bonjour,
Au final, je souhaite extraire des photos d'une base de données d'une manière aléatoire et les afficher page par page.
J'ai pensé remplir un tableau avec les données et trier ce tableau (pas les trier au moment du "select.....).
Auriez-vous une idée ?
Voilà un extrait du script mais j'ai un message d'erreur

Citation:
"Warning: Invalid argument supplied for foreach() in c:\........"
..............
Code :
1
2
3
4
5
6
7
while ($row3 = mysql_fetch_row($resnb))
{
sort($row3);
}
   foreach ($row3 as $value) {
 	    echo "$value<br />";
 	}
Merci
tapi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 21h16   #2
Him
Membre régulier
 
Avatar de Him
 
Inscription : février 2006
Messages : 244
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Belgique

Informations forums :
Inscription : février 2006
Messages : 244
Points : 79
Points : 79
Envoyer un message via ICQ à Him
Hello,

pourquoi les triés ?

-> pour "shake" les données à la sortie ( aléatoire ).

tu ajoutes RAND() à la fin de ra requête SQL.
Him est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 21h49   #3
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 313
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 313
Points : 8 596
Points : 8 596
Là, avec ton sort, t'es en train de faire un tri des colonnes, pas des lignes, donc pas vraiment ce que tu veux faire. Faut faire un while ($row3 = mysql_fetch_row($resnb)) pour compléter un tableau et après le while, tu fais le sort et l'affichage.

Pourquoi préciser "extraire des photos d'une base de données d'une manière aléatoire" alors que tu fais un sort derrière ? Pour compléter ce que dit Him, le RAND() se met dans un ORDER BY : SELECT ... FROM ... WHERE ... ORDER BY RAND().
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 09h47   #4
Invité de passage
 
Inscription : octobre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 13
Points : 3
Points : 3
Merci pour ces réponses.
le cas est le suivant : ce sont des photos de biens immobiliers et on souhaite que lorsque l'internaute consulte le site, les photos s'affichent aléatoirement, trois par trois par page, mais qu'elles passent bien toutes en revue.
J'avais déja trié aléatoirement au moment du select, mais au moment de cliquer sur "page suivante", le fichier s'éxécute à nouveau, et le tri se refait , donc des photos déjà vues peuvent se réafficher.
Donc je souhaite mettre les photos dans un tableau, trier ce tableau et le lister, faire page suivante et continuer de lister ce tableau sans refaire de tri.
Merci pour le coup de main.
tapi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h05   #5
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Bonjour,
votre foreach ne peut fonctionner car $row3 n'est plus un array mais une boolean (FALSE). Sinon, pour votre souci, il y a toujours moyen d'utiliser la session de votre visiteur pour coder un petit script qui va bien.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
 
  session_start();
 
  if (!isset($_SESSION['images_list'])) $_SESSION['images_list'] = array();
 
  if
  (
    !mysql_connect('localhost', 'darian', 'mdp') ||  
    !mysql_select_db('base')                        ||
    !$res = mysql_query('SELECT `image_id` FROM `images`')
  )
  die(mysql_error());
 
  mysql_close();
 
  $images_count = mysql_num_rows($res);
 
  $images_remaining = $images_count-count($_SESSION['images_list']);
 
  if ($images_remaining >= 3) $x = 3;
  else if ($images_remaining != 0) $x = $images_remaining;
  else exit('Il n\'y a plus d\images à afficher!');
 
  $images_id = array();
  $images_choice = array();
 
  while (list($image_id) = mysql_fetch_row($res)) $images_id[] = $image_id;
 
  for ($i = 0; $i < $x; $i++)
  {  
 
    shuffle($images_id);
 
    for ($n = 0; $n < $images_count; $n++)
    {
 
      $image_id = $images_id[$n];
 
      if (!in_array($image_id, $_SESSION['images_list']))
      {
        $_SESSION['images_list'][] = $image_id;
        $images_choice[] = $image_id;
        break;
      }
 
    }
 
  }
 
  foreach ($images_choice as $image) echo 'Affiche l\'image ayant pour id : '.$image.'<br />';  
 
?>
J'ai volontairement simplifié le script, mais j'ai aussi volontairement évité toutes fonctions utilisant le hasard (sauf shuffle), comme mt_rand ou array_rand car elles font tourner le script en rond avant de trouver un résultat.

J'ai préféré des for car au moins, le script ne fera qu'une fois le tour avant d'en voir le bout, alors qu'avec mt_rand ou array_rand, on peut facilement faire 10x le tour.

J'ai aussi préféré un SELECT simple, plutôt qu'une requête plus lourde (crade?) avec NOT IN... je suis resté dans le cadre de l'exemple en travaillant avec PHP.

Cordialement,
DaRiaN.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 11h49   #6
Invité de passage
 
Inscription : octobre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 13
Points : 3
Points : 3
Bonjour,
j'approche de la solution, mais j'ai oublié de préciser un peu plus mon problème.
Dans cette table (qui contient entre autres, un champ "photos" et un champ "référence"), que je souhaite trier aléatoirement, il faut que tous les champs soient triés ensemble et que je puisse afficher mes photos accompagnées de leurs références.
Merci
tapi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 12h05   #7
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
 
  session_start();
 
  if (!isset($_SESSION['images_list'])) $_SESSION['images_list'] = array();
 
  if
  (
    !mysql_connect('localhost', 'darian', 'mdp') ||  
    !mysql_select_db('base')                        ||
    !$res = mysql_query('SELECT `image_id`, `image_lien` FROM `images`')
  )
  die(mysql_error());
 
  mysql_close();
 
  $images_count = mysql_num_rows($res);
 
  $images_remaining = $images_count-count($_SESSION['images_list']);
 
  if ($images_remaining >= 3) $x = 3;
  else if ($images_remaining != 0) $x = $images_remaining;
  else exit('Il n\'y a plus d\images à afficher!');
 
  $images_id = array();
  $images_lien = array();  
  $images_choice = array();
 
  while (list($image_id, $image_lien) = mysql_fetch_row($res))
  {
    $images_id[] = $image_id;
    $images_lien[$image_id] = $image_lien;
  }
 
  for ($i = 0; $i < $x; $i++)
  {  
 
    shuffle($images_id);
 
    for ($n = 0; $n < $images_count; $n++)
    {
 
      $image_id = $images_id[$n];
 
      if (!in_array($image_id, $_SESSION['images_list']))
      {
        $_SESSION['images_list'][] = $image_id;
        $images_choice[] = array('id' => $image_id, 'lien' => $images_lien[$image_id]);
        break;
      }
 
    }
 
  }
 
  foreach ($images_choice as $image)
   echo 'Affiche l\'image "'.$image['lien'].'" ayant pour id : '.$image['id'].'.<br />';  
 
?>
C'est toujours simplifié, même si, sachant cela, je l'aurais pris autrement.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h21.


 
 
 
 
Partenaires

Hébergement Web