Softwareontwikkeling FAQ: ASPMet dank aan gorgi_19.Inhoudsopgave
Links
Boeken
Algemene tipsGebruik geen request(variabele)Definieer altijd of je Request.Form, Request.Querystring of Request.Cookies, etc. gebruikt. Op deze wijze is er minder kans op malafide code of input die je niet verwacht.Filter single quotes uit je input als je ze wilt gebruiken in een queryStel je hebt de query:ASP:
We vullen vervolgens in, in het veld blaat: Gorgi's Game. De query zou er dan uit zien als: ASP:
en je ziet zelf al dat dit fout gaat door de single quote. Er moeten op een of andere manier zorgen dat deze dus niet meer voorkomt; dit kan door middel van escapen. Als we de ' vervangen door '' (2x een single quote achter elkaar) dan treedt dit probleem niet meer op. Een betere code zou dan ook zijn: ASP:
Geen include bestanden niet de extensie .inc, maar .inc.aspHet bestand foobar.inc is anders gewoon te downloaden als deze in een publieke plaats staan. Foobar.inc.asp niet.Code altijd met Option Explicit OnHiermee wordt je gedwongen om je variabelen te definiëren.ASP:
Kan dus niet meer; iAantal is niet gedefinieerd. Echter je maakt niet fouten als: ASP:
waarbij er niets op het scherm verschijnt. Een goede syntax is nu: ASP:
Veel gestelde vragenWat is ASP?ASP staat voor Active Server Pages. In tegenstelling tot wat veel mensen denken, is asp geen taal, maar een platform. In feite bestaat ASP maar uit een paar objecten; de meest gebruikte zijn:
Ok, het is een platform. Welke taal heb ik dan nodig?Op Internet zijn de meeste voorbeelden in VBScript in combinatie met ASP. Dit is ook het meest gebruikt. Echter, je kan ook JScript of Perl gebruiken in combinatie met ASP.De VBScript en JScript language reference is te downloaden op http://www.microsoft.com/technet/scriptcenter/default.mspx. Wat heb je nodig voor ASP?In combinatie met Internet Information Services (IIS / Windows based)ASP 2.0 draait op IIS 4.0 en Personal web server. IIS 4.0 wordt geleverd bij Windows NT 4.0 Server of hoger. Personal Web Server kan gedraaid worden op Windows NT 4.0 Workstation of Windows 98. Voor beiden moet je het NT Option Pack 4.0 installeren. ASP 3.0 draait op IIS 5.0 (Windows 2000), IIS 5.1 (Windows XP) of IIS 6.0 (Windows 2003). Tussen deze laatste drie zit voor ASP 3.0 geen verschil. In combinatie met Apache ASP is echter ook draaibaar op Apache. Zie bijvoorbeeld http://freshmeat.net/proj...sp/?topic_id=92%2C49%2C90 voor de combinatie met Perl. Voor de combinatie VBScript / JScript met Apache: http://wwws.sun.com/software/chilisoft/index.html Hoe verander ik de enters in een textbox naar HTML-enters?ASP:
Mensen plaatsen HTML-code in mijn applicatie! Hoe voorkom ik dit?ASP:
En hoe kan ik deze weer terugzetten naar gewone HTML?ASP:
Ik heb een frames pagina, index.html, met daarin 2 pagina's. Pagina1.asp en pagina2. asp. Echter, als ik index.html laadt, wordt het Session_OnStart event 2 maal uitgevoerd! Hoe kan dit?Het is niet beter te verwoorden dan EfBe heeft gedaan in deze post.Ik heb een ASP pagina, maar nu wil ik daar ook een grafiek bij hebben.. Hoe doe ik dit?Een hele mooie tutorial is hiervoor geschreven en te vinden op http://www.4guysfromrolla.com/webtech/032603-1.shtml.Ik gebruik een upload component. Echter, zodra ik ENCTYPE="multipart/form-data" gebruik, kan ik geen Request.Form meer gebruiken?Alles is nu encoded, dus ook je form variabelen. Meestal bieden de upload componenten wel een oplossing voor het probleem. Zie de documentatie van je component.Hmmm… Ik lees wel dat ik de schrijfrechten moet wijzigen van het IUSR_account in het security tabblad, maar deze heb ik niet.In Windows XP is deze verborgen. Je kan hem weer zichtbaar maken. Zie hiervoor http://www.livio.net/main/writepermissions.asp.Help! M'n upload form doet het niet!In 99% van de gevallen ben je vergeten om je form tag goed te zetten.Dus niet: HTML:
maar: HTML:
Ik wil een " gebruiken in een string, maar dit pikt hij niet. Hoe zorg ik dat ik wel een " weer kan geven?De meest eenvoudige methode is escapen door hem te 'verdubbelen'. Een voorbeeld:ASP:
wordt weergegeven als: Dit kan je doen door middel van vbCrLf (Visual Basic Carriage Release Line Feed) Voorbeeld: ASP:
levert op: ASP:
Sommigen zeggen dat ik <% Response.Write foobar %>, anderen zeggen dat ik <%= foobar %> moet gebruiken. Wat is correct?In deze context zijn beiden correct en gaat het meer uit van een 'netheidsvoorkeur'.ASP:
levert exact hetzelfde op als ASP:
Als de een niet werkt, zal de ander ook niet werken. Debuggen in ASPHet debuggen van een asp-applicatie wordt door veel mensen als lastig ervaren, terwijl dit helemaal niet zo hoeft te zijn. Om een probleem op te lossen, is het van belang om er achter te komen wat er fout gaat. Om achter een fout te komen, hanteer ik altijd het volgende stappenplan:1. Controleer op Norton AntivirusZet Script Blocking uit; deze zorgt er voor dat een pagina's niet meer laden. Zie hiervoor ook dit Symantec artikel.2. Controleer of een simpele pagina het wel doetEen goed voorbeeld voor VBScript is:ASP:
Als je dit niet op je scherm krijgt, dan heb je geen probleem met je code, maar zit er iets anders fout. Een mogelijke fout kan bijvoorbeeld de Script Blocking van Norton Antivirus zijn. 3. Zorg dat je de foutmelding zietStandaard staat Internet Explorer zo ingesteld, dat je alleen 'vriendelijke foutmeldingen' ziet, dus zonder errors en code, terwijl je dit nu net wel wil zien. Je kan deze optie uitzetten door:Tools > Internet Options > Advanced > Show Friendly http Errors uitvinken (staat onder het kopje 'browsing'). 4. Comment eventuele "On Error Resume Next"Dit statement zorgt er voor dat fouten genegeerd worden, terwijl je ze juist wel wilt zien. Plaats er daarom een single quote voor (zodat het als commentaar en niet als statement wordt gezien) of haal het tijdens het debuggen weg. Immers, de fouten moeten nu juist te voorschijn komen.Normaal: ASP:
Debugmodus: ASP:
5. Zorg dat je de 'foute' variabele op het scherm krijgtPHP kent error reporting, ASP.Net heeft het Tracing object; ASP heeft niets van dit alles.Wil je debuggen, dan zul je het op de handmatige wijze moeten doen door middel van Response.Write: ASP:
6. Tik de foutmelding, eventueel gedeelten daarvan, in op GoogleJe bent niet de eerste met de fout! Zorg er wel voor dat je de engelse foutmelding intikt. Google is een enorm snelle bron om oplossingen te vinden, met voorbeeldcode.Krijg je geen foutmelding, controleer dan je code op oneindige loops. Vaak voorkomende foutmeldingen en oplossingenExpected integer constantEen constante van het type integer werd verwacht. Meestal gaat dit fout icm met het maken van dynamische arrays. De volgende constructie mag niet en levert de fout op:ASP:
Een goede constructie is: ASP:
Tip: Mocht je al waarden in je array hebben staan, die je wilt bewaren, gebruik dan: ASP:
Item cannot be found in the collection corresponding to the requested name or ordinalDeze foutmelding komt voor in combinatie met database connecties. Je wilt een veld gaan ophalen, welke niet in de recordset staat. Stel je hebt de query:SQL:
De volgende constructie levert dan een foutmelding op: ASP:
De reden: adres zit niet in de recordset; we hebben immers alleen maar "naam" er in laten zetten. Verander, om het probleem op te lossen, bijvoorbeeld de query in: SQL:
Tip: Het probleem kan ook duiden op een typefout. Stel je hebt de foute code: ASP:
Hierin staat adres niet tussen quotes. Het wordt dan opgevat als een variabele adres (als Option Explicit niet gedefinieerd of uit staat). Aangezien adres leeg is (we hebben nergens deze variabele gevuld, staat er voor de parser eigenlijk: ASP:
En dit laat al de incorrectheid zien. [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x9dc Thread 0xb5c DBC 0x1468fe4 Jet'Deze foutmelding hangt samen met de connectie naar de database. Meestal komt deze doordat de database niet gevonden is. Kortom, het pad naar de database is niet correct. Controleer of de locatie goed is.Stel je hebt bijvoorbeeld als connectionstring de code: ASP:
Output deze naar het scherm door middel van de regel: ASP:
Je zal dan iets krijgen van bijvoorbeeld: Controleer of dit laatste pad bestaat. Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current recordDeze fout hangt samen het uitlezen van een recordset, welke leeg is. Om de fout goed te begrijpen, is een beetje achtergrond informatie nodig.Een recordset is vergelijkbaar met een tabel. Stel, het resultaat van een query is weergegeven in de volgende recordset, welke we iets nader gaan bekijken:
ASP:
Goed, we hebben op dit punt een recordset geopend. Echter, als we nu doen: ASP:
Krijgen we de eerder genoemde foutmelding. Waarom? We hebben de recordset geopend, maar we hebben nog geen record aangegeven. We moeten dus de recordset ook nog gaan lezen: ASP:
Ook geldt dat als de recordset nu leeg is (dus we geen waarden hebben teruggekregen uit de database) de ook deze foutmelding krijgen. Dan moeten we het statement iets uitbreiden en controleren of er uberhaupt wel waarden zijn teruggegeven: ASP:
Het kan echter ook gebeuren dat we niet 1, maar 0 of meerdere records willen uitlezen. Hiervoor kunnen we de volgende code gebruiken: ASP:
Wat vaak vergeten wordt, is de ObjPagingRS.MoveNext. Zonder deze krijg je een oneindige loop en blijft je applicatie aan het laden. Arguments are of the wrong type, are out of acceptable range, or are in conflict with one anotherOok deze fout komt voor in combinatie met database toegang. Vooral als deze database Microsoft Access is. Een mogelijke, foutieve query is:SQL:
Voor Access is namelijk SQL:
Niet gelijk aan SQL:
In het eerste geval moet het veld in je database een tekstveld zijn. In het tweede geval moet het veld in je database een numeriek veld zijn. Samengevat: Teksten moeten aangegeven worden door middel van 'tekst'. Nummers mogen geen single quotes bevatten. Subscript out of rangeDe meest voorkomende situatie is in combinatie met arrays. Stel je hebt 5 elementen in je array en je wilt het 6e element hebben.Voorbeeld: ASP:
De drie zit in dit geval buiten de range en zit dus niet in de array. [Microsoft][ODBC Microsoft Access Driver] Too many client tasksDeze fout kan voorkomen als niet alle connection - en recordset objects netjes worden afgesloten. Sluit deze daarom ook altijd en vernietig deze.Voorbeeld: ASP:
In het laatste gedeelte is te zien dat we de boel vernietigen (op Nothing zetten, resources vrijgeven) en de connectie sluiten (objPagingConn.close) [Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable queryNTFS-rechten goed zetten. Dat wil zeggen: IUSR_computernaam account iig schrijfrechten geven op de folder waar de database in staat. Ook moet gecontroleerd worden of de database niet readonly is. Dit kan gebeuren als een database bijvoorbeeld van een cd-rom gekopieerd is.Een KB artikel, waarin alles goed uitgelegd wordt, staat hier. Zie verder ook http://www.webwizguide.info/asp/faq/server_permissions.asp Een andere mogelijkheid is dat de database 'gelocked' is. Dit kan gebeuren als je bijvoorbeeld de database nog open hebt staan; door middel van bijvoorbeeld Microsoft Access. Dit mag niet; Microsoft Access moet afgesloten zijn. The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content.Deze komt komt voor als je nog http headers wilt sturen naar de client, terwijl er al content gestuurd is. Let dan ook op lege spaties bovenaan je pagina. Daarnaast moet Response.Buffer op True staanEen voorbeeld waarbij het fout gaat: ASP:
Zoals je ziet is er al eerst een stukje tekst naar de client gestuurd. (Blaat). Vervolgens wordt er een header gestuurd (Response.Redirect) Een goed voorbeeld is dan ook: ASP:
Of, iets uitgebreider: ASP:
Als de querystring "ikke" de waarde "ja" heeft, dan wordt er geredirect, anders wordt blaat op het scherm neer gezet. Response.Buffer staat nergens in de code genoemd. In IIS 4.0 en PWS is de standaardwaarde False. Daar moet hij dus wel genoemd worden. In IIS 5.x en hoger staat deze standaard op True. Daar hoeft hij dus niet expliciet neergezet te worden. Active Server Pages error 'ASP 0131' Disallowed Parent PathAls eerste: wat is een parent path? Stel we veronderstellen de volgende code:ASP:
Het gebruik van .. geeft aan dat je naar de parent wil; hier gebruik je dus parent paths. In IIS 4.0 en IIS 5.x staan deze by default op enabled en heb je geen probleem. Echter, Microsoft heeft zich later bedacht in verband met de veiligheid en heeft in IIS 6.0 deze standaard op disabled staan. Ook de BaseLine Security Advisor geeft het advies om hem op disabled te zetten, zodat het 'opeens' ook in disabled kan staan, in IIS 5.x Om het te enablen /disablen, zie dit artikel. Permission denied (Met email c.q. CDONTS)Dit heeft te maken met een rechtenprobleem; het IUSR_computernaam account heeft niet genoeg rechten op bepaalde folders. Voor een oplossing, zie http://www.asp101.com/samples/faq/faq_email.asp.Server.CreateObject FailedHet is niet gelukt om een bepaald object aan te maken op de server. Stel je hebt bijvoorbeeld de volgende code:ASP:
Mocht je deze foutmelding krijgen, dan is of het object helemaal niet geïnstalleerd (in bovenstaand geval was Persists.Upload helemaal niet aanwezig) of niet goed geregistreerd (e.g. de benodigde dll waren niet te vinden). Type mismatchDit duidt op een eenvoudige tikfout in je applicatie. Meestal is ook de lijn gegeven. Controleer ook de regels rondom je code op tikfouten, niet afsloten haakjes, vergeten quotes, e.d.Number of query values and destination fields are not the sameHet aantal opgegeven velden en het aantal opgegeven variabelen is niet gelijk.Stel je hebt de query: SQL:
De foutmelding treedt dan op. De reden: Je wilt 2 kolommen gaan gebruiken (kolom1 en kolom2, maar je geeft maar 1 waarde). Een complexer ogend voorbeeld, maar wat eigenlijk nog gewoon op bovenstaande neerkomt: ASP:
Syntax error (missing operator) in query expressionEr is iets mis in je query; bepaalde onderdelen lijken te missen. Stel we hebben het volgende stukje code:ASP:
Bij deze code kan de fout optreden. Hoe pak je nu zo een fout aan? Je weet in welke regel de fout zit. Je weet verder dat er een fout in je SQL syntax zit. De enige oplossing: debuggen. Zet de query, voordat je hem uitvoert, op het scherm. Bovenstaand levert dan op: ASP:
Op het scherm verschijnt nu: En de fout blijkt hier nu duidelijk uit. ActiveX component can't create object: 'Scripting.FileSystemObject'Bij veel hosts is het niet toegestaan om toegang te krijgen tot het FileSystem. Dat betekent dus dat je niet kunt lezen en/of schrijven naar de harddisk van je server. Jammer maar helaas, je zult of je host moeten mailen met de vraag of ze het voor je aan willen zetten of vragen of ze een andere oplossing voor je hebben.Zie ook dit topic. Overige foutmeldingenEen aantal overige foutmeldingen staat hier duidelijk beschreven. |
[ Voor 24% gewijzigd door NMe op 21-12-2019 18:07 ]
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.