Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] DB-Einträge nach Anfangsbuchstabe auslesen - Problem bei Zahlen/Sonderzeic

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] DB-Einträge nach Anfangsbuchstabe auslesen - Problem bei Zahlen/Sonderzeic

    Hallo zusammen!

    Ich möchte auf meiner Seite eine große Liste verschiedener Serien einbauen,
    wobei ich die Serien alphabetisch anordnen will.

    Soweit bin ich schonmal:
    Anime4ever.info | Anime-Index

    Allerdings habe ich bisher nur die Buchstaben A-Z untergebracht,
    es gibt aber auch Serien, die mit einem Punkt, einer Zahl oder sonstwas anfangen.
    Nun suche ich eine Möglichkeit, diese auch irgendwie anzeigen zu lassen.

    Ich möchte all diese Serien vor [A] mit dem Link [#] (oder so ähnlich) anzeigen lassen.

    Hier der Code der Paginierung:

    PHP-Code:
    <?php

    $letters 
    = array(=> "a"=> "b"=> "c"=> "d"=> "e"=> "f"=> "g"=> "h"=> "i"=> "j"10 => "k"11 => "l"12 => "m"13 => "n"14 => "o"15 => "p"16 => "q"17 => "r"18 => "s"19 => "t"20 => "u"21 => "v"22 => "w"23 => "x"24 => "y"25 => "z");
    $lettere = array(=> 0=> 0=> 0=> 0=> 0=> 0=> 0=> 0=> 0=> 010 => 011 => 012 => 013 => 014 => 015 => 016 => 017 => 018 => 019 => 020 => 021 => 022 => 023 => 024 => 025 => 0);

    $sql "SELECT " $select " FROM " $tabelle " WHERE " $required "!='' ORDER BY " $select;
    $sql sql_query($sql"anime");

    $count mysql_num_rows($sql);
    while ( 
    $row mysql_fetch_object($sql) )
    {
        foreach(
    $letters as $lettern => $letter)
        {
            if ( 
    substr(strtolower($row->$select), 01) == $letter)
            {
                
    $lettere[$lettern] = "1";
                break;
            }
        }
    }
    ?>
    <p class="c">
    <?php
    foreach ($lettere as $lettern => $lettert)
    {
        if ( 
    $lettert == "1" )
        {
            echo 
    '[<a href="' $base_url '&amp;&amp;letter=' $letters[$lettern] . '">' strtoupper($letters[$lettern]) . '</a>] ';
        }
        else
        {
            echo 
    "[" strtoupper($letters[$lettern]) . "] ";
        }
    }
    ?>
    </p>
    <?php

    if ( $_GET['letter'] == "" 
    {
        
    $letter "a";
    }
    else
    {
        
    $letter substr(strtolower($_GET['letter']), 01);
    }

    ?>
    Dabei wird überprüft, ob es überhaupt Einträge mit dem entsprechenden Anfangsbuchstaben gibt,
    wenn nicht, wird der Eintrag erst gar nicht verlinkt.

    Nun wäre das erste Problem, dass man einen "Buchstaben" hinzufügen muss,
    der alles beinhaltet außer A-Z. Kann man das so formulieren? Oder muss man
    alles aufzählen, was er beinhalten kann? (Wäre ziemlich umständlich...)

    Dann noch die eigentliche Abfrage:

    PHP-Code:
    $abfrage "SELECT * FROM " $tabelle " WHERE " $select " LIKE '" addslashes($letter) . "%' AND " $required "!='' ORDER BY " $select ;
        
    $sql sql_query($abfrage"anime");
    $count mysql_num_rows(mysql_query($abfrage));
        
    if ( 
    $count != "0" )
    {
    ...

    Die muss ja dann auch anders lauten, da es bei dem neuen Link ja mehrere Möglichkeiten gibt.
    Kann man die so formulieren, dass für $letter z.B. ein Array mit allen Möglichkeiten durchgegangen wird?

    Ich hoffe echt, mir kann damit jemand weiterhelfen...

  • Teela
    antwortet
    Die Links der Buchstaben oben waren ja das geringste Problem,
    der eigentliche Knackpunkt war ja, dass er auf der #-Seite
    alles außer A-Z ausliest.

    Ist aber auch egal, wie man sieht, habe ich es irgendwie doch auf die Reihe bekommen ^^

    Trotzdem danke für eure Hilfe ^^

    Einen Kommentar schreiben:


  • lazydog
    antwortet
    Zitat von Teela Beitrag anzeigen
    Bei meinem Script sollen auf einer Seite aber immer nur die Einträge von einem Buchstaben angezeigt werden
    Also mindestens bei dem von dir gezeigten Script ist das ja auch nicht der Fall. Du gibst auch alle Buchstaben (aber nicht die Titel) auf einer Seite aus. Dazu kannst du aber sehr wohl die etwas vereinfachte Funktion von Zergling benutzen:
    PHP-Code:
    <?php
    $sql 
    "
        SELECT 
            select 
        FROM 
            tabelle 
        WHERE 
            required != '' 
        ORDER BY 
            select"
    ;
    $sql sql_query($sql) or exit(mysql_error());
    foreach (
    array_merge(array('#'), range('A''Z')) as $char){
        
    $letters[$char] = 0;
    }

    while ( 
    $row mysql_fetch_object($sql) ){
        
    $initial getInitial($row->select);
        
    $letters[$initial] ++;
    }

    foreach (
    $letters as $letter){
        echo 
    $letter == "[$letter]" "[<a href='$base_url&amp;letter='$letter'>$letter</a>]";
    }


    function 
    getInitial($string){
        
    $initial strtoupper(substr($string01));
        if (
    preg_match('/^[A-Z]$/i'$initial) {
            return 
    $initial;
        }
        else{
             
    // Anfangsbuchstabe ein anderes Zeichen? Dann Raute als Default
            
    return '#';
        }
    }
    ?>

    Einen Kommentar schreiben:


  • HPR1974
    antwortet
    benutz ein regulären ausdruck...

    Einen Kommentar schreiben:


  • Teela
    antwortet
    Zitat von phpler Beitrag anzeigen
    Geht denn nicht, einfach die beiden Arrays zu erweitern:
    zum Beispiel für Umlaute:
    für letters: 26 => "ä", 27=>"ö",28=>"ü",.............
    und so weiter für alle Einträge, die du benötigst.
    $lettere muss dann einfach ebenfalls nur ergänzt werden mit den Arrayfeldnamen aus $letters und alle Werte auf 0.
    Das kann ich zwar machen, allerdings müsste ich dann für jedes weitere Zeichen einen neuen Listenpunkt erstellen. Ich möchte aber, dass alle Zeichen außer A-Z unter einem einzigen Punkt zusammengefasst werden.

    Ist zwar ein tolles Script, leider funktioniert es so, dass es alles auf einer Seite anzeigt. Es läuft durch alle Buchstaben und nimmt für den letzten einfach das, was übrig ist. Bei meinem Script sollen auf einer Seite aber immer nur die Einträge von einem Buchstaben angezeigt werden.

    Daher brauche ich eine Abfrage in der Form:

    Wenn $letter == "." dann soll er alle aus der Tabelle auslesen, wo der erste Buchstabe entweder "." oder "1" oder "2" etc ist.

    Ich hatte das bisher immer mit dem Befehl LIKE '" . $letter . "%' gelöst,
    wie kann ich bei diesem Befehl mehrere Möglichkeiten angeben,
    von denen eine zutreffen muss (praktisch ein "oder" reinbringen)?

    Einen Kommentar schreiben:


  • Chriz
    antwortet
    PHP/MySQL: Datensätze gruppiert nach Anfangsbuchstabe - phpfriend.de

    Einen Kommentar schreiben:


  • phpler
    antwortet
    Zitat von Teela Beitrag anzeigen
    [php]
    <?php

    $letters = array(0 => "a", 1 => "b", .......
    $lettere = array(0 => 0, 1 => 0, ......
    Geht denn nicht, einfach die beiden Arrays zu erweitern:
    zum Beispiel für Umlaute:
    für letters: 26 => "ä", 27=>"ö",28=>"ü",.............
    und so weiter für alle Einträge, die du benötigst.
    $lettere muss dann einfach ebenfalls nur ergänzt werden mit den Arrayfeldnamen aus $letters und alle Werte auf 0.

    Einen Kommentar schreiben:

Lädt...
X