2010-09-14 4 views
-2

Voici la table dans laquelle je récupère les données d'une base de données SQLite. Son ayant beaucoup d'enregistrements, si près de ce bouton ADD j'ai besoin de quelque chose comme |< < > >| qui ferait la fonction de pagination à chaque fois que je clique. En outre, outre la table, chaque en-tête (par exemple, UserName UserId) nécessite un bouton de tri . Quelque chose comme un bouton ^. S'il vous plaît, aidez-moi à trouver la solution. Merci.Comment faire du paging et du tri dans un programme Perl CGI?

#!C:\perl\bin\perl.exe 

    use CGI; 
    use CGI qw/:standard/; 
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 
    my $q = new CGI; 
    use DBI; 
    use CGI qw(:all); 
    use warnings; 
    print $q->header (); 
    my $dbh = DBI->connect(
     "dbi:SQLite:DEVICE.db", 
     "", "", 
     { 
      RaiseError => 1, 
      AutoCommit => 1 
     } 
    ); 
    my @rows =(); 
    my $sql = "SELECT UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList"; 
    my $sth = $dbh->prepare($sql) or die("\n\nPREPARE ERROR:\n\n$DBI::errstr"); 
    $sth->execute or die("\n\nQUERY ERROR:\n\n$DBI::errstr"); 
    print '<table>'; 
    print "<tr>"; 
    print "<th>$sth->{NAME}->[0]</th>"; 
    print "<th>$sth->{NAME}->[1]</th>"; 
    print "<th>$sth->{NAME}->[2]</th>"; 
    print "<th>$sth->{NAME}->[3]</th>"; 
    print "<th>$sth->{NAME}->[4]</th>"; 
    print "<th>$sth->{NAME}->[5]</th>"; 
    print "<th> EDIT </th>"; 
    print "<th> DELETE </th>"; 

    while (my @row = $sth->fetchrow_array) { 
    print " 
    <tr> 
    <td>$row[0]</td> 
    <td>$row[1]</td> 
    <td>$row[2]</td> 
    <td>$row[3]</td> 
    <td>$row[4]</td> 
    <td>$row[5]</td> 
    <td><A HREF=\"\">EDIT</A></td> 
    <td><A HREF=\"\">DELETE</A></td> 
    </tr>"; 
    } 
    print "<tr style='background-color:#CDC9C9;'><td><A HREF=\"http://localhost/cgi- 
    bin/AddUser.cgi\">ADD</A></td><td></td><td></td><td></td><td></td></tr>"; 
    print"</table>"; 
    $sth->finish(); 
    $dbh->commit(); 
    $dbh->disconnect; 

    print <<END_HTML; 
    <html> 
    <head><title></title></head> 
    <body> 
    <form action="UsersList.cgi" method="get"> 
    <TABLE align="center"> 
    <TR> 
    <TD align="left"> 
    <input type="hidden" name="submit" value="Submit"> 
    </TD> 
    </TR> 
    </TABLE> 
    </form> 
    </body></html> 
    END_HTML 

    ---------------------------------------- 
+0

S'il vous plaît, apprenez à mettre en forme vos questions correctement. Tout le texte est formaté en code. Cela met probablement certaines personnes au monde à répondre à vos questions. –

+0

Vous semblez maintenant avoir modifié ce message pour supprimer votre question actuelle. Tout ce qui nous reste est du code. Ce n'est pas ce que je suggérais du tout :-) –

+4

Cela montre un incroyable manque de respect et de mépris envers les personnes qui vous aideront quand vous passez si peu de temps à préparer votre question pour les bases de l'orthographe, du formatage, . Pourquoi devrions-nous passer du temps à répondre à une question que vous ne prenez pas assez de temps pour poser avec respect? –

Répondre

0

L'un des (nombreux) avantages que vous obtiendriez d'utiliser DBIx::Class pour votre accès à la base est que toutes les recherches ont un support intégré pour la pagination.

Alternativement, vous pourriez trouver quelque chose comme Data::Page pour être utile. En ce qui concerne le tri, il est probablement préférable de le faire dans votre requête SQL avec une clause 'sort'.

+0

J'ai trouvé le fichier dbix class rar aussi bien qu'un fichier data :: page rar ... Je les ai téléchargés dans mon lecteur d mais quand j'ai essayé d'utiliser le code de pagination puis j'ai eu l'erreur ... pourquoi est-ce le cas? Où suis-je censé enregistrer le fichier rar ..? – sonya

+0

Le package de classe de base "Class :: Accessor :: Chained :: Fast" est vide. (Vous devez peut-être 'utiliser' le module qui définit ce paquet en premier, ou rendre ce module disponible dans @INC (@INC contient: C:/Perl/site/lib C:/Perl/lib.). C: ligne 4 /Perl/site/lib/Data/Page.pm BEGIN échoué - compilation avortée C: ligne de /Perl/site/lib/Data/Page.pm 4. Compilation a échoué dans C à besoin :/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/ligne UsersList.cgi 7. BEGIN a échoué - compilation interrompue à C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/UsersList .cgi ligne 7. – sonya

+0

j'avais inclus ce code dans mon programme .. use Data :: Page; mon $ page = Data :: Page-> new(); $ page-> total_entries ($ total_entries); $ page-> entries_per_page ($ entries_per_page); $ page-> current_page ($ current_page); print "Première page:", $ page-> first_page, "\ n"; print "Dernière page:", $ page-> last_page, "\ n"; print "Première entrée sur la page:", $ page-> first, "\ n"; print "Dernière entrée sur la page:", $ page-> last, "\ n"; – sonya

1

Ok, la première chose, obtenir et lire Learning Perl. C'est, de loin, le meilleur livre pour apprendre Perl. Ensuite, jetez un oeil à Ovid's CGI Course. Troisièmement, votre code a quelques problèmes majeurs, et vous devrez marcher avant de courir.

J'ai rangé et commenté le diable hors de votre code.

#!C:\perl\bin\perl.exe 

# Windows perl ignores the shebang, except to check for flags and 
# arguments to start the Perl interpreter with. 
# Your webserver might use it though 

# You forgot to enable strict. You enabled warnings further down in 
# your code. These two pragmas will help you write bug free code by 
# catching many errors. 
# 
# Keep your module and pragma usage at the top of your 
# scripts. It aids readability. 

use strict; 
use warnings; 

# Using CGI is a good idea, but you only need to use CGI one time. 
use CGI qw/:all/; 

# These are good while learning and debugging. 
# Do not use them in production code. 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 

use DBI; 

my $dbh = DBI->connect(
    "dbi:SQLite:DEVICE.db", 
    "", "", 
    { 
     RaiseError => 1, 
     AutoCommit => 1 
    } 
); 

# Don't use indirect object notation. It can lead to subtle bugs. 
# Use the arrow notation for method invocation instead. 
my $q = CGI->new(); 
print $q->header (); 

# The @rows array was doing nothing. 




# No need to commit when autocommit is on. 
$dbh->commit(); 
$dbh->disconnect; 

# Here we get the html table in a string. 

my $table = generate_data_table($dbi); 

# And here we print your whole HTML block with the table interpolated 
# into the the main text. As it was, the HTML page was printing AFTER 
# the table you generated. 
# 
# I put a crappy improper stylesheet in the header of your html page. 
# Unless you are only doing the most rudimentary HTML work, learn to 
# use CSS properly. Your time will be repayed hundreds of times over. 
# For only rudimentary work, there's still a good chance you'll break 
# even on any time you invest in learning CSS. 

print <<END_HTML; 
<html> 
<head> 
    <title>Add Users</title> 
    <style> 
     .adduser { 
      background-color:#CDC9C9; 
     } 
    </style> 
</head> 
<body> 

    <form action="UsersList.cgi" method="get"> 

$table 

    <input type="hidden" name="submit" value="Submit"> 
    </form> 

</body> 
</html> 

END_HTML 


# Use subroutines to group related actions. 
sub generate_data_table { 
    my $dbi = shift; 

    my $sql = "SELECT UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList"; 

    my $sth = $dbh->prepare($sql) 
     or die("\n\nPREPARE ERROR:\n\n$DBI::errstr"); 

    $sth->execute 
     or die("\n\nQUERY ERROR:\n\n$DBI::errstr"); 

    # Actually generate the table HTML 
    my $table = '<table><tr>'; 

    # Header 
    $table .= join '', map "<th>$sth->{NAME}[$_]</th>\n", 0..5; 
    $table .= "</tr>\n"; 

    # Normal Rows 
    while (my @row = $sth->fetchrow_array) { 
     $table .= '<tr>', 
     $table .= join '', map "<td>$row[$_]</td>\n", 0..5; 

     $table .= join "\n", 
      '<td><A HREF=\"\">EDIT</A></td>' 
      '<td><A HREF=\"\">DELETE</A></td>' 
      "</tr>\n"; 
    } 

    # Special Row 
    # 
    # Don't use inline CSS, use classes and either group all your css at 
    # the top of your html code, or better yet, load an external stylesheet. 

    # There is no reason to have to escape quotes when working with Perl CGI. 
    # First, in html ' and " are interchangeable, so you can pick a quote 
    # that doesn't need esacaping. 
    # 
    # Finally, if you MUST use both ' and " in a single string, you can use 
    # Perl's quoting operators (q and qq) to select a safe delimiter that will allow you 
    # to avoid escaping. 

    $table .= 
      "<tr class='adduser' >" 
     . '<td><a HREF="http://localhost/cgi-bin/AddUser.cgi">ADD</a></td>' 
     . '<td></td><td></td><td></td><td></td></tr>' 
     . "</table>"; 

    $sth->finish(); 

    return $table; 
} 

Enfin, pour gérer le tri et la pagination, vous pouvez utiliser une bibliothèque comme d'autres l'ont suggéré, ou vous pouvez modify your SQL query. Les mots-clés que vous souhaitez pour saisir uniquement une plage de résultats sont LIMIT et OFFSET, utilisez une clause ORDER BY pour trier votre jeu de résultats. Ajoutez des paramètres à vos formulaires pour indiquer les méthodes de tri ou la plage que vous souhaitez.

+0

Merci beaucoup pour votre temps et très très informations importantes que vous me avez fourni sir.Thanks beaucoup et oui, vous avez raison je dois avoir une forte base avant que j'aller plus loin, Merci encore. – sonya

+0

Quelqu'un peut-il me dire, pourquoi ma réputation est descendue de 6 à 1 dans la nuit? – sonya

+0

jene, RELAX! SO reçoit beaucoup de messages qui se lisent comme "Comment U X? Ecrivez-moi le codez!". Apparemment, vous avez réussi à amener les gens à vous mettre dans cette classe. Je ne le vois pas comme ça. Pour moi, vos problèmes de messages semblent provenir de l'anglais étant votre deuxième langue (basée sur une partie de votre utilisation) et être submergé par SO et Perl et CGI et HTML et CSS et SQL. Six grandes choses à apprendre tout à la fois. En tout cas, le SO semble récompenser une écriture soignée et formelle. À temps votre représentant se rétablira. Il craint d'être downvoted, mais il attire votre attention sur un problème. Dommage que vous deviez deviner ce que ça pourrait être. – daotoad

Questions connexes