WEB开发网
开发学院WEB开发ASP 一个投票系统的源程序(coveryourasp.com) 阅读

一个投票系统的源程序(coveryourasp.com)

 2000-10-18 10:53:15 来源:WEB开发网   
核心提示:SurveyDescr.asp<!--#include file = "include/Startup.asp"--> <!--#include file = "utils/Survey.asp"--> <% // // NOTE: all sou
SurveyDescr.asp
<!--#include file = "include/Startup.asp"-->
<!--#include file = "utils/Survey.asp"-->

<%
// ============================================
// NOTE: all source code downloaded from CoverYourASP was written by
// James Shaw (unless stated otherwise), and is copyright (c) 2000 by
// James Shaw. You may use this source code on your web sites, but
// please don't publish or distribute in any way.
//
// I would apPReciate an HTML comment in any code you use, i.e.
//     <!-- portions (c) james@CoverYourASP.com-->
// (see Footer(), documented in SSI.asp for details on how to do this)
//
// <shameless plug>
//   Please contact me to discuss any ASP contract work you may have.
// </shameless plug>
// ============================================

// output relevant meta tags
Init( "Survey your readers" );

// output common top of page
Header( 'Survey your readers' );

// output page content
Content ( );

// output common bottom of page
Footer( );

// ============================================
// the content of this page - every page has a function 'Content' that
// is called above.
// ============================================
function Content ( )
{
  Out ( '<td colspan=2 width="80%" valign="top">' );

   // if the survey hasnt been submitted yet...
   if ( !Request.Form.Count )
   {
     //...display some blah, blah
     Out ( 'Finally, surveys come to CoverYourASP! I\'ve been wanting to ask you guys and gals
questions for a long time, and now I can. It\'s up to you if you want to answer of course!' );

     Out ( '<p>Of course, the real benefit to you is that if you tell me what you like I\'ll probably
provide it. If you send in your <a href="Donate.asp">donations</a> the probability increases rather
dramatically!' );

     Out ( '<p>Take the example survey below if you have the time and inclination. I plan to post more
in a special survey category, and start offering incentives to take them.' );

     Out ( '<p>Afterwards, look at the code. I think you\'ll be surprised how simple it is to create
surveys with this code. This page has one function call in it, with just one parameter - the name of the
survey! All questions, answers and results are stored in the database.' );
   }

   // show the survey, or process it's input
   ProcessSurvey ( 'Who are you and what do you think?' );

   if ( !Request.Form.Count )
     Out ( '<p><a href="ShowSource.asp?page=SurveyDescr"><img src=http://www.cncms.com/"images/source.gif" align="right"
border=0></a>Please submit the survey first before looking at the source code - this link is on the result
page too!' );
   else
     Out ( '<p><center><a href="ShowSource.asp?page=SurveyDescr"><img src=http://www.cncms.com/"images/source.gif"
border=0></a></center>' );

  Out ( '</td>' );
  Out ( '<td width="20%" valign="top">' );

   // show rotating banners
   ShowBanners ( 4 );

  Out ( '</td>' );
}
%>


utils/Survey.asp
<%
// ============================================
// NOTE: all source code downloaded from CoverYourASP was written by
// James Shaw (unless stated otherwise), and is copyright (c) 2000 by
// James Shaw. You may use this source code on your web sites, but
// please don't publish or distribute in any way.
//
// I would appreciate an HTML comment in any code you use, i.e.
//     <!-- portions (c) james@CoverYourASP.com-->
// (see Footer(), documented in SSI.asp for details on how to do this)
//
// <shameless plug>
//   Please contact me to discuss any ASP contract work you may have.
// </shameless plug>
// ============================================

// ============================================
// display or process the named survey
// ============================================
function ProcessSurvey ( sName )
{
  // has the survey form been submitted?
  if ( Request.Form.Count )
  {
   // connect to the database
   DBInitConnection ( );

   var sSurvey = "" + Request.Form ( "Survey" );

   // only update the survey when no cookie
   if ( "" == Request.Cookies ( sSurvey ) )
   {
     // get the data from the form and update the database
     // use an enumerator to get name and value
     var e = new Enumerator ( Request.Form );

     while ( !e.atEnd ( ) )
     {
      var oItem = e.item();

      // increment the current number of times this answer has been chosen
      oConnection.Execute ( 'UPDATE SurveyAnswers SET Hits=Hits+1 WHERE Question="' + oItem + '" AND
Answer="' + Request.Form ( oItem ) + '";' );

      e.moveNext ( );
     }

     // note that setting cookie here assumes we are buffering
     // the Reponse.Writes - cookies must be set before any
     // HTML is sent to the client
     Response.Cookies ( sSurvey ) = "1";

     // I'm not setting the 'expires' on the cookie, so it'll go
     // away when the browser is closed. I just wanted to stop
     // the survey incrementing if the page refreshed.
   }

   // now display all the answers to the survey
   Out ( '<p>Thanks for taking part in our "' + sSurvey + '" survey! The answers that everyone has
given so far are shown below:' );

   // the last question we displayed
   var sLast = "";

   // get all the selected answers, sorted by question and hits
   DBGetRecords ( 'SELECT SurveyAnswers.Question,Answer,Hits FROM SurveyAnswers INNER JOIN
SurveyQuestions ON SurveyQuestions.Question=SurveyAnswers.Question WHERE Survey="' + sSurvey + '" AND
Hits>0 ORDER BY SurveyAnswers.Question,Hits DESC;' );

   var fScale;

   while ( !oRecordSet.EOF )
   {
     // display question when it changes
     var sIntQuestion = "" + oRecordSet ( 0 );

     // slice off chars used for sorting
     var sQuestion = sIntQuestion.slice ( 2 );

     // get answer
     var sIntAnswer = "" + oRecordSet ( 1 );

     // slice off chars used for sorting
     var sAnswer = ExpandMacros ( sIntAnswer.slice ( 2 ) );

     var nReaders = oRecordSet ( 2 ) - 0;

     if ( sQuestion != sLast )
     {
      Out ( '<h5>' + sQuestion + '</h5>' );
      sLast = sQuestion;

      Out ( '<font color="red">"' + sAnswer + '" was the top answer (' + nReaders + ' readers)
</font><br>' );

      fScale = 300.0 / nReaders;
     }
     else
     {
      Out ( '"' + sAnswer + '" was chosen by ' + nReaders + ' readers<br>' );
     }

     Out ( '<img src=http://www.cncms.com/"images/Dot.gif" height="8" width="' + (nReaders * fScale) + '"><br>' );

     oRecordSet.MoveNext ( );
   }

   // release the connection ASAP
   DBReleaseConnection ( );
  }
  else
  {
   // some initial instructions
   Out ( '<p>There aren\'t any important instructions when answering these questions - except you
don\'t have to answer any. All are optional - if you don\'t like a question, or none of the answers are
relevant, just move onto the next one!' );

   // connect to the database
   DBInitConnection ( );

   // get the questions from the database
   DBGetRecords ( 'SELECT Question FROM SurveyQuestions WHERE Survey="' + sName + '" ORDER BY
Question;' );

   if ( oRecordSet.EOF )
   {
     Out ( 'No questions were found for survey "' + sName + '"<p>' );
     return;
   }

   // store the questions in an array
   var sIntQuestions = new Array;
   var nQuestions = 0;

   while ( !oRecordSet.EOF )
   {
     sIntQuestions [ nQuestions++ ] = "" + oRecordSet ( 0 );
     oRecordSet.MoveNext ( );
   }

   Out ( '<form action="' + Request.ServerVariables ( 'SCRipT_NAME' ) + '" method="post">' );

   // some hidden fields to pass data through to results page
   Out ( '<input type="hidden" name="Survey" value="' + sName + '">' );

   // now loop through the questions
   for ( var nQuestion=0; nQuestion<nQuestions; nQuestion++ )
   {
     var sIntQuestion = sIntQuestions [ nQuestion ];

     // slice off chars used for sorting
     var sQuestion = sIntQuestion.slice ( 2 );

     // get the answers from the database
     DBGetRecords ( 'SELECT Answer,AnswerType FROM SurveyAnswers WHERE Question="' + sIntQuestion + '"
ORDER BY Answer;' );

     Out ( '<h5>' + sQuestion + '</h5>' );

     while ( !oRecordSet.EOF )
     {
      // get the answer
      var sIntAnswer = "" + oRecordSet ( 0 );

      // slice off chars used for sorting
      var sAnswer = ExpandMacros ( sIntAnswer.slice ( 2 ) );

      var sAnswerType= "" + oRecordSet ( 1 );

      switch ( sAnswerType )
      {
      case 'radio':
        Out ( '<input type="radio" name="' + sIntQuestion + '" value="' + sIntAnswer + '"> ' +
sAnswer );
        break;

      default:
        break;
      }

      Out ( '<br>' );

      // get next answer
      oRecordSet.MoveNext ( );
     }
   }

   Out ( '<p><input type="submit" value="Submit answers">' );
   Out ( '</form>' );

   // release the connection ASAP
   DBReleaseConnection ( );
  }
}

// ============================================
// add links to text where *? macros are found, e.g. *d expands to
// <a href="Donate.asp">Send a donation!</a>
// NOTE: currently assumes expansions are always at end of line
// ============================================
function ExpandMacros ( sText )
{
  var sMacros = new Array (
   '**',
   '*d'
   );

  var sExpansions = new Array (
   '<a href="Contact.asp" target="CYAEXternal">You need to send me feedback!</a>',
   '<a href="Donate.asp" target="CYAEXternal">send a donation!</a>'
   );

  for ( var i=0; i<sMacros.length; i++ )
  {
   var nPos = sText.indexOf ( sMacros [ i ] );

   if ( -1 != nPos )
   {
     sText = sText.slice ( 0, nPos ) + sExpansions [ i ];
     break;
   }
  }

  return sText;
}
%>


utils/Database.asp
<%
// ============================================
// NOTE: all source code downloaded from CoverYourASP was written by
// James Shaw (unless stated otherwise), and is copyright (c) 2000 by
// James Shaw. You may use this source code on your web sites, but
// please don't publish or distribute in any way.
//
// I would appreciate an HTML comment in any code you use, i.e.
//     <!-- portions (c) james@CoverYourASP.com-->
// (see Footer(), documented in SSI.asp for details on how to do this)
//
// <shameless plug>
//   Please contact me to discuss any ASP contract work you may have.
// </shameless plug>
// ============================================

// globals
var oConnection;
var oRecordSet;

// enums

// Connection.State and Recordset.State property
var adStateClosed = 0;     // the object is closed.
var adStateOpen = 1;       // the object is open.
var adStateConnecting = 2;  // the object is connecting.
var adStateExecuting = 4;   // the object is executing a command.
var adStateFetching = 8;     // the rows of the object are being fetched.

// Recordset.Cursor property
var adOpenUnspecified = -1;  // does not specify the type of cursor.
var adOpenForwardOnly = 0;  // (default) a forward-only cursor, i.e. you get only one pass thru the data!
var adOpenKeyset = 1;     // can go in any direction, and as a bonus you'll see changes other users
make. EXPENSIVE!
var adOpenDynamic = 2;   // as Keyset, but also you can see additions/deletions other users make.
EXPENSIVE!
var adOpenStatic = 3;     // can go in any direction, but read-only.

// Recordset.LockType property
var adLockUnspecified = -1;  // does not specify a type of lock.
var adLockReadOnly = 1;   // (default) guess!
var adLockPessimistic = 2;   // guaranteed to work
var adLockOptimistic = 3;   // records locked only when you call Update. fingers crossed
var adLockBatchOptimistic = 4;// required for batch update mode

// ============================================
// example usage:
//   DBInitConnection ( );
//
//   DBGetRecords ( "SELECT * FROM Somewhere" );
//
//   ...use oRecordSet
//
//   DBReleaseRecords ( );   // optional step
//
//   DBGetRecords ( "SELECT * FROM SomewhereElse" );
//
//   ...use oRecordSet
//
//   DBReleaseRecords ( );   // optional step
//
//   DBReleaseConnection ( );
// ============================================

// ============================================
// initializes database variables for first use on page - leave it to the
// last possible second before calling this function
// ============================================
function DBInitConnection ( )
{
  // don't open it again if already opened!
  if ( oConnection != undefined )
   return;
    
  // you can open Recordset objects without a Connection object, but
  // it's far less efficient if you are opening multiple Recordsets.
  //
  // if you don't create a Connection object ADO creates a new one for
  // each new Recordset.Open, even if you use the same connection string.
  oConnection = Server.CreateObject( 'ADODB.Connection' );

  // open the database - use MapPath to make relative path into physical path
  // NOTE: keep your database path a secret - nasty people are everywhere!
  // 2. change the 4.0 to 3.51 when using access 97
  oConnection.Open( 'Provider=Microsoft.Jet.' + sDBDriver + '; Data Source=' + Server.MapPath (
sDBPath ) );

  // create a Recordset
  oRecordSet = Server.CreateObject( 'ADODB.Recordset' );
}

// ============================================
// tidies up after DBInitConnection
// ============================================
function DBReleaseConnection ( )
{
  // don't release the connection if not connected!
  if ( oConnection == undefined )
   return;

  // close and delete the Recordset object
  DBReleaseRecords ( );

  oRecordSet = undefined;

  // Don't call Close if the Recordset failed to Open properly, i.e. its
  // State is still adStateClosed (0)
  if ( oConnection.State != adStateClosed )
   oConnection.Close();

  oConnection = undefined;
}

// ============================================
// executes the passed in SQL statement and returns a read-only
// forward-only oRecordSet object
// ============================================
function DBGetRecords ( sSQL )
{
  // if the Recordset is already open, close it
  DBReleaseRecords ( );

  // we could use oRecordSet = oConnection.Execute( sSQL ) here
  // but then we will always get back a read-only, forward-only cursor.
  // (admittedly this is the most used type, but still)

  // use oRecordSet.Open and we have far more control. For details
  // read the definitions of the enums at the top of this file.

  // remember that this can fail if passed garbage, and hence the
  // Recordset will remain closed, State == adStateClosed
  oRecordSet.Open ( sSQL, oConnection, adOpenForwardOnly, adLockReadOnly );
}

// ============================================
// tidies up after DBGetRecords
// ============================================
function DBReleaseRecords ( )
{
  // when you have finished with an open Recordset object, call the
  // Close method to release its resources. You can call Open again.

  // Don't call Close if the Recordset failed to Open properly, i.e. its
  // State is still adStateClosed
  if ( oRecordSet != undefined && oRecordSet.State != adStateClosed )
   oRecordSet.Close();
}
%>




Tags:一个 投票

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接