2013-05-05 5 views
0

J'ai une boucle foreach imbriquée dans une boucle while. j'extrais d'un myqsl les champs de texte qui correspondent à une plage. le seul problème est que je ne peux pas commander par date après avoir extrait le champ de texte. si j'ai la même date (02.01.2013 dans cet exemple) dans deux champs de texte différents, il apparaît dans la sortie comme:Classement par date dans une boucle imbriquée

 TOUR 1 
     01.01.2013 
    -> 02.01.2013 
    -> 03.01.2013 
     04.01.2013 

     TOUR 2 
    -> 02.01.2013 
    -> 03.01.2013  

je ne peux pas comprendre comment le groupe par date ($ jour) après la boucle. Je sais que la solution serait de créer un tableau pour cela mais comment?

voici mon code:

 $sql = "SELECT accommodation, start FROM circuits_".$_POST['year']." 
    WHERE start >='".$first."' AND start <= '".$last."' 
    ORDER BY start"; 
    $rows = $db->query($sql); 

    while ($record = $db->fetch($rows)) { 

    $data_acc = explode(';',$record['accommodation'], -1); 

    foreach($data_acc as $row_acc) { 
    list($day,$name,$sgl,$dbl) = explode('|',$row_acc); 

Thanx

+0

Ne pas 'circuits _". $ _ POST ['année']. " '!!! C'est une approche très peu sûre. –

+0

ceci est un site intranet non public. et mes chaînes d'échappement de classe mysql automatiquement – shad0wproxy

+0

@svartbakur - Ce n'est pas grave si votre site est sur intranet ou internet. Vous devriez toujours prendre la sécurité en considération. Il n'est pas à l'abri des menaces simplement parce que le système est «à l'intérieur de l'entreprise». '(Les employés, les visiteurs, etc., etc peuvent être en mesure de faire des choses stupides ...) – bestprogrammerintheworld

Répondre

0

Je pense que vous cherchez quelque chose comme ça? (Remplacer ORDER BY avec GROUP BY)

$sql = "SELECT accommodation, start FROM circuits_".$_POST['year']." 
WHERE start >='".$first."' AND start <= '".$last."' 
GROUP BY start"; 
$rows = $db->query($sql); 

while ($record = $db->fetch($rows)) { 
    //do whatever.. 
} 
+0

GROUPING dans la requête affectera uniquement chaque liste éclatée. Même avec un GROUO BY j'obtiens le même résultat. – shad0wproxy

+0

@svartbakur - Ok, que voulez-vous exactement avec votre code? (Tout le code qui relie votre question) Je voudrais vraiment quelques précisions ici (peut-être que vous pourriez éditer votre question?) – bestprogrammerintheworld

0

Votre développement serait moins compliqué si vous divisez vos données dans les champs avant de les stocker dans la base de données. Sans changer votre schéma actuel, vous pouvez utiliser uksort() pour post-traiter votre tableau. Utiliser uksort vous permettra d'analyser les dates avant de les comparer. Ou peut-être, vous pouvez convertir chaque date à ISO-8601 avant de le stocker dans votre liste et utiliser le plus simple ksort().

+0

J'ai une grande quantité de données si concaténant était le chemin à parcourir. c'est plus difficile à manipuler je sais. la date est enregistrée en tant que cachet unix. vous voyez le format de la date après la transformation. je pourrais utiliser ksort pour cela. mais il affectera chaque boucle de la requête mysql et aura toujours le même problème. – shad0wproxy

+0

pouvez-vous ajouter une colonne timestamp à votre table? – phatfingers

+0

bonjour phatfingers. J'ai une colonne de début et de fin qui sont déjà timestamp. J'explique mieux. Cette table contient des informations sur les visites avec dates de début et de fin. mes demandes extraient un champ de texte avec les dates et les noms des hôtels. le code tel qu'il est affichera le résultat, peu importe ce que je fais, par nom de tour, à cause de la boucle foreach dans ma boucle while. L'utilisation de la fonction de tri ordonnera simplement le résultat dans le tour. J'espère que je suis clair! – shad0wproxy