Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

Foutieve volgorde in ORDER BY alfabet

Anoniem
BasHamar
23 antwoorden
  • Op http://www.seizoenkaarten.com maak ik gebruik van een PHP-menu waarbij de clubnamen op alfabet worden getoond.
    De mysql-code is:[code:1:4efa558049]$sql = "SELECT * FROM dyn_menu ORDER BY label ASC";
    [/code:1:4efa558049]
    Waarbij "label" de weergegeven link-tekst is.
    Toch wordt vanaf "Vitesse" een fout gemaakt, Top Oss en Stormvogels zouden boven Vitesse moeten staan. Kan iemand vertellen wat de oorzaak kan zijn?
  • Niet als je niet meer info geeft… Kan je misschien een (gedeelte van) je gegevens hier als dump plaatsen? En dan in het bijzonder de gegevens waar het fout gaat.

    - Bas
  • Ok,
    ik heb daarvoor een pdf geplaatst met daarin de inhoud van de mysql tabel "menu" op http://www.seizoenkaarten.com/menu.pdf

    En het script dat het menu maakt en dus de gevens uit de tabel menu haalt vind je hier:[code:1:1652fc247e]$sql = "SELECT * FROM dyn_menu ORDER BY label ASC";
    $items = mysql_query($sql);
    while ($obj = mysql_fetch_object($items)) {
    if ($obj->parent_id == 0) {
    $parent_menu[$obj->id]['label'] = $obj->label;
    $parent_menu[$obj->id]['link'] = $_SERVER["PHP_SELF"];
    $parent_menu[$obj->id]['naam'] = $obj->naam;
    } else {
    $sub_menu[$obj->id]['parent'] = $obj->parent_id;
    $sub_menu[$obj->id]['label'] = $obj->label;
    $sub_menu[$obj->id]['link'] = $_SERVER["PHP_SELF"];
    $sub_menu[$obj->id]['naam'] = $obj->naam;
    $parent_menu[$obj->parent_id]['count']++;
    }
    }
    mysql_free_result($items);

    // 2 level menu functie 1
    function rebuild_link($link, $parent_var, $parent_val) {
    $link_parts = explode("?", $link);
    $base_var = "?".$parent_var."=".$parent_val;
    if (!empty($link_parts[1])) {
    $link_parts[1] = str_replace("&", "##", $link_parts[1]);
    $parts = explode("##", $link_parts[1]);
    $newParts = array();
    foreach ($parts as $val) {
    $val_parts = explode("=", $val);
    if ($val_parts[0] != $parent_var) {
    array_push($newParts, $val);
    }
    }
    if (count($newParts) != 0) {
    $qs = "&".implode("&", $newParts);
    }
    return $link_parts[0].$base_var.$qs;
    } else {
    return $link_parts[0].$base_var;
    }
    }

    // 2 level menu functie 2

    function dyn_menu($parent_array, $sub_array, $qs_val = "", $main_id = "", $sub_id = "menu", $extra_style = "")
    {
    $menu = "<div id=\"".$main_id."\">
    ";
    foreach ($parent_array as $pkey => $pval) {
    if (!empty($pval['count'])) {
    $menu .= " <div><IMG SRC=\"images/pijl.gif\" WIDTH=12 HEIGHT=12 ALT=\"\"><a class=\"".$extra_style."\" href=\"".$pval['link']."?naam=".$pval['naam']."&".$qs_val."=".$pkey."\"><b>".$pval['label']."</b></a></div>
    ";
    } else {
    $menu .= " <div><a href=\"".$pval['link']."?naam=".$pval['naam']."&\"><b>".$pval['label']."</b></a></div>
    ";
    }
    if (!empty($_REQUEST[$qs_val])) {
    $menu .= "<div id=\"".$sub_id."\">
    ";
    foreach ($sub_array as $sval) {
    if ($pkey == $_REQUEST[$qs_val] && $pkey == $sval['parent']) {
    $menu .= "<div>&nbsp;<IMG SRC=\"images/wit.gif\" WIDTH=12 HEIGHT=12 ALT=\"\">&nbsp;<a href=\"".rebuild_link($sval['link'], $qs_val, $sval['parent'])."&naam=".$sval['naam']."\"><b>".$sval['label']."</b></a></div>
    ";
    }
    }
    $menu .= "</div>
    ";
    }
    }
    $menu .= "</div>
    ";
    return $menu;
    }
    // 2 level menu einde[/code:1:1652fc247e]
    Wil je nog meer gegevens?






  • probeer eens om de query:
    [code:1:208ba8509c]
    SELECT * FROM dyn_menu ORDER BY label ASC
    [/code:1:208ba8509c]
    direct uit te voeren in het SQL venster van phpmyadmin.
    Is dan de volgorde ook verkeerd kijk dan naar de "Collation".
    wimb
  • [code:1:4e2f700a2a]SELECT * FROM dyn_menu ORDER BY label ASC [/code:1:4e2f700a2a] geeft ook een verkeerde volgorde. Welke collatie moet het dan worden? Collatie staat nu op utf8_unicode_ci.
    Wat is eigenlijk het effect / nut van collatie?
  • In de pdf tabel heb je in het veld label een heleboel dubbele waarden. Daar kun je niet op naam sorteren. Met:
    [code:1:a3842ee92c]SELECT * FROM dyn_menu ORDER BY naam ASC [/code:1:a3842ee92c] moeten de namen wel in de juiste volgorde komen.
    wimb
  • Vreemd, vreemd, ik snap er geen hout van…
    [code:1:5930dc3bfb]SELECT * FROM dyn_menu ORDER BY naam ASC[/code:1:5930dc3bfb] invoeren via phpmyadmin geeft een correcte weergave, Vitesse staat als laatste getoond. En dat klopt.
    Maar dezelfde query in de php-pagina:[code:1:5930dc3bfb]$sql = "SELECT * FROM dyn_menu ORDER BY label ASC"; [/code:1:5930dc3bfb] geeft een verkeerde volgorde. Ik heb dit aangepast, je kunt het zien via http://www.seizoenkaarten.com
    Maar wel even bedankt dat je de moeite neemt om te helpen.
  • …. kleine correctie….
    in de php-pagina staat nu natuurlijk[code:1:7e49f3763e]SELECT * FROM dyn_menu ORDER BY naam ASC[/code:1:7e49f3763e]
  • Is er iemand die mij verder kan helpen?
  • Wat is het resultaat als je direct na [code:1:6833fe8a91]$items = mysql_query($sql);[/code:1:6833fe8a91] het volgende plaatst?[code:1:6833fe8a91]print("<pre>");
    print_r($items);
    print("</pre>");[/code:1:6833fe8a91]
    - Bas
  • bedankt dat je even helpt: er wordt[code:1:a73bd56449]Resource id #6
    [/code:1:a73bd56449] op de pagina getoond
  • Hm, dat was natuurlijk een domme vraag van mij.

    Vervang[code:1:10c48b1172]print("<pre>");
    print_r($items);
    print("</pre>");[/code:1:10c48b1172]Door[code:1:10c48b1172]print("<pre>
    ");
    while ($r = mysql_fetch_array($items)) {
    print_r($r);
    print("
    ")
    }
    print("
    </pre>");[/code:1:10c48b1172]
    Wat krijg je nu? En belangrijker: klopt de volgorde met wat je verwacht?

    - Bas


  • ja, de volgorde is nu goed! er is alleen nog een error in regel 73. Dit is nu de code:[code:1:2bf98ea3ed]$sql = "SELECT * FROM dyn_menu ORDER BY naam ASC";
    $items = mysql_query($sql);
    print("<pre><font color=\"#FFFFFF\"
    ");
    while ($r = mysql_fetch_array($items)) {
    print_r($r);
    print("
    ") ;
    }
    print("
    </pre>");

    while ($obj = mysql_fetch_object($items)) {
    if ($obj->parent_id == 0) {
    $parent_menu[$obj->id]['label'] = $obj->label;
    $parent_menu[$obj->id]['link'] = $_SERVER["PHP[/code:1:2bf98ea3ed]
    en regel 73 geeft een error:[code:1:2bf98ea3ed]Warning: Invalid argument supplied for foreach() in /home/vlaggen/domains/seizoenkaarten.com/public_html/includes/functies.php on line 73
    [/code:1:2bf98ea3ed]
    Regel 73:[code:1:2bf98ea3ed]function dyn_menu($parent_array, $sub_array, $qs_val = "", $main_id = "", $sub_id = "menu", $extra_style = "")
    {
    $menu = "<div id=\"".$main_id."\">
    ";
    /
    egel 73>>>>
    foreach ($parent_array as $pkey => $pval) {
    if (!empty($pval['count'])) {
    $menu .= " <div><IMG SRC=\"images/pijl.gif\" WIDTH=12 HEIGHT=12 ALT=\"\"><a class=\"".$extra_style."\" href=\"".$pval['link']."?naam=".$pval['naam']."&".$qs_val."=".$pkey."\"><b>".$pval['label']."</b></a></div>
    ";
    } else {[/code:1:2bf98ea3ed]





  • Waarschijnlijk krijg je de fout omdat ik $items al eens helemaal heb doorlopen. Als dat zo is dan zou het weghalen van mijn stuk code de oplossing zijn. Hoewel je dan weer terug bij af bent, weet je nu wel meer: het probleem zit 'm in je PHP-code, niet in MySQL. Kijk het dus nog eens goed na, gooi er desnoods wat extra print()s in, en zoek waar het fout gaat. Kijk bijvoorbeeld eens naar $parent_menu en $sub_menu, is de volgorde daar nog zoals verwacht…?

    - Bas
  • Ik begrijp het niet. Tot aan [b:f314050119]mysql_free_result($items);[/b:f314050119] gaat het goed, daarna snap ik echt niet waar het fout gaat:

    [code:1:f314050119]$sql = "SELECT * FROM dyn_menu ORDER BY naam ASC";
    $items = mysql_query($sql);
    while ($obj = mysql_fetch_object($items)) {
    if ($obj->parent_id == 0) {
    $parent_menu[$obj->id]['label'] = $obj->label;
    $parent_menu[$obj->id]['link'] = $_SERVER["PHP_SELF"];
    $parent_menu[$obj->id]['naam'] = $obj->naam;
    echo "<pre><font color=\"#FFFFFF\">
    ";
    echo $obj->naam;
    echo "</font></pre>";
    } else {
    $sub_menu[$obj->id]['parent'] = $obj->parent_id;
    $sub_menu[$obj->id]['label'] = $obj->label;
    $sub_menu[$obj->id]['link'] = $_SERVER["PHP_SELF"];
    $sub_menu[$obj->id]['naam'] = $obj->naam;
    $parent_menu[$obj->parent_id]['count']++;
    echo "<font color=\"#FFFFFF\">
    ";
    echo $obj->naam;
    echo "</font>&nbsp;";
    }
    }

    // tot hier is de weergave van $obj->naam correct
    // hierna begrijp ik het niet meer

    mysql_free_result($items);

    // 2 level menu functie 1
    function rebuild_link($link, $parent_var, $parent_val) {
    $link_parts = explode("?", $link);
    $base_var = "?".$parent_var."=".$parent_val;
    if (!empty($link_parts[1])) {
    $link_parts[1] = str_replace("&amp;", "##", $link_parts[1]);
    $parts = explode("##", $link_parts[1]);
    $newParts = array();
    foreach ($parts as $val) {
    $val_parts = explode("=", $val);
    if ($val_parts[0] != $parent_var) {
    array_push($newParts, $val);
    }
    }
    if (count($newParts) != 0) {
    $qs = "&amp;".implode("&amp;", $newParts);
    }
    return $link_parts[0].$base_var.$qs;
    } else {
    return $link_parts[0].$base_var;
    }
    }

    // 2 level menu functie 2

    function dyn_menu($parent_array, $sub_array, $qs_val = "", $main_id = "", $sub_id = "menu", $extra_style = "")
    {
    $menu = "<div id=\"".$main_id."\">
    ";
    foreach ($parent_array as $pkey => $pval) {
    if (!empty($pval['count'])) {
    $menu .= " <div><IMG SRC=\"images/pijl.gif\" WIDTH=12 HEIGHT=12 ALT=\"\"><a class=\"".$extra_style."\" href=\"".$pval['link']."?naam=".$pval['naam']."&".$qs_val."=".$pkey."\"><b>".$pval['label']."</b></a></div>
    ";
    } else {
    $menu .= " <div><a href=\"".$pval['link']."?naam=".$pval['naam']."&\"><b>".$pval['label']."</b></a></div>
    ";
    }
    if (!empty($_REQUEST[$qs_val])) {
    $menu .= "<div id=\"".$sub_id."\">
    ";
    foreach ($sub_array as $sval) {
    if ($pkey == $_REQUEST[$qs_val] && $pkey == $sval['parent']) {
    $menu .= "<div>&nbsp;<IMG SRC=\"images/wit.gif\" WIDTH=12 HEIGHT=12 ALT=\"\">&nbsp;<a href=\"".rebuild_link($sval['link'], $qs_val, $sval['parent'])."&naam=".$sval['naam']."\"><b>".$sval['label']."</b></a></div>
    ";
    }
    }
    $menu .= "</div>
    ";
    }
    }
    $menu .= "</div>
    ";
    return $menu;
    }
    // 2 level menu einde[/code:1:f314050119]








  • Je zult toch echt met meer details moeten komen als je wil dat ik iets nuttigs ga zeggen… ;)

    - Bas
  • Ja, ok. Je moet wel informatie krijgen natuurlijk…..
    Met bovenstaande code — /code is er wezenlijk niets veranderd aan mijn oorspronkelijk script. Ik echo alleen de begin- $obj -en constateer dat de volgorde daar goed is. Maar de output van het script levert de verkeerde volgorde. Ik weet gewoon niet hoe ik jouw oplossing kan toepassen in mijn script.
  • Ik geef je geen oplossing, maar een manier om te constateren waar het fout gaat. De truc is nu dat je dat niet alleen op $items kan toepassen, maar op elke willekeurige array. Je moet systematisch gaan zoeken naar het moment dat het fout gaat: dus op regel x gaat het nog goed, maar op regel y klopt het niet, en deze regels (een paar, niet een heel script) kloppen niet. Vervolgens plaats je die informatie weer hier en kunnen wij je hopelijk helpen.

    - Bas
  • Het lijkt erop dat de PHP doet wat de query eigenlijk zou moeten doen: de juiste records filteren. Als ik dan kijk naar de tabel en dan naar wat op het scherm komt dan heeft elk record een parent id van 0. Dat moet je dus met de query doen:
    [code:1:bf19a7217a]
    SELECT *
    FROM dyn_menu
    WHERE parent_id=0
    ORDER BY label ASC
    [/code:1:bf19a7217a]
    wimb
  • WimB:
    ben blij met je reaktie, maar dan worden alleen de hoofd-groepen getoond, en niet de sub-groepen.
    De hoofdgroepen worden gekenmerkt door parent_id = 0 en de sub-groepen door parnet_id=getal. getal correspondeert met de hoofdgroep id.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.