<% // ============================================ // 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="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="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>' ); }
// 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;
// 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 ) );
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 ] );
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
// ============================================ // 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(); } %>